Dilema del acuario
Un Disarium se define como un número cuyo:
la suma de sus dígitos alimentados con su posición respectiva es igual al número original
Su tarea :
Tienes una extraña obsesión con los números clasificados como un acuario. La necesidad de seguir los caminos del disarium es tan grande en usted que se niega a leer las páginas numeradas que no están en el acuario de cualquier libro. Tienes dos GRANDES problemas:
- Su profesor acaba de asignarle que lea su libro de texto de una página
n
a otram
- Te golpeaste la cabeza muy fuerte la semana pasada y parece que no puedes recordar cómo determinar mediante programación si un número se considera un acuario.
El tiempo es esencial, por lo que el código para determinar las páginas que necesitará leer debe ser lo más breve posible.
Debe identificar todo el disuario dentro de un rango inclusivo de n
hasta m
.
Ejemplos de un acuario :
89 = 8 1 + 9 2
135 = 1 1 + 3 2 + 5 3
518 = 5 1 + 1 2 + 8 3
Este es el código de golf, por lo que gana el menor número de bytes.
Aquí está la secuencia completa de A032799 .
n
ym
? Hay un gran acuario (12157692622039623539), ¿deberían las respuestas poder identificarlo?Respuestas:
Perl 6 ,
4039 bytesPruébalo en línea!
Cómo funciona
fuente
Python2,
98898884 bytesHorrible. Se acortará.Empieza a verse mejorAquí está mi intento recursivo (86 bytes):
¡Gracias a @Rod por guardar 4 bytes!
range
aenumerate
y así sucesivamente.fuente
enumerate
, puedes usarint(n)
en su lugarint(`x`[p])
Perl, 43 bytes
Pruébalo en línea!
Regex es realmente poderoso, muchachos.
Explicación
Lo primero que hace el código es leer dos enteros como entrada vía
<>
, y crea un rango del primero al segundo con..
. Luego usa lamap
función estándar para recorrer este rango y aplica el siguiente código a cada valor:say if$_==eval s/./+$&**$+[0]/gr
. Esto parece galimatías, y lo es, pero esto es lo que realmente está sucediendo.map
almacena implícitamente su valor actual en la variable$_
. Muchas funciones y operaciones de Perl usan este valor cuando no se da ninguna. Esto incluye expresiones regulares, como els///
operador de sustitución.Hay cuatro partes en una expresión regular de sustitución:
=~
se utiliza para aplicar una expresión regular a una cadena, pero si este operador está ausente, la expresión regular se aplica a la variable implícita$_
, que contiene nuestro número actual a través de lamap
función..
. En efecto, estamos capturando cada dígito individual.+
seguido de una expresión matemática, mezclada con algunas variables mágicas de Perl que hacen que todo sea mucho más fácil.La variable escalar especial
$&
siempre contiene la totalidad de la última captura de expresiones regulares exitosa, que en este caso es un solo dígito. La variable de matriz especial@+
siempre contiene una lista de compensaciones posteriores a la coincidencia para la última coincidencia exitosa, es decir, el índice del texto después de la coincidencia.$+[0]
es el índice$_
del texto que sigue inmediatamente$&
. En el caso de135
, capturamos el dígito1
y el índice en135
del texto inmediatamente después (es decir,35
) es 1, que es nuestro exponente. Entonces, queremos elevar$&
(1) a la potencia de$+[0]
(1) y obtener 1. Queremos elevar 3 a la potencia de 2 y obtener 9. Queremos elevar 5 a la potencia de 3 y obtener 125.Si la entrada fue
135
, la cadena resultante es+1**1+3**2+5**3
./g
y/r
./g
le dice al intérprete que continúe con los reemplazos después de encontrar el primero (de lo contrario, terminaríamos con+1**135
)./r
le dice al intérprete que no modifique la cadena original y, en su lugar, devuelva cuál sería la cadena después de los reemplazos. Esto es importante, porque de lo contrario, se sobrescribiría$_
, y lo necesitamos para fines de comparación.Una vez que se realiza la sustitución completa, obtenemos una expresión matemática, que se evalúa con la
eval
función.+1**1+3**2+5**3
se evalúa en1 + 9 + 125 = 135
, que se compara con el número original135
. Como estos dos son iguales, el código imprime el número.fuente
map$_-eval s/./+$&**$+[0]/gr||say,<>..<>
"@+"
es 1 byte más corto que$+[0]
:)JavaScript (ES7),
10591898883798281 bytes¡Gracias a Arnauld por ahorrar 20B y a ETHProductions por ahorrar 6B!
Uso
Asigne la función a una variable y dele el mínimo y el máximo como argumentos. Ejemplo:
Salida
Golf adicional
Esto parece bastante bien, pero siempre hay margen de mejora ... creo.
fuente
d**(e+1)
ad**-~e
para guardar dos bytes.&
lugar de&&
. Un byte más para ir ...JavaScript (Firefox 52+), 68 bytes
Función recursiva que sale a través de
alert
. Funciona en la Edición para desarrolladores de Firefox, que puede descargar en esta página . Las versiones anteriores de Firefox no son compatibles con el**
operador, y ningún otro navegador es compatible con la[for(a of b)c]
sintaxis.Fragmento de prueba
Esto utiliza en
.map
lugar de una comprensión de matriz, y enMath.pow
lugar de**
, por lo que debería funcionar en todos los navegadores que admitan ES6.Mostrar fragmento de código
fuente
05AB1E , 12 bytes
Guardado 2 bytes gracias a Emigna
Pruébalo en línea!
fuente
ŸvygLySmOyQ—
debería funcionar para 12 bytes.Python 3, 100 bytes
No es el enfoque más corto, pero sí uno muy lindo. Hay finitamente muchos acuarios; ver la página de OEIS para una buena prueba. Estos son todos ellos.
fuente
R, 100 bytes
Función sin nombre que toma
n
ym
. Como siempre en R, dividir enteros en un vector de dígitos numéricos es tedioso y consume muchos bytes. Esto hace que la función sea relativamente lenta y solo funciona para enteros de 32 bits.fuente
Jalea , 11 bytes
Pruébalo en línea!
¡Lo conseguí de 16 a 11, con ayuda de @miles!
Explicación:
fuente
J
para obtener índices. Una forma más corta podría serD*J$S⁼
combinar sus dos enlaces en unoCJam , 23 bytes
Pruébalo en línea!
Explicación
fuente
05AB1E , 18 bytes
Pruébalo en línea!
fuente
Python 2.X, 92 bytes
fuente
(i+1)
, pero esto no es un problema, cuando se deshace de los paréntesis haciendo-~i
.list('k')
, que yo no tengo. Sin embargo, aún puede eliminar el espacio en blanco :)Python 2 , 84 bytes
Un enfoque de programa completo, actualmente de la misma longitud que la solución lambda.
Pruébalo en línea!
fuente
input()
. ¡Muy agradable! +1.Japt, 15 bytes
¡Pruébelo en línea! Esta fue una colaboración entre @obarakon y yo.
Cómo funciona
En la última versión de Japt,
x
acepta una función como argumento, lo que nos permite jugar a otro byte:¡Pruébelo en línea!
fuente
Clojure, 107 bytes
La implementación de la ecuación es terriblemente larga.
fuente
(.pow(-(int v)48M)
TI-Basic, 85 bytes
fuente
int(log(
cada número y luego hacer los poderes. Quizás esto sea más corto, pero lo dudo.FUNC
modo y la ventana debe configurarse para incluir su punto de entrada. No me parece lo suficientemente portátil.FUNC
modo, aunque veo lo que dice sobre la resolución de entrada. Pero, este método es bastante común en el golf. Siempre podrías en suPrompt X,Y
lugar.Haskell, 61 bytes
Ejemplo de uso
5 # 600
->[5,6,7,8,9,89,135,175,518,598]
.Verifique cada número
i
en el rango[n..m]
. Los dígitos se extraen convirtiéndolosi
en una cadena (show
) y haciendo que cada carácter sea una cadena de un elemento (pure
) que se convierte nuevamente en un entero (read
). Comprime esos elementos con[1..]
la función^
y toma elsum
.fuente
PHP,
929188 bytes3 bytes guardados gracias @AlexHowansky
toma datos de los argumentos de la línea de comandos; imprime una coma final. Corre con
-r
.fuente
for([,$n,$m]=$argv;$n<=$m;
"$n"[index]
y"_$n"[index]
errores de análisis al producto"89"[index]
y$s="$n";$s[index]
son perfectamente bien.("_$n")[index]
Mathematica, 59 bytes
Función sin nombre que toma dos argumentos enteros y devuelve una lista de enteros.
(d=IntegerDigits@#)^Range@Length@d
produce la lista de dígitos de un número a las potencias apropiadas;Tr[...]==#
detecta si la suma de esas potencias de dígitos es igual al número original.fuente
MATLAB,
8873 bytesRespuesta original:
num2str(n)-'0'
divide an
en un vector de sus dígitos, y1:floor(log10(n))+1
es un vector que contiene uno para el número de dígitosn
. Gracias por iniciar sesión en el golf hasta una función anónima, ahorrando 15 bytes.fuente
Haskell ,
82 7675 bytesPruébalo en línea!Uso:
5 ! 175
Esto comprueba cada número en el rango
n
dem
si es un número de disarium y, por lo tanto, es bastante lento para grandesm
.Versión más rápida: (93 bytes)
Pruébalo en línea!
fuente
C (gcc) , 136 bytes
Encabezado que define pow en TIO porque por alguna razón no incluyó automáticamente pow. Mi computadora lo hizo, así que voy a rodar con eso.
Pruébalo en línea!
fuente
MATL , 16 bytes
Pruébalo en línea!
fuente
Lote, 115 bytes
Batch solo tiene una aritmética de 32 bits que no tiene forma de comparar el último número de disarium, pero si insiste en las comparaciones de cadenas, entonces para 402 bytes:
fuente
Python 2, 100 bytes
Todavía no he tenido la oportunidad de ejecutar esto (hacerlo en mi teléfono).
fuente
sum
.i
hay un Disarium. No tengo idea de si esto está permitido, pero diría que no, ya que la salida se pone muy en blanco.Scala,
132129 bytes129 editar: Cambiar el nombre de la variable de bucle de partir
&
ai
guardados tres espacios.Explicación
Para cada valor en el rango de entrada:
+""
zipWithIndex
para producir una lista de tuplas que contienen un carácter del dígito y su índiceComentarios
Finalmente pude aprender cómo
fold
yzipWithIndex
trabajar. No estoy satisfecho con lasint
conversiones, pero estoy satisfecho con la brevedad defold
yzipWithIndex
.fuente
Octava,
8887 bytesGracias a MattWH por guardar un byte (f (x) -48 vs f (x) - '0')
Correr:
Explicación
fuente
C
175169 bytesVersión sin golf:
Se puede acortar de alguna manera, pero no lo veo en este momento.
@TuukkaX Gracias por guardar 6 bytes.
fuente
n!=0
se pueden cambiar an
.Java
Explicación
fuente
Python 3: 131 bytes
Después de crear este código, se hace evidente que hay un número limitado de disarios, por lo que podría ser más factible verificarlos explícitamente en lugar de utilizar tanta comprensión de la lista que es difícil para las grandes entradas de esta solución.
Pruébalo en línea!
fuente