Un número triangular es un número que se puede expresar como la suma de enteros positivos consecutivos, comenzando en 1. También se pueden expresar con la fórmula n(n + 1) / 2
, donde n
hay algún entero positivo.
La contraparte digital de un número se calcula de la siguiente manera:
- Dividir un número en una matriz de sus dígitos, por ejemplo
613 => [6 1 3]
- Para cada número en la matriz, calcule el
n
número triangular th;[6 1 3] => [21 1 6]
- Suma la matriz resultante;
[21 1 6] => 28
Su tarea es, dado un número entero n
, calcular repetidamente n
la contraparte digitalangular, hasta que el resultado sea igual a 1, luego generar todos los valores calculados. Puede generar los valores en cualquier orden y con una inclusión opcional del número original al comienzo de la matriz. Este es un código de golf, por lo que gana el código más corto.
Casos de prueba
23 => 9 45 25 18 37 34 16 22 6 21 4 10 1
72 => 31 7 28 39 51 16 22 6 21 4 10 1
55 => 30 6 21 4 10 1
78 => 64 31 7 28 39 51 16 22 6 21 4 10 1
613 => 28 39 51 16 22 6 21 4 10 1
8392 => 90 45 25 18 37 34 16 22 6 21 4 10 1
11111 => 5 15 16 22 6 21 4 10 1
8592025 => 117 30 6 21 4 10 1
999999999 => 405 25 18 37 34 16 22 6 21 4 10 1
141
y tienen
dígitos. El valor máximo que puede tener su contraparte digital es45n
, por lo tantodigi-△(x) ≤ 45n < 45(1+log_10(x))
, y parax > 141
, tenemos45(1+log_10(x)) < x
,digi-△(x) ≤ x-1
por lo tantox > 141
, para , y una vez que superamos el141
límite, bueno, probamos la fuerza bruta a través de programas.Respuestas:
Casco , 6 bytes
Pruébalo en línea!
Explicación
fuente
05AB1E ,
65 bytesPruébalo en línea! Editar: Guardado 1 byte gracias a @Emigna. Explicación:
fuente
€
conS
, puede omitir unoO
.L
incluso se comporta de esa manera?J,
2019 bytesPruébalo en línea!
Emite también el número original.
Explicación
fuente
[:+/
->1#.
miau!APL (Dyalog) ,
232017 bytes3 bytes guardados gracias a @ngn
Pruébalo en línea!
¿Cómo?
⍵∪⍨
- anteponer la matriz actual a la+/
- la suma de∊
- aplanado⍳¨
- rangos de cada⍎¨⍕
- dígito de la⊃⍵
- valor anterior⍣≡
hasta la convergencia El uso de∪
(union) asegura que después de unir el primer 1, el siguiente será excluido debido a la unicidad establecida, y la matriz convergerá.fuente
1↓
(soltar primero){+/∊⍳¨⍎¨⍕⎕←⍵}⍣≡
sin obtener el último 1 impreso?Haskell,
514746 bytesPruébalo en línea!
Editar: @ H.PWiz guardó un byte. ¡Gracias!
fuente
Python 2 , 62 bytes
Pruébalo en línea!
fuente
Wolfram Language (Mathematica) ,
4341 bytesPruébalo en línea!
Cómo funciona
La expresión
#.(#+1)/2&@IntegerDigits@#
da la contraparte digital de#
. HacemosEcho
la entrada, usamos la evaluación de cortocircuito&&
para detener si hemos alcanzado1
, y de lo contrario recurrimos en la contraparte digital.-2 bytes gracias a Martin Ender por el
.
truco: no tenemos que usarTr
para sumar los dígitos si reemplazamos la multiplicación#(#+1)/2
por el producto escalar#.(#+1)/2
.fuente
Tr
:Echo@#>1&�[#.(#+1)/2&@IntegerDigits@#]&
FixedPointList
excepto por cómo imprime el punto fijo dos veces). Parece que eso debería haber surgido antes.Wolfram Language (Mathematica) ,
494239 bytesGracias a Misha Lavrov por guardar 3 bytes.
Pruébalo en línea! (TIO necesita paréntesis alrededor
++y
por algún motivo. En mi instalación local de Mathematica funciona sin ellos, como debería).Imprime cada valor en su propia línea, precedido por
>>
e incluye el número inicial.fuente
#//.x_:>(y=IntegerDigits@Echo@x).++y/2&
. (... tal vez. Por alguna razón, a TIO no le gusta esto, ¿pero Mathematica está bien con eso?)#//.x_:>(y=IntegerDigits@Echo@x).(++y)/2&
tiene 41 bytes y funciona en TIO. Pero mi copia de Mathematica no cree que los paréntesis sean necesarios.Ohm v2 ,
97 bytesPruébalo en línea!
Explicación
fuente
u
innecesario?}
no va a dividir los dígitosRetina , 21 bytes
Pruébalo en línea! (Las salidas de los casos individuales no están bien separadas, pero cada salida termina con a
1
.)Imprime cada número en su propia línea, en orden, incluido el número inicial.
Explicación
Esta es solo una configuración del programa.
{
realiza el ciclo del programa hasta que no puede cambiar el resultado (lo que sucede una vez que lo hacemos1
),:
imprime el número antes de cada iteración y;
evita que el resultado final se imprima dos veces al final del programa. EstaG
es solo mi forma habitual de crear una etapa sin operaciones.Convierta cada dígito en unario y colóquelo en su propia línea.
Calcule el número triangular en cada línea, reemplazando cada uno
1
con su prefijo. También podríamos usarM!&`1+
aquí, lo que nos da todos los sufijos de cada línea.Cuente todos los
1
s, que resume todos los números triangulares y convierte el resultado a decimal.fuente
Ruby,
60 4742 bytes-13 bytes por @JustinMariner
-5 bytes por @GB
Pruébalo en línea!
fuente
[*...]
) y cambiar(k+1)
a-~k
para guardar un total de 5 bytes: ¡ Pruébelo en línea! Además, puede ahorrar 8 más al cambiar a una función lambda anónima: ¡ Pruébelo en línea!.map
que no podía tomar matrices.Befunge-93 , 51 bytes
Pruébalo en línea!
James Holderness reformó hábilmente mi programa en una forma de 51 bytes. ¡Gracias!
fuente
Pushy ,
24222117 bytesPruébalo en línea!
Explicación
fuente
Japt ,
1917 bytesToma la entrada como un conjunto de elementos individuales.
Intentalo
fuente
R , 70 bytes
Pruébalo en línea!
Devuelve el valor original también.
R , 80 bytes
Pruébalo en línea!
No devuelve el valor original.
fuente
Lua , 91 bytes
Pruébalo en línea!
fuente
05AB1E ,
2012 bytesAhorró 2 bytes gracias a caird coinheringaahing
Pruébalo en línea!
Explicación
(versión antigua)
fuente
JavaScript,
6157 bytesPruébalo en línea!
fuente
Python 2 , 69 bytes
Pruébalo en línea!
fuente
Carbón , 18 bytes
Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:
fuente
cc , 62 bytes
Pruébalo en línea!
fuente
k , 19 bytes
Como era de esperar, funciona de manera similar a las soluciones APL y J ya publicadas
fuente
Jalea , 7 bytes
Pruébalo en línea!
DRFSµÐĿ
: Programa completo / enlace monádico.ÐĿ
: Haga un bucle hasta que los resultados ya no sean únicos (si algo diferente de 1 ocurriera dos veces, entonces la entrada dada no tiene un resultado definido, ya que nunca alcanzaría 1).D
: Convierte de entero a decimal.R
: Rango (1 indexado). VectorizaF
: Flatten yS
: Sum (µ
solo crea una nueva cadena monádica)fuente
dc, 31 bytes
La función
m
calcula la función digitangular de su entrada;f
repite esto hasta que el resultado llegue a 1.Tenga en cuenta que usamos la raíz de entrada para extraer dígitos; esto significa que funcionará en cualquier sistema base, no solo decimal.
Manifestación
fuente
Python 2 , 76 bytes
Pruébalo en línea!
fuente
Neim , 8 bytes
Explicación:
Pruébalo en línea!
Salida formateada
fuente
D , 140 bytes
Pruébalo en línea!
fuente
PHP, 71 + 1 bytes
Ejecutar como tubería
-nR
o probarlo en línea . (requiere PHP 5.3 o posterior para el operador de Elvis)fuente
A?:B
: si A es veraz entonces A else BAgregar ++ , 32 bytes
Pruébalo en línea!
No genera el primer valor
Cómo funciona
fuente
Perl 6 , 36 bytes
Pruébalo en línea!
Incluye el número de entrada en la lista de salida.
fuente