Dado que los números y secuencias de Fibonacci parecen ser un tema popular para el golf de código, pensé que podría ser un desafío divertido codificar el golf con números de Keith .
Por lo tanto, propongo un desafío que consiste en crear una función que tome un número entero y devuelva un verdadero o falso dependiendo de si el número es un número Keith o no.
Más sobre los números de Keith
En matemáticas recreativas, un número de Keith o número de réfigit (abreviatura de dígito repetitivo similar a Fibonacci) es un número en la siguiente secuencia entera: 14, 19, 28, 47, 61, 75, 197, 742, 1104, 1537, 2208, 2580, ...
Numberphile tiene un video que explica cómo calcular un número de Keith. Pero básicamente tomas los dígitos de un número. Súmelos juntos y luego tome los últimos dígitos del número original y agréguelos a la suma del cálculo, enjuague y repita. Y ejemplo para dejarlo claro.
14
1 + 4 = 5
4 + 5 = 9
5 + 9 = 14
Entrada
Un entero
Salida
Verdadero si el número es un número Keith. Falso si no es ..
true
/false
o puede ser algo verdadero / falso ?Respuestas:
GolfScript (
3125 caracteres)Ingrese como un entero en la parte superior de la pila. La salida es 0 (falso) o 1 (verdadero). Demostración en línea que enumera los números Keith hasta 100.
fuente
0>
. Lamentablemente, puedo hacer +1 solo una vez.Pitón (
7875)n=n[1:]+[sum(n)]
hace toda la magia Toma todos los elementos, excepto el primer elemento den
, se pega en la suma den
(con el primer elemento), luego lo establece enn
.Desearía que pudieras llamar
list
a un número entero y separar los dígitos.Devuelve
False
todas las entradas por debajo de 10. Puede ser 8 caracteres más corto si devuelveTrue
.fuente
n[0]
lugar den[-1]
.print 9<a==n[0]
.n=n[1:]+[sum(n)]
puede convertirsen=n[1:]+sum(n),
GolfScript,
3229 caracteresUna implementación de GolfScript que se puede probar en línea . La entrada se da como elemento superior en la pila y devuelve 0 (es decir, falso) o 1 respectivamente.
fuente
APL,
36343936332927Salida
1
si Keith, de lo0
contrario¡GolfScript ataca de nuevo!
Editar
Uso de reducción a la derecha (
⊢/
) en lugar de Take menos 1 (¯1↑
), guarda directamente 1 carácter e indirectamente salva 1 de Disclose (⊃
)Explicación
⍎¨⍕x←⎕
toma la entrada evaluada (tratada como un número) y la asigna ax
. Lo convierte en una matriz de caracteres (también conocido como "cadena" en otros idiomas) y recorre cada carácter (dígito), convirtiéndolo en un número. Entonces esto resulta en una matriz numérica de los dígitos.{(∇⍣(x>⊢/⍵))⍵,+/⍵↑⍨-⍴⍕x}
es la función principal de "bucle":+/⍵↑⍨-⍴⍕x
toma los últimos números⍴⍕x
(no. de dígitosx
) de la matriz y los suma.⍵,
lo concatena al final de la matriz.(x>⊢/⍵)
compruebe si el último número en la matriz (que aún no se ha+/⍵↑⍨-⍴⍕x
concatenado) es menorx
y devuelve1
o0
∇⍣
ejecuta esta función en la nueva matriz muchas veces. Entonces, si el último número es menor quex
, esta función se repite. De lo contrario, solo devuelva la nueva matrizDespués de ejecutar la función, la matriz contiene las sumas hasta el punto en que 2 de los números son mayores o iguales que
x
(por ejemplo14
, generará1 4 5 9 14 23
,13
generará1 3 4 7 11 18 29
)Finalmente, compruebe si cada número es igual
x
y genera la suma del binario resultante formación.Editar
Se agregaron 2 caracteres :-( para hacer la salida
0
si la entrada es de un dígitoOtra edición más
Explicación
La función ahora elimina el primer número (
1↓
) de la matriz en lugar de tomar el último⍴⍕x
(↑⍨-⍴⍕x
).Sin embargo, este enfoque
1=
no es adecuado para manejar números de un solo dígito. Por lo tanto, ahora suelta el último número de la matriz antes de verificar la igualdadx
, agregando 1 carácterLo has adivinado: EDITAR
Se compara
x
con el elemento recién agregado en lugar del último elemento anterior, por lo quex
es suficiente colocar el primer elemento (en lugar del último) antes de verificar la igualdad , guardando un signo menos. Guarda otros 3 utilizando otra forma del operador Power (⍣
)Y aparece una respuesta de 25 char gs (Orz)
Última edición
No puedo creer que me haya perdido eso.
No puedo jugar más al golf.
fuente
x∊{1↓⍵,+/⍵}⍣{x≤⊃⍺}⍎¨⍕x←⎕
. En la función de potencia,⍺
es el valor "después".Lisp común, 134
CL puede ser bastante ilegible a veces.
Algunos formatos para evitar el desplazamiento horizontal:
Prueba:
fuente
F # - 184 caracteres
Espero que esté bien que participe en mi propio desafío.
Editar Se corrigió un error relacionado con números pequeños.
fuente
K, 55
.
fuente
PowerShell:
12012812311111097$i=read-host
toma información del usuario, la almacena en $ i.$j=(
...)-split''|?{$_}
divide los dígitos de $ i en una matriz y lo almacena en $ j.While($x-lt$i)
establece el siguiente ciclo similar a Fibonnaci para que se ejecute hasta que la variable suma, $ x, alcance o exceda $ i.$x=0
pone a cero $ x, por lo que está listo para ser usado para sumar (necesario para cuando el ciclo vuelve).$j|%{$x+=$_}
usa un bucle ForEach-Object para sumar los valores de $ j a $ x.$null,$j=$j+$x
desplaza los valores en $ j a la izquierda, descartando el primero, mientras agrega $ x.$x-eq$i
después de que se completa el ciclo while, prueba si el valor de suma, $ x, es igual al valor inicial, $ i, generalmente indicativo de un número Keith.-and$x-gt9
invalida números de un solo dígito, cero y números negativos, que no pueden ser números Keith.Este script es un poco "desordenado". Puede manejar con gracia $ i y $ j sobrantes, pero deberá borrar $ x entre ejecuciones.
fuente
-ne''
para que sea justo?{$_}
.$i=read-host;$j=$i-split''|?{$_}'
con$j=($i=read-host)-split''|?{$_}
.Rubí, 82
El sospechoso Python es una mejor herramienta para este.
fuente
C, 123
prueba mediante arnés:
da:
fuente
i=(i+n-1)%n;t=g[i];g[i]=s;s=s*2-t;
coni+=n-1;t=g[i%n];g[i%n]=s;s+=s-t;
y guardar dos caracteres.R, 116
Estafa de Python:
fuente
Perl, 90
Un ejercicio divertido! ¡Sé que es una publicación antigua pero noté que faltaba Perl!
Estoy seguro de que puedo mejorar la forma en que construyo esto al digerir las otras respuestas más a fondo, ¡así que probablemente vuelva a visitar esto!
fuente
Smalltalk - 136 char
Enviar este bloque
value:
fuente
Java - 1437
fuente
Python3 104
Y es una función;)
fuente
Python - 116 caracteres
No soy realmente un experto en codegolf, así que ahí lo tienes, mi primer intento.
Realice 2 cambios para una función:
print
areturn
x
para ser el parámetroPD I second @ beary605- agregue un incorporado para separar los dígitos / caracteres / lo que sea.
fuente
Rubí (con POO)
fuente