El ganador (obviamente) es Dennis ♦, ¡quien usó Jelly con 10 bytes!
Este desafío seguirá estando aquí, sin embargo, los resultados ya no se tomarán.
El tren motriz de un número es un concepto de John Conway (que también es notable por hacer el Juego de la vida de Conway, pero ese no es el punto). Se define así:
Para cualquier número ..., el tren motriz del número es ... (es decir, cada 2do dígito, de izquierda a derecha, es una potencia del dígito anterior). Este proceso se repite hasta que el resultado sea un solo dígito.
EJEMPLOS
2592 => (2^5)(9^2) = 2592 <= Cannot be further decomposed
135 => (1^3)5 = 5
1234 => (1^2)(3^4) = 81 => (8^1) = 8
1100 => (1^1)(0^0) = 1 # (0^0) = 1
-42 => -42 # Negative numbers output the input
Su desafío es, para cualquier número n
en la entrada, regresar powertrain(n)
(es decir, n
después de que la descomposición del tren motriz haya finalizado) como salida.
Este es el código de golf, por lo que gana la menor cantidad de bytes.
DESCARGO DE RESPONSABILIDAD:
- Puede tener un número impar de dígitos en la entrada, el último dígito simplemente no tendrá potencia.
- 0 ^ 0 es 1, porque si fuera 0, muchos números colapsarían instantáneamente a 0 o 1.
- Si el número es indestructible en cualquier parte del proceso de cómputo (por ejemplo, si termina con
2592
), puede simplemente generar el número. - Si la entrada es
< 10
( es decir, todos los números de un solo dígito y negativos), envíe la entrada.
Probablemente anunciaré un ganador después de unas pocas horas días.
Tabla de clasificación actual:
- Gelatina ( Dennis ♦ ): 10
- Pyth ( DenkerAffe ): 16
- MATL ( Don Muesli ): 21
- Perl ( Ton Hospel ): 42
- Haskell ( Damien ): 64
- Javascript ES6 ( edc65 ): 71
- Mathematica ( murphy ): 74
- Mathematica ( LegionMammal978 ) y Haskell ( Renzeee ): 77
- Python 2 ( Mathmandan ): 111
- Python 3 ( Erwan ): 161
- Java 8 ( azul ): 229
- Oracle SQL 11.2 ( Jeto ): 456
- Befunge '93 ( Lex ): 490
1100
y-42
es fácil pasar por alto las reglas sobre casos extremos si no se muestran en los casos de prueba.Respuestas:
Jalea,
15141210 bytesPruébalo en línea!
Cómo funciona
fuente
n
tiempos, pero no tengo una prueba de que funcione para todas las entradas posibles.D*2/Pµ¡
Haskell,
6764 bytes(>> = (==)) >> = hasta que $ p.show es una función sin nombre que toma un entero como entrada y devuelve su tren motriz.
Guardado 3 bytes gracias a Zgarb
fuente
((==)=<<g)
ahorra dos bytes más(\n->g n==n)
.(>>=(==))>>=
realmente se parece a un tren!Perl, 42
48bytesIncluye +2 para
-lp
(también puedes descartarlo-l
pero me gustan las líneas nuevas)Ejecutar con entrada en STDIN, p. Ej.
powertrain.pl
:(en perls anteriores también puede soltar el espacio entre la expresión regular y hasta)
Esto no podrá manejar el punto fijo,
24547284284866560000000000
pero un valor tan grande no funcionará de todos modos porque en ese momento Perl cambió a notación exponencial.De hecho, la versión anterior funcionará rápidamente (en la mayoría de los
2592
bucles) para todos los números que Perl puede representar sin usar la notación exponencial, ya que está comprobado que no hay puntos fijos entre2592
y24547284284866560000000000
( https://oeis.org/A135385 )Sin embargo, esto supone algo aún no probado. En principio, podría haber una reducción que lleva más de
X=10^7
pasos (se conjetura que ningún punto no fijo toma más de 16 pasos, https://oeis.org/A133503 ) cuyo valor cae por debajoX
(pero arriba10^7
) y luego sube otra vez. Si ese es el caso, debo recurrir a:Explicación
El código funciona poniendo
**
y*
(alternando) entre los dígitosasí se
2592
vuelve2**5*9**2
y se12345
vuelve1**2*3**4*5
. Estas son expresiones perl válidas que se pueden evaluar con(
0**0
está1
en perl). Luego, simplemente ponga un bucle alrededor de eso con un contador que haga que caduque. Dado que a excepción de los puntos fijos, los valores bajan extremadamente rápido, la serie del tren motriz converge antes de que el contador tenga la oportunidad de comenzar realmentefuente
Pyth,
25181116 bytesPruébalo aquí!
714 bytes guardados con la ayuda de @JakubeExplicación
fuente
Python 2, 111 bytes
La idea es hacer una cadena donde los dígitos de
n
estén separados por operaciones que alternan entre*
y**
, y luegoeval
esa cadena. (Otras soluciones utilizan esta misma idea; ver, por ejemplo, la respuesta Perl de Ton Hospel ).Entonces, la operación cambia de ida y vuelta entre
'**'[0:]
, que es**
, y'**'[-1:]
, que es justo*
.Sin embargo, al final del
for
bucle, la cadena termina con una operación (una u otra), por lo que debemos eliminar la última operación o agregar otro dígito para que la cadena tenga sentido.Afortunadamente, agregar un
1
al final funcionará sin importar qué operación sea la última. (Si lo desea,1
es una identidad unilateral desde la derecha, tanto para la multiplicación como para la exponenciación. Otra forma de decir esto espowertrain(n) == powertrain(10*n + 1)
para todosn>0
).Finalmente, si el resultado del resultado
eval
es el mismo que el de la entrada (como en un1
ciclo de longitud ), la función termina. De lo contrario, la función se llama a sí misma en el resultado. (Se suspenderá para siempre en cualquier ciclo de duración> 1
, pero de acuerdo con los comentarios del OP, puedo suponer que no existen tales ciclos).(Nota: la explicación anterior funciona para los números enteros positivos de un solo dígito, ya una entrada de un dígito
n
se completará an**1
lo que se traducirá en un1
-Ciclo Sin embargo, también tenemos que aceptar la entrada no positivo, por lo que hay una condición en la. comenzando esos cortocircuitos si la entrada es menor que1
. Podríamos eliminar esa línea y ahorrar 17 bytes, si se garantizara que la entrada no es negativa).fuente
Java 8,
265244229 bytesEsta es mi primera respuesta, pero he estado leyendo este sitio por un tiempo y creo que sé lo que estoy haciendo. Al menos supera a befunge y SQL ...
Desafortunadamente, al igual que otras respuestas, esta no funciona para 24547284284866560000000000 debido a las restricciones incorporadas de java'a sobre qué tan grandes pueden ser los enteros.
Guardado 36 bytes gracias a @JackAmmo
Explicación sin golf
fuente
if(n<10)return n;else{...}
el else es innecesario ya que lógicamente todo en ese bloque else solo se ejecutaría de todos modos cuando n <10 es falso. Al eliminar el else y las 2 llaves coincidentes, se ahorrarán 6 bytes. Hay una situación similar con su último si ... de lo contrario,if(n==t)return n;else return p(t);
elimine el else y el espacio después para guardar otros 5 bytes. De hecho, puedes acortarlo aún más si usas el operador triádico en lugar del si ... si no, asíreturn n==t?n:p(t);
int t=i=1,s=(int)Math.log10(n)+1,r[]=new int[s];for(;i<=s;){...}for(i=0;...)...
JavaScript (ES6) 71
Una función recursiva, que se detiene cuando se encuentra una repetición. Esto no podría funcionar para bucles más largos (2 o más valores repetidos) pero parece que esto no podría suceder, al menos en el rango limitado de precisión del número de JavaScript (17 dígitos)
Prueba
fuente
+'1'
¡Qué bueno es matar dos pájaros de un tiro!replace
fue 1 byte más:f=n=>`${n}1`.replace(/../g,([x,y])=>r*=Math.pow(x,y),r=1)&&n-r?f(r):n
Mathematica, 77 bytes
Función anónima. No muy complicado
fuente
Befunge
720490 bytesNo pude resistirme a hacer uno más después de lo de Nunca me digas las probabilidades . Entonces, he optimizado el "ASCII-fier" del anterior. En este caso, no vi la necesidad de dejar que el puntero de la instrucción recorriera los dígitos para leerlos, por lo que no he hecho el esfuerzo de hacerlos legibles para los humanos. Entonces es más un digitalizador, ahora.
Nuevamente, si quieren una explicación, háganmelo saber en los comentarios, intentaré crear algunas descripciones útiles. Puede copiar y pegar el código en el intérprete . Descubrí que el ejemplo 24547284284866560000000000 genera 0, pero eso parece ser un problema para obtener un valor tan grande de un punto en la cuadrícula, ya que puede ver claramente el valor correcto almacenado en los pasos finales.
Esta versión también admite entrada negativa. Es una gran mejora en la versión anterior, si lo digo yo mismo. Se corrigió al menos 1 error y el tamaño se redujo considerablemente.
fuente
Haskell,
1007977 bytesNo golfizado:
Esta función divide la entrada en dígitos y realiza el truco a través de
i
.EDITAR: Gracias a nimi por algunos consejos.
fuente
i(a:[])=a
esi[a]=a
, b) no es necesariomax 1
, porque0^0 = 1
en Haskell, c) reemplazar(:[])
conpure
, d) mover ellet
interiorg
a una función separada y reemplazarif ... then ... else
con guardias:h=i.map(read.pure).show ; g x|x==h x=x|1<2=h x
pure
no está en Prelude, pero el resto de los consejos funcionan, gracias. Estaba tratando de hacerlo con los guardias, pero terminé usando;
antes que el guardia y eso no funcionó, pero ahora sé cómo debería funcionar.pure
está en el Preludio que viene con base-4.8.2.0. No sé cuándo fue presentado. No es necesario el( )
eni([a])=a
.Mathematica, 74 bytes
Explicación
Esta solución utiliza una función auxiliar
f
, que toma los dígitos del número como argumentos y aplica una iteración de la operación del tren de fuerza. La última línea es una función pura diseñada para explotar laReplaceRepeated
función (o//.
para abreviar), que aplica una regla a una expresión (en este caso, el argumento#
de la función pura) hasta que ya no cambie. La reglai_/;i>0:>f@@IntegerDigits@i
reemplaza cualquier cosa no negativa con la funciónf
aplicada a sus dígitos decimales.fuente
:=
)SetDelayed::write: Tag Times in n f[a_,b_,c___] is Protected. >>
,Set::write: Tag Times in 1 f[n_] is Protected. >>
El segundo error desaparece cuando se utiliza:=
vs=
.;
s en lugar de los saltos de línea:0~f~0=f[]=1;f@n_=n;f[a_,b_,c___]:=f[c]a^b;#//.i_/;i>0:>f@@IntegerDigits@i&
MATL , 21 bytes
Puede tomar unos segundos para producir la salida.
EDITAR (30 de julio de 2016): el código vinculado se reemplaza
9L
por1L
para adaptarse a los cambios recientes en el idioma.Pruébalo en línea!
Utiliza los siguientes dos trucos para reducir el recuento de bytes a expensas de la eficiencia del código:
n
tiempos en lugar de esperar hasta que se encuentre un ciclo. Esto es aceptable según los comentarios de OP.1
, se debe agregar una final para completar la operación de potencia final. En lugar de eso, el número agregado1
es el número de dígitos. Esto garantiza un número par, por lo que todas las operaciones de energía pueden realizarse (incluso si las últimas son1^1
operaciones innecesarias ).Código:
fuente
a, b, a, b
ad infinitum (más de un término). Si se repite un término, debe generar ese número. Lo siento si eso no fue realmente claro.2592
la entrada, no parece producir nada durante bastante tiempo.Python 3,
169161 bytesSin oro
Resultados
fuente
;
las separa con una de esta manera le ahorra espacios en blanco. También puede colocar el cuerpo del bucle for en esa misma línea.def f(s,o=[['1',s]["-"in s]],n=int):
while s not in o:
o+=[s];s+=1*(len(s)%2<1);r=1
for i,j in zip(s[::2],s[1::2]):r*=n(i)**n(j)
s=str(r)
return o[-1]
o=[['1',s]["-"in s]]
en el argumento predeterminado no funciona para mí, genera un error `s no definido`Oracle SQL 11.2, 456 bytes
Sin golf
v es una vista recursiva, los parámetros son
n: número para dividir en partes de 2 dígitos
c: número de piezas de 2 dígitos
i: parte actual de 2 dígitos para calcular
f: cadena que concatena las potencias con * como separador
t: evaluación de f
Los DECODE cambian al siguiente número para dividir y calcular cuando se completan todas las partes del número actual.
XMLTABLE (f) toma una expresión y la evalúa, colocando el resultado en la pseudo columna "column_value". Es la versión de golf de http://tkyte.blogspot.fr/2010/04/evaluating-expression-like-calculator.html
CYCLE es la detección del ciclo de construcción oracle y se utiliza como condición de salida.
Como el resultado para: 1 <10 es: 1 yv no devuelve ninguna fila para esos casos, SUM fuerza una fila con NULL como valor. NVL devuelve: 1 como resultado si la fila es nula.
fuente