Juego de Números Anexos
Escriba una función / programa que tome 2 parámetros enteros parámetros enteros o variables enteras , un número de inicio y un recuento máximo de iteraciones. El código debe realizar el siguiente ejemplo de juego para construir un nuevo número y repetirlo hasta que quede un solo dígito. p.ej.
3 7 2 = (3 + 7) & (7 + 2) = 10 9
1 0 9 = (1 + 0) & (0 + 9) = 1 9
1 9 = (1 + 9) = 10
1 0 = (1 + 0) = 1
Básicamente, tomar cada dígito individual y agregarlo a su vecino, y luego agregar el resultado de la próxima adición también.
El recuento máximo de iteraciones es para proteger bucles infinitos, y cuando se alcanza el máximo, el código debe volcar los últimos 5 pasos numéricos. Debe producirse la misma salida al finalizar al alcanzar un solo dígito. Si ocurrieron menos de 5 pasos, solo envíe los números válidos.
La salida debería aparecer como ( Step: Number
) incluyendo los últimos 5 pasos de los pasos terminados o terminados:
func(3541, 50)
produciría este formato de salida exacto:
6: 1411
7: 552
8: 107
9: 17
10: 8
func(3541, 5)
produciría:
1: 895
2: 1714
3: 885
4: 1613
5: 774
Todo el cálculo es:
1: 895
2: 1714
3: 885
4: 1613
5: 774
6: 1411
7: 552
8: 107
9: 17
10: 8
Si hay menos de 5 pasos, simplemente imprima los pasos dados.
Solo use bibliotecas incorporadas, los parámetros pueden ser desde cualquier lugar (lo que sea más fácil para el idioma que elija). No hay límite en el tamaño entero máximo, y si hay desbordamientos, déjelo bloquearse.
Dado que esto no es demasiado difícil desde el punto de vista del rompecabezas, daré hasta el domingo 25 a las 8 p.m. (UTC + 8) para que las propuestas sean consideradas para la respuesta aceptada, en cuyo punto el más corto de cualquier idioma será el ganador.
EDITAR:
Felicitaciones a Howard, que ganó con una respuesta de 48 GolfScript .
Mención especial al 2do lugar marinus con una respuesta de 66 APL .
Mi favorito personal (sesgado hacia JavaScript) fue la respuesta de core1024 .
func(3541, 5)
supone que imprima 5 pasos o 10?Respuestas:
GolfScript,
4846 caracteresGracias a Peter Taylor por una mejora de dos personajes.
Espera ambos números en la pila. Pruebe en línea .
Ejemplos:
fuente
.,,
y convertir el mapa final en justo{': '*}%
.APL (66)
El argumento izquierdo es el recuento máximo de iteraciones y el argumento derecho es el número de inicio.
Explicación:
∆←⍺{
...}⍕⍵
: pase el argumento izquierdo como un número y el argumento derecho como una cadena a la función que calcula la lista de números, y guárdelo en∆
:(1<⍴⍵)∧⍺>0:
: si la cantidad de dígitos es mayor que 1 y la cantidad de iteraciones restantes es mayor que0
:⍎¨⍵
: evaluar cada dígito2+/
: suma cada par⍕¨
: formatea cada número como una cadena∆←,/
: concatenar las cadenas y almacenar en∆
∆,(⍺-1)∇⊃∆
: return∆
, seguido del resultado de aplicar esta función a∆
con una iteración menos permitida⋄⍬
: si no, devuelve la lista vacía∆,⍪⍳⍴∆
: emparejar cada elemento de∆
con su índice en∆
{
...}/
: para cada par:(⍕⍵),': ',⍺
: devuelve una cadena con el índice, seguido de:
, seguido del número↑¯5↑
: convierte la lista de cadenas en una matriz para que se muestren en líneas separadas y tome los últimos 5 elementosPrueba:
fuente
3 {...} 3541
.:
primero)Mathematica, 172 caracteres
Esto es demasiado largo, gracias a los nombres de funciones de Mathematica y al manejo feo de cadenas (el "juego" real es solo 76 de esos caracteres), pero aquí está de todos modos:
Espera el número de entrada en variable
n
y el número máximo de iteraciones enm
.Con menos golf:
fuente
Ruby, 106 caracteres
No estoy 100% claro sobre las reglas de entrada, pero si puedo tomar
n
como una cadena puedo guardar 5 caracteres, y si puedo usar variables predefinidas y escribir un programa en lugar de una función, puedo guardar otros 9.Crea una función
f
que se puede llamar de la siguiente manera:f[3541, 6]
f[372, 50]
f[9999, 10]
fuente
J -
9692 charPrimero resolví esto asumiendo que todos los juegos terminaron, y esto volvió a morderme el culo durante las pruebas. El argumento izquierdo es el número de pasos, el argumento derecho es la posición inicial, que se puede dar como un número o una cadena.
Esto es demasiado complicado y complicado para degolfar satisfactoriamente, así que diré esto:
(<@>:@[(' '-.~[:,@":2+/\"."0@]^:)":)
Esta parte ejecuta el juego durante el número especificado de pasos.2+/\
es responsable de agregar cada par de dígitos, y<@>:@[
en conjunto con los^:
controles que capturan los pasos intermedios del juego.(#\(,': '&,)&":"0,)@}.@({.~,i.0:)@:".
Esta parte formatea todos los resultados comostep: result
.({.~,i.0:)
es asegurarse de que no damos demasiados pasos,#\
son los números de paso y el(,': '&,)&":"0
bit agrega los dos puntos y el espacio.(-@(<.5<.#){.])
Esta porción elimina los cinco o menos pasos relevantes de la lista completa.<.
significa 'mínimo de'.Funciona, pero si comienzas con un número lo suficientemente grande, los resultados del juego comienzan a crecer rápidamente, lo que hace que J cambie de enteros a dobles imprecisos. Aquí hay unos ejemplos:
fuente
Javascript 139
144 150Sin golf
fuente
Perl,
8684Con nuevas líneas de legibilidad:
+ Editar: No hay excusa para no usar el
-n
interruptor de línea de comando, y luego la puntuación es 82 = 81 + 1 :Y, si el posible desbordamiento de enteros es correcto, es 81 = 80 + 1
fuente
Javascript, 247
278288307CaracteresFormateado
Edición 1 : eliminado ternario
Edición 2 : lógica invertida para "omitir" el índice 0
Edición 3 : llamadas recursivas reelaboradas.
Violín
fuente
Bash + coreutils, 115 bytes
Salida:
fuente
JavaScript (borrador de ECMAScript 6) - 134 caracteres
Ejemplos:
fuente
Javascript, 182 bytes
fuente
Perl,
166147138129 bytesSin golf:
Espero que esté bien que imprima algunas líneas vacías adicionales si todo toma menos de 5 pasos.
fuente
(('')x5, @o, "$i: $s")
con(@o, "$i: $s")
yjoin"\n", @o[-5..0]
conjoin"\n", @o[-5..-1]
. Entonces estarás 3 bytes por delante;)Java
524405365 caracteres [414 bytes]Versión de golf:
class A{static int n=0;List<String> s=new ArrayList<>();void c(int b,int r){String d=b+"";if(r==0||b <= 9){int m=s.size();for(int i= m>=5?m-5:0;i<m;i++)System.out.println(s.get(i));return;}String l="";for(int i=0;i<d.length()-1;i++)l+=d.charAt(i)+d.charAt(i+1)-96;s.add(++n+":"+l);c(Integer.valueOf(l),--r);}public static void main(String[] a){new A().c(3541,50);}}
Versión legible:
fuente
chatAt
métodoInteger.valueOf(digits[i] + "") + Integer.valueOf(digits[i + 1] + "");
su lugar podrías hacerlo(digits[i] + digits[i+1] - 96)
JavaScript 133 bytes
Sin golf:
fuente
Java, 341 caracteres
371 caracteresFormateado:
Gracias al usuario 902383 pude reducir el código en 30 caracteres, al no dividir la cadena en una matriz y usar -96 en lugar de "Integer.valueOf ()
fuente
class a{public static void main(String[] a) {p(3541, 50);}static void p(int n,int k){Queue<String> q=new LinkedList();int c=0;while(n>9&&c<k){c++;String r="";String p=""+n;for(int i=0;i<p.length()-1;i++)r+=((p.charAt(i)+p.charAt(i+1)-96));n=Integer.parseInt(r);q.add(c+": "+n);if(q.size()>5)q.remove();}for(String s:q){System.out.println(s);}}}
Dart,
602588 bytesDart es probablemente uno de los peores idiomas para hacer esto ... Necesito encontrar una mejor manera de hacerlo.
De todos modos, aquí está mi entrada:
Entrada a través de la consola
Y la versión ungolfed, unminminified:
fuente
PERL
135 129/125125/121 bytesTiene el mismo error que la respuesta de Tal
Edite 129 bytes como una función:125 bytes como una función:125 bytes como un script de consola (sin el hashbang):121 bytes como un script de consola (sin el hashbang):
Expandido:
Prueba con
c(372,4);
:Prueba con
c(3541,50);
:fuente
C # - 269
Legible:
Uso:
Salida:
fuente
Cobra - 363
Un resultado bastante deprimente ... pero bueno, todavía vencí a Java.
Se debe ser inmune a desbordamientos de enteros para casos de pruebas prácticas.
fuente
Python 2.7,
174173158 caracteresUsando muchas cadenas para hacer la tarea.
Python 2.7, 155 caracteres
Versión que define una función
Versión ligeramente no golfista:
fuente
Haskell, 154
ejemplo de uso:
Para hacerlo más legible, use
putStr
:fuente
putStr $ 3541#50
compararlo con el ejemplo del OP. De lo contrario, me alegra que haya un chico Haskell aquí.Maravilloso -
191182 caracteresBasado en la solución de Thomas Rüping , portada a Groovy 2.2.1:
Ejecución y salida:
Sin golf:
fuente
** C
186179174 **Ligeramente menos golfizado (¿mini golf?)
Simplemente asigne suficiente memoria para almacenar cinco resultados cíclicamente. El bucle externo continúa hasta que alcanzamos el límite o alcanzamos un solo dígito. El bucle interno agrega el último dígito del número al último dígito de 1/10 del número y agrega esto, multiplicado por la potencia relevante de 10 al resultado. Divida el número que pensó primero por 10 y repita para obtener el total. Luego imprima hasta los últimos cinco resultados.
El próximo desafío es ver si puedo reducir lo suficiente como para superar algunos lenguajes de scripting en el golf.
Editar: ahora se compila con advertencia, pero se eliminan cinco caracteres al eliminar la declaración "nula"
fuente
C # -
309330320306 BytesVersión de golf:
Uso: F (3541,50);
Versión sin golf para facilitar la lectura:
¡Las sugerencias de mejora son siempre bienvenidas! ;)
Editar: Se eliminó String.Empty y se reemplazó con "" para guardar 10 Bytes.
Edición 2: ¡ Gracias a malik por el consejo con las cuerdas!
fuente
.ToCharArray()
. A string = char array.ToString()
hacerlo+""