( Relacionado )
Dado un número entero n > 1
,
1) Construya el rango de números n, n-1, n-2, ... 3, 2, 1
y calcule la suma
2) Tome los dígitos individuales de ese número y calcule el producto
3) Tome los dígitos individuales de ese número y calcule la suma
4) Repita los pasos 2 y 3 hasta que alcanzar un solo dígito. Ese dígito es el resultado.
Los primeros veinte términos de la secuencia están a continuación:
3, 6, 0, 5, 2, 7, 9, 2, 7, 9, 1, 9, 0, 0, 9, 6, 7, 0, 0, 6
Nota: Esta secuencia NO está en OEIS.
E / S y reglas
- Los números se harán muy grandes rápidamente, por lo que la solución debe ser capaz de manejar números de entrada de hasta 100,000 sin fallas (está bien si su código puede manejar más allá de eso).
- La entrada y la salida se pueden dar por cualquier método conveniente .
- Un programa completo o una función son aceptables. Si es una función, puede devolver el resultado en lugar de imprimirlo.
- Las lagunas estándar están prohibidas.
- Este es el código de golf, por lo que se aplican todas las reglas habituales de golf, y gana el código más corto (en bytes).
Ejemplos
n output
1234 9
3005 3
5007 5
9854 8
75849 8
100000 0
code-golf
sequence
number-theory
AdmBorkBork
fuente
fuente
n
. La solución publicada solo tiene que funcionar hastan = 100000
.Numbers will get very large quickly
no, no lo haceRespuestas:
Python 2 ,
7772716260 bytes¡Gracias a @xnor por jugar 2 bytes!
Pruébalo en línea!
fuente
repeat until you reach a single digit
?236172
; y ese es el único por debajo de 1 millón.05AB1E , 7 bytes
Pruébalo en línea!
Exlpacion
fuente
Jalea , 8 bytes
Pruébalo en línea!
Programa completo (devuelve una matriz singleton que contiene el resultado, pero los corchetes no son visibles en STDOUT).
fuente
MATL ,
1513 bytesEn homenaje a la lengua del mes :
Pruébalo en línea!
No creo que haya una forma más simple de obtener los dígitos de un número que convertir el número en una cadena
V
, luego transponerlo!
y convertir este vector vertical a uno numéricoU
.¡Ahorró 2 bytes gracias al Creador 1 mismo! Olvidé el final implícito, lo que significa que podría eliminar
]
, y en lugar de comparar el número de elementos1
, simplemente podría disminuir ese valor y usarlo como un booleano directamente.Entonces, la explicación es la siguiente:
1 ... de MATL, Luis Mendo.
fuente
JavaScript (ES6), 60 bytes
Pruébalo en línea!
Comentado
Versión alternativa, 59 bytes (no competitiva)
Una versión no recursiva que solo funciona para n <236172 . (Cubre el rango solicitado pero no califica como un algoritmo genérico válido).
Pruébalo en línea!
fuente
Number.MAX_SAFE_INTEGER ** 0.5 ~= 94906265
.Haskell ,
7271 63 bytes¡Gracias a @BMO por un byte y @nimi por 8 bytes!
Pruébalo en línea!
fuente
Stax ,
141310 bytesEjecutar y depurarlo
Fue muy divertido de hacer. Me pregunto si hay una forma más concisa de hacer la comparación al final.
Explicación
-1 bytes gracias a ovs
-3 bytes gracias a Scrooble
fuente
R ,
152 130109 bytesPruébalo en línea!
@Giuseppe encontró
2142 bytes con varias cosas R a las que todavía no estoy acostumbrado, ¡junto con una forma de obtener los dígitos de un número sin forzar la cadena y viceversa, y con menos bytes!options(scipen=9)
serequería para el caso de 9854 para la función anterior, porque la primera etapa del producto termina en 80000, que R imprime como 8e + 05.fuente
scipen
: ¡ Pruébalo en línea ! tenga en cuenta quemax(0,log10(x))
es porque six=0
, entonces lolog10(0)=-Inf
que causa un error.Pyth , 11 bytes
Pruébalo aquí!
fuente
Carbón , 18 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Suma los enteros hasta la entrada.
Si bien el resultado es mayor que 9, tome la suma de dígitos del producto de dígitos.
Transmita el resultado a una cadena e imprímalo implícitamente.
fuente
Gaia , 8 bytes
Pruébalo en línea!
La vieja explicación (antes de corregir un error que es culpa de Gaia IMO: P):
Guardado 1 byte gracias a Dennis .
fuente
┅⟨ΣΠ⟩°
Guarda un byte.4
0
resultados[]
por alguna razón :(F #, 175 bytes
Pruébalo en línea!
La única advertencia a la función es que el valor de entrada debe ser de tipo
uint64
.Ungolfed es un poco así:
La función
d n
convierte el númeron
en sus dígitos componentes. Primero se convierte en una cadena, luego obtiene cada carácter en la cadena. Cada carácter debe convertirse de nuevo en una cadena, de lo contrario los caracteres se convertirán a sus valores ASCII en lugar de sus valores "reales".La
c n
función es la función principal, conn
el valor inicial. En esta funciónr
es nuestro valor de ejecución. Elwhile
bucle hace lo siguiente:r
en sus dígitos componentes (d r
).Seq.reduce
que toma una función con el valor acumulado (a
) y el siguiente valor en la secuencia (x
) y en este caso devuelve el producto. El valor inicial es el primer elemento de la secuencia.d
).r
.fuente
Befunge, 136 bytes
Puedes probarlo aquí .
Si bien no todos los intérpretes tienen un tamaño de celda lo suficientemente grande, funciona con números pequeños para casi cualquier persona. Para un número mayor de
n
lo que pueda necesitar un intérprete como BefunExec .fuente
Gol> <> ,
3533 bytesPruébalo en línea!
-2 bytes por Jo King.
Uso extenso de funciones y bucles infinitos implícitos.
Programa completo de ejemplo y cómo funciona
fuente
Japt,
161413 bytesIntentalo
Explicación
fuente
Casco , 7 bytes
Pruébalo en línea!
fuente
PHP 7, 89 bytes
Ejecutar como tubería con
-r
o probarlo en línea .+
para convertir a int para~
que funcione como lo desee.for()
lugar dedo ... while()
.El PHP anterior requiere un byte más:
for($s=str_split,$a=...;$a>9;)$a=array_sum($s(...));
(No asignarlo
str_split
a una variable desperdiciaría otro byte).fuente
Perl 6 , 49 bytes
Pruébalo en línea!
fuente
[*](.comb).comb
lugar de([*] .comb).comb
Tcl , 118 bytes
Pruébalo en línea!
fuente
PowerShell Core ,
9110193 bytesPruébalo en línea!
Ungolfed un poco ...
Los primeros pasos fueron dividir los enteros en dígitos; esto se hizo dividiendo el entero en una serie de
caracteresdecadenas. Luego, inserte el operando y luego evalúe la cadena como un comando. Luego, se trata de hacer el ciclo de suma múltiple hasta que la entrada sea de un dígito.iex
es un alias para elInvoke-Command
que evalúa una cadena pasada a la primera posición de parámetro.Editar: según lo solicitado por @AdmBorkBork , he agregado un encabezado de función al recuento de bytes. Además, hice un poco de matemática y me di cuenta de que hay un límite superior en el número de iteraciones
< log log 10^6 < log 6 < 2
, por lo que ahorré otros seis bytes.Editar x2: @AdmBorkBork encontró una forma más concisa de convertir el entero en una expresión matemática, y luego sugirió conectarlo
iex
. Esto ahorró 8 bytes. ¡Gracias!fuente
Function F($a){ }
en su recuento de bytes. Sin embargo, creo que deberías poder guardar algo usando en[char[]]
lugar de-split''-ne''
,[char[]]1234=Ӓ
, que no es válido; Podría ser capaz de hacerlo funcionar, pero puede que no sea obvio en este momento. ¡Gracias por la sugerencia![char[]]"$o"
y en|iex
lugar de esoiex( )
.Perl 5
-p
, 61 bytesPruébalo en línea!
fuente
Ruby , 57 bytes
Pruébalo en línea!
fuente
Java 8, 129 bytes
Pruébalo en línea.
Explicación:
fuente
Julia 0.6 , 56 bytes
Pruébalo en línea!
Bastante sencillo: calcule la
(n+1)n÷2
suma de 1..n, verifique si es un número de un solo dígito (>9
), si no lo es, intente nuevamente con k establecido en la suma de los dígitos del producto de los dígitos de k, de lo contrario devuelva k.fuente