Secuencia de Kuznetsov
(I made the name up, don't bother with Wikipedia or Google)
Dado cualquier número n > 0
, vamos a r
representar el reverso del número n
. Itere hasta que el resultado final sea cero, transfiriendo el resultado de cada iteración a la función utilizando la recursión o una metodología de su elección al realizar la siguiente operación:
- Si
r > n
para esa iteración el resultado esr % n
. - Si
n > r
para esa iteración el resultado esn % r
. - Si
n % r = 0
or % n = 0
, termina la iteración.
Tome el resultado intermedio de cada ejecución y guárdelos en una matriz para la respuesta final. El número inicial n
no es parte de la secuencia, ni lo es 0
; Los ejemplos deberían hacer que todo sea un poco más obvio.
Veamos un ejemplo donde n=32452345
.
54325423 % 32452345 = 21873078 # r > n, uses r % n
87037812 % 21873078 = 21418578 # r > n, uses r % n
87581412 % 21418578 = 1907100 # r > n, uses r % n
1907100 % 17091 = 9999 # n > r, uses n % r
9999 % 9999 = 0 # r % n = n % r = 0, terminated
Result: [21873078, 21418578, 1907100, 9999]
Otro ejemplo n=12345678
:
87654321 % 12345678 = 1234575 # r > n, uses r % n
5754321 % 1234575 = 816021 # r > n, uses r % n
816021 % 120618 = 92313 # n > r, uses n % r
92313 % 31329 = 29655 # n > r, uses n % r
55692 % 29655 = 26037 # r > n, uses r % n
73062 % 26037 = 20988 # r > n, uses r % n
88902 % 20988 = 4950 # r > n, uses r % n
4950 % 594 = 198 # n > r, uses n % r
891 % 198 = 99 # r > n, uses r % n
99 % 99 = 0 # r % n = n % r = 0, terminated
Result: [1234575, 816021, 92313, 29655, 26037, 20988, 4950, 198, 99]
Un último ejemplo n=11000
:
11000 % 11 = 0 # n % r = 0, terminated
Result: []
Este es el código de golf más bajo de conteo de bytes gana.
Respuestas:
05AB1E , 11 bytes
Utiliza la codificación CP-1252 . Pruébalo en línea!
fuente
PowerShell v2 +, 89 bytes
Solución iterativa. Largo porque no hay una manera fácil de revertir una matriz, por lo que la encadenamos y la indexamos hacia atrás para almacenarla
$r
. Luego, un pseudoternario para extraer el módulo apropiado y volver a almacenarlo$n
para la siguiente ronda. Sin embargo, si el resultado es cero, eso significa!($n...)
que será$true
, así que enexit
lugar de$n
. Los números se dejan en la tubería y (implícitamente) se devuelven como una matriz, pero sin una tubería encapsulada o guardando los resultados en una variable, el valor predeterminadoWrite-Output
fija una nueva línea entre ellos.Pruébalo en línea! (Sí, muy en serio.) ¡
PowerShell ahora está en TIO! Hay que darle un segundo o dos, porque PowerShell es una bestia de inicio, pero ahora, si usted , puede verificar el código de PowerShell directamente en su navegador!
fuente
Perl,
4338 + 1 = 39 bytesCorre con la
-n
banderaPruébalo en línea! Incluye los dos ejemplos no vacíos.
Tabla de explicaciones
-n
: Envuelve todo el programa enwhile(<>){ ... ;}
. Esto convierte el código anterior en la siguiente línea:while(<>){say while$_=($;=reverse)>$_?$;%$_:$_%$;}
. Observe que se ha agregado un punto y coma al final$
, por lo que ahora se convierte en una instancia de la variable$;
. En la condición de unwhile
bucle,<>
lee automáticamente una línea de entrada y la guarda en la$_
variable. Así que ahora veamos qué lee el intérprete dentro delwhile
bucle externo :Código original, guardado para la posteridad: 43 + 1 = 44 bytes
fuente
$%>$_?$%%$_:$_%$%
¿Elegiste la$%
variable a propósito solo para esta línea?Pyth,
1312 bytesGracias a @TheBikingViking.
Pruébelo en línea: demostración
Mi antiguo código
Pruébelo en línea: demostración
Explicación:
fuente
t.u|%F_S,s_<backtick>
. PruebaJalea ,
15 1413 bytesTryItOnline
¿Cómo?
fuente
Jalea ,
1312 bytesEste es un enlace / función monádico que se imprime en STDOUT.
Pruébalo en línea!
Cómo funciona
fuente
Python 2,
9287817361 bytesSolución recursiva:
Pruébalo en línea
Solución iterativa: (también 61 bytes )
Pruébalo en línea
fuente
while n:
. De lo contrario, puede hacerlo con 61 bytes .MATL , 16 bytes
Pruébalo en línea!
Explicación
fuente
PHP, 78 bytes
fuente
Lote, 140 bytes
Toma entrada en STDIN y emite la secuencia en líneas separadas. Batch tiene declaraciones condicionales (que son algo detalladas) pero no tiene expresiones condicionales, por lo que es más fácil (a pesar de tener que citar las
%
s) para calcularr%n%r
(que es igual ar%n
ifn<r
o zero ifn>r
) yn%r%n
(que es igual an%r
ifn>r
o zero ifn<r
) y agrega ellos juntos.fuente
Mathematica, 68 bytes
Gracias a Greg Martin por sugerir que use
FixedPointList
lugar deNestWhileList
:El más corto con el que pude obtener mi solución original
FixedPointList
fue de 73 bytes:fuente
11000
). Puede solucionar esto cambiando a la técnica descrita en su último párrafo. Pero no veo cómo deshacermeRest
oMost
de esta manera. Por otro lado,FixedPointList[ Mod[(r = IntegerReverse@#)~Max~#, r~Min~#] &, #][[2 ;; -4]] &
son solo 68 bytes una vez que se eliminan los espacios (arroja un par de errores, nbd).{a,b,c,d}[[2;;-4]]
darían un error en lugar de la lista vacía (probablemente usé una coma en lugar de;;
). Aprendí algo.Sort
:FixedPointList[-Mod@@Sort@-{#,IntegerReverse@#}&,#][[2;;-4]]&
JavaScript,
7270 bytesEditado:
-2 bytes : el operador extendido espera la concatenación de cadenas.
fuente
R,
126117bytesLamentablemente, invertir un número (
as.double(paste(rev(el(strsplit(c(x,""),""))),collapse="")))
) es bastante prolijo. Descansar es bastante fácil. Utilizasort
para verificar indirectamente cuál es mayor.El resto es sencillo, sigue en bucle hasta
x=0
e imprime todos los pasos.fuente
C, 87 bytes
t
Es temporal para revertir. El bucle interno cambiar
1 dígito a la izquierda y agrega el último dígitot
hasta que se agota. La salida es posterior a la primera iteración y solo si no es cero para evitar que se muestren el primer y el último elemento.Sin golf y uso:
fuente
Mathematica, 64 bytes
El código anterior representa una función pura que toma una sola entrada y devuelve la secuencia kuznetsovs. Lo realmente hermoso de Mathica es que puedes poner capa sobre capa de funciones puras ... Permíteme explicarte el código;)
Cada término en la secuencia misma se calcula con la siguiente función, que toma una entrada y devuelve el siguiente término.
El código
IntegerReverse@#
solo genera r, el valor invertido. El código#2~If[#<=#2,Mod,#0]~#&
es una función que toma dos entradas y realiza la operación mod, o invierte las entradas y se llama a sí mismo nuevamente. Otra forma de escribirlo esIf[#<=#2, Mod, #0][#2, #]&
, o podría escribirse como una función regular como esta:k[a_, b_] := If[a <= b, Mod, k][b, a]
fuente
Raqueta 180 bytes
Sin golf:
Pruebas:
Ouput:
fuente