Primes en diferentes bases

17

Desafío:

Se le da un número de base 10. Para cada base desde 10 contando hasta la base 2:

  1. Tome el número de entrada original como una cadena de base 10 y elimine los dígitos del número que no sean válidos para la base.
  2. Interprete la cadena numérica resultante en esa base. Si esto da 1 o 0, finalice todo el proceso.
  3. Imprima o imprima su factor primo más grande, como número decimal.

La salida puede ser una matriz de los principales factores primos.

Casos de muestra:

Entrada:

987654321

Salida:

379721
10593529
1091
179
1493
293
19
7

Alternativamente:

[379721,10593529,1091,179,1493,293,19,7]

Esto imprime los factores primos más grandes de 987654321, 87654321 9 = 42374116 10 , 7654321 8 = 2054353 10 , y así sucesivamente hasta llegar a 1 2 , donde se detiene.

poi830
fuente
2
No tengo claro el proceso. Probablemente podría resolverlo a partir del ejemplo, pero debe tener instrucciones claras para que esto no sea necesario. Entonces, ¿convertimos a una base más baja, eliminamos dígitos inválidos y luego imprimimos el factor primo más grande? ¿En qué base imprimimos este factor? ¿Luego hacemos el mismo proceso con el factor primo más grande y uno más bajo? ¿O lo hacemos con el número que factorizamos? ¿Comenzamos con 10 o 9?
xnor
Bienvenido al sitio!
DJMcMayhem
2
Intenté reescribir el desafío para hacerlo más claro. Espero que esto sea lo que pretendías. Si no, no dudes en cambiarlo.
xnor
44
Creo que el paso más grande del factor primo más bien agregado a la operación principal es la conversión de base. Muchos idiomas lo hacen directamente con una factorización integrada incorporada, y el resto básicamente tiene que hacer un segundo desafío por separado. La conversión de base también está incorporada o en busto. Cuando las operaciones vienen como incorporadas, se espera que sean terrenos bien pisados ​​para los campos de golf, y de hecho, la factorización y la conversión de bases lo son. Aún así, es bueno para un primer desafío, pero hay cosas a tener en cuenta para la próxima vez.
xnor
3
¿Hay alguna posibilidad de que esto haya sido inspirado por Google Code Jam?
Mego

Respuestas:

6

Pyth, 25 bytes

sfTm>1PiFdC,.u-N`tYKrT1zK
                       z   get input as a string
            .u      rT1    cumulative reduce over [10,9,...,2]
              -N`tY        remove one minus the number (10,9,...) from the input
          C,       K    K  pair each step along the chain with corresponding base
   m                       map over [["987654321", 10],...]:
       iFd                   apply the base-conversion (splat over i)
      P                      prime factorization, smallest to largest
    >1                       take [the last element], or [] if empty (1 or 0)
 fT                        remove the []s from 0s or 1s
s                          join the one-element arrays together

Pruébalo aquí

Pomo de la puerta
fuente
4

Pyth - 16 bytes

V_S9#ePi~-z`NhNB

Pruébelo en línea aquí .

A veces hay algunas líneas en blanco en las entradas sin todos los dígitos, déjame saber si eso es un problema.

Maltysen
fuente
4

MATL , 17 15 bytes

9:PQ"G@ZAYfXzX>

Esto toma el número como una cadena con comillas, que está permitido por defecto.

Pruébalo en línea!

Explicación

9:PQ     % Push array [10, 9, ..., 2]
"        % For each number in that array. These are the bases to be considered
  G      %   Push input. Forces for input to be taken implicitly first time
  @      %   Push current base
  ZA     %   Convert from that base to base 10, discarding non-valid digits
  Yf     %   Prime factors. Gives empty for input 1, and 0 for input 0
  Xz     %   Non-zero values. Gives empty if previous result was 0, or else
         %   leaves it as it was
  X>     %   Maximum of array. For empty input gives empty
         % Implicitly end for each
         % Implicitly display. Empty arrays are not displayed
Luis Mendo
fuente
Éste genera un 0 al final para las entradas que no terminan en 1.
poi830
Para las entradas '98765432' y '98765' (ejemplos aleatorios), genera los números correctos y luego 0 antes de terminar.
poi830
1
@ poi830 Resuelto ahora
Luis Mendo
1

Julia, 101 bytes

f(s,x=[],b=10)=(t=filter(c->c<=47+b,s))>"1"&&b>1?f(s,[x;maximum(keys(factor(parse(Int,t,b))))],b-1):x

Esta es una función recursiva que acepta la entrada como una cadena y devuelve una matriz.

Sin golf:

function f(s, x=[], b=10)
    # Filter the string down to only the digits valid for base b
    t = filter(c -> c <= 47 + b, s)

    # If the filtered string isn't "1" or "0" and b is a valid base
    if t > "1" && b > 1
        # Call the function again, appending the maximum prime factor
        # of t in base b to the argument x and decrementing the base
        f(s, [x; maximum(keys(factor(parse(Int, t, b))))], b-1)
    else
        # Otherwise return the array
        x
    end
end
Alex A.
fuente
1

Mathematica, 83 bytes

FactorInteger[Select[IntegerDigits@#,#<a&]~FromDigits~a][[-1,1]]~Table~{a,10,2,-1}&

Función anónima, devuelve una lista. No es tan complicado, para ser honesto.

LegionMammal978
fuente
0

Ruby, 120 bytes

Función recursiva, toma la entrada como una cadena.

f=->n,b=2{require'prime';i=n.tr([*b.to_s..?9].join,"").to_i(b)
b>10?[]:f[n,b+1]+[*i>1?Prime.prime_division(i).max[0]:p]}
Tinta de valor
fuente
1
Puede guardar algunos bytes utilizando el -rprimeindicador de línea de comando en lugar de require.
Pomo de la puerta
-rprimeno funciona para mí por alguna razón ...
Value Ink
0

Pyke, 19 bytes, sin competencia

(agregue la función splat_node)
DTAbPe
;1TtD=T`"":r

Pruébalo aquí!

Toma entrada entre comillas, sale con un error.

Explicación (nueva línea reemplazada por \ n):

D                    - Duplicate the first item on the stack (And get it from input first time)
 TAb                 - Convert input to base (whatever's in T, 10 default)
    Pe               - get the highest prime factor of the number
      \n;1           - print it out and get rid of it
          TtD=T      - T -= 1
               `"":  - input = input.replace(str(t), "")
                   r - GOTO start
Azul
fuente