Números digitales


20

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 nhay algún entero positivo.

La contraparte digital de un número se calcula de la siguiente manera:

  1. Dividir un número en una matriz de sus dígitos, por ejemplo 613 => [6 1 3]
  2. Para cada número en la matriz, calcule el nnúmero triangular th;[6 1 3] => [21 1 6]
  3. Suma la matriz resultante; [21 1 6] => 28

Su tarea es, dado un número entero n, calcular repetidamente nla 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 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

1
¿Podemos incluir el número original como el primero en la matriz resultante?
Uriel

1
¿Cómo sabemos que siempre se reduce a 1?
Simplemente hermoso arte

55
Supongamos que un número es mayor que 141y tiene ndígitos. El valor máximo que puede tener su contraparte digital es 45n, por lo tanto digi-△(x) ≤ 45n < 45(1+log_10(x)), y para x > 141, tenemos 45(1+log_10(x)) < x, digi-△(x) ≤ x-1por lo tanto x > 141, para , y una vez que superamos el 141límite, bueno, probamos la fuerza bruta a través de programas.
Simplemente hermoso arte

1
¿Puedo tener 1 al final de mi salida?
Simplemente hermoso arte

1
Relacionado: Números digitales , buscando pruebas alternativas de que esta secuencia llega a 1 eventualmente.
Simplemente hermoso arte

Respuestas:


10

Casco , 6 bytes

U¡(ṁΣd

Pruébalo en línea!

Explicación

U¡(ṁΣd
 ¡(       Iterate the following function on the input:
     d       Split the number into digits
   ṁΣ        Map each digit to its triangular number, then sum the results
U         Take the results of iteration until before the first repeated one

7

05AB1E , 6 5 bytes

Δ=SLO

Pruébalo en línea! Editar: Guardado 1 byte gracias a @Emigna. Explicación:

Δ       Repeat until value doesn't change
 =      Print current value
  S     Split into characters
   L    Turn each character into range from 1 to N
    O   Sum

Si reemplaza con S, puede omitir uno O.
Emigna

@Emigna ... ¿por qué Lincluso se comporta de esa manera?
Neil

Si no recuerdo mal, fue un error que resultó ser útil y quedó como una característica. Creo que fue uno de los primeros métodos que se vectorizó.
Emigna

4

J, 20 19 bytes

(1#.2!1+,.&.":)^:a:

Pruébalo en línea!

Emite también el número original.

Explicación

(1#.2!1+,.&.":)^:a:
               ^:a:  Apply until input converges, storing all results in an array
(1#.2!1+,.&.":)      Digitangular sum
        ,.&.":         Split to digits
          &.":           Convert to string, apply left function, then undo conversion
        ,.               Ravel items (make array of singleton arrays of items)
                         This ensures that when cast back to integers, the digits are split.
      1+               Add 1 to each
    2!                 Compute (n choose 2) on each (nth triangular number)
 1#.                   Sum (debase 1)

1
[:+/-> 1#.miau!
FrownyFrog

@FrownyFrog no es un truco original, aunque ciertamente lo uso mucho cuando recuerdo.
cole

4

APL (Dyalog) , 23 20 17 bytes

3 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á.


Por curiosidad, ¿cuánto tiempo pasaría si no se le permitiera emitir el valor original también?
caird coinheringaahing

@cairdcoinheringaahing 2 bytes - 1↓(soltar primero)
Uriel

@Uriel Here power limit (() ofrece una solución más corta que la recursividad: {⍵∪⍨ + / ∊⍳¨⍎¨⍕⊃⍵} ⍣≡ pero es una pena que APL no tenga una forma concisa de recopilar todas las iteraciones de una función hasta la convergencia: ⍵ (f⍵) (f⍣2⊢⍵) (f⍣3⊢⍵) ...
ngn

@ngn gracias! Intenté usar el operador de energía, pero no pensé en el hecho de que converge después de 1. Se actualizará pronto
Uriel

@ngn alguna idea sobre cómo usar {+/∊⍳¨⍎¨⍕⎕←⍵}⍣≡sin obtener el último 1 impreso?
Uriel

3

Haskell, 51 47 46 bytes

f 1=[1]
f x=x:f(sum$do d<-show x;[1..read[d]])

Pruébalo en línea!

f 1=[1]                     -- if x == 1, return the singleton list [1]
f x=                        -- else
         do d<-show x       --  for each char 'd' in the string representation of x
                            --    (using the list monad)
           [1..read[d]]     --  make a list of [1..d]
                            --    (the list monad concatenates all those lists into a single list)
        sum                 --  sum those numbers
      f                     --  call f on it
    x:                      --  and put x in front of it 

Editar: @ H.PWiz guardó un byte. ¡Gracias!



2

Wolfram Language (Mathematica) , 43 41 bytes

Echo@#>1&&#0[#.(#+1)/2&@IntegerDigits@#]&

Pruébalo en línea!

Cómo funciona

La expresión #.(#+1)/2&@IntegerDigits@#da la contraparte digital de #. Hacemos Echola entrada, usamos la evaluación de cortocircuito &&para detener si hemos alcanzado 1, y de lo contrario recurrimos en la contraparte digital.


-2 bytes gracias a Martin Ender por el .truco: no tenemos que usar Trpara sumar los dígitos si reemplazamos la multiplicación #(#+1)/2por el producto escalar #.(#+1)/2.


2
Solo acabo de ver tu respuesta ahora. Puedes vencer al mío usando el truco del producto escalar para evitar Tr:Echo@#>1&&#0[#.(#+1)/2&@IntegerDigits@#]&
Martin Ender

@ Martininder Gracias, es un buen truco. Me pregunto si hay formas aún más innovadoras de "imprimir todas las iteraciones de esta función en el camino a un punto fijo" (esencialmente, reimplementar, FixedPointListexcepto por cómo imprime el punto fijo dos veces). Parece que eso debería haber surgido antes.
Misha Lavrov

2

Wolfram Language (Mathematica) , 49 42 39 bytes

Gracias a Misha Lavrov por guardar 3 bytes.

#//.x_:>(y=IntegerDigits@Echo@x).++y/2&

Pruébalo en línea! (TIO necesita paréntesis alrededor ++ypor 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.


Puedes volver a superar mi respuesta con #//.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?)
Misha Lavrov

Bueno, #//.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.
Misha Lavrov

@MishaLavrov Gracias. Sí, no tengo idea de por qué TIO necesita los paréntesis, pero la sintaxis en los archivos de script a veces es un poco inestable.
Martin Ender

1

Ohm v2 ,  9  7 bytes

·Ω}#ΣΣu

Pruébalo en línea!

Explicación

          Implicit input as a string
·Ω        Evaluate until the result has already been seen, pushing intermediate results
  }       Split digits
   #      Range from 0 to N
    ΣΣ    Sum
      u   Convert to string

No es uinnecesario?
Nick Clifford

Es necesario de lo contrario }no va a dividir los dígitos
Cinaski

Hm. Eso podría ser un error. Lo comprobaré.
Nick Clifford

1

Retina , 21 bytes

;{:G`
.
$*1¶
1
$%`1
1

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

;{:G`

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 hacemos 1), :imprime el número antes de cada iteración y ;evita que el resultado final se imprima dos veces al final del programa. Esta Ges solo mi forma habitual de crear una etapa sin operaciones.

.
$*1¶

Convierta cada dígito en unario y colóquelo en su propia línea.

1
$%`1

Calcule el número triangular en cada línea, reemplazando cada uno 1con su prefijo. También podríamos usar M!&`1+aquí, lo que nos da todos los sufijos de cada línea.

1

Cuente todos los 1s, que resume todos los números triangulares y convierte el resultado a decimal.


¿Es la retina un lenguaje completo?

@ThePirateBay sí.
Martin Ender

1

Ruby, 60 47 42 bytes

-13 bytes por @JustinMariner

-5 bytes por @GB

->x{p x=x.digits.sum{|k|k*-~k/2}while x>1}

Pruébalo en línea!


Puede soltar la matriz y splat ( [*...]) y cambiar (k+1)a -~kpara 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!
Justin Mariner

No tengo idea de por qué pensé .mapque no podía tomar matrices.
Simplemente hermoso arte

Puede usar "sum {...}" en lugar de "map {...}. Sum" y luego eliminar el espacio antes de "while"
GB


1

Pushy , 24 22 21 17 bytes

[sL:R{;Svc^#&1=?i

Pruébalo en línea!

Explicación

[sL:R{;Svc^#&1=?i

[           &1=?i   \ Loop until result == 1:
 s                  \   Split last result into digits
  L:  ;             \   For each digit n:
    R{              \       Push the range (1, n) inclusive
       S            \   Sum the ranges
        vc^         \   Delete all stack items, except the sum
           #        \   Print result


0

R , 70 bytes

f=function(n)"if"(n-1,c(n,f((d=n%/%10^(nchar(n):0)%%10)%*%(d+1)/2)),n)

Pruébalo en línea!

Devuelve el valor original también.

R , 80 bytes

function(n){o={}
while(n-1){n=(d=n%/%10^(nchar(n):0)%%10)%*%(d+1)/2
o=c(o,n)}
o}

Pruébalo en línea!

No devuelve el valor original.



0

05AB1E , 20 12 bytes

Ahorró 2 bytes gracias a caird coinheringaahing

ΔD,þ€iLO}O}}

Pruébalo en línea!

Explicación

(versión antigua)

Δþ€iD>*;}OD1›iD,}}1,  Main program
Δ                }    Repeat until there is no changes
 þ                    Push digits of the input number
  €i    }             Apply for each digit
    D>*;              Calculate the triangular number for given digit
         O            Sum all numbers
          D1›iD,}     Print if greater than 1
                  1,  Print 1 at the end

0

JavaScript, 61 57 bytes

f=a=>a-1?([...a+[]].map(b=>a+=b++*b/2,a=0),a)+' '+f(a):''

Pruébalo en línea!



0

Carbón , 18 bytes

W⊖Iθ«≔IΣ⭆θΣ…·0κθθ⸿

Pruébalo en línea! El enlace es a la versión detallada del código. Explicación:

   θ                Input
  I                 Cast to integer
 ⊖                  Decrement
W   «               Loop while not zero
         θ          Current value
        ⭆           Map over characters and concatenate
             0      Literal character 0
              κ     Current character
           …·       Inclusive range
          Σ         Concatenate
       Σ            Sum of digits
      I             Cast to string
     ≔         θ    Assign back to value
                θ   Output latest value
                 ⸿  Move to start of next line


0

k , 19 bytes

{+/(+/1+!"I"$)'$x}\

Como era de esperar, funciona de manera similar a las soluciones APL y J ya publicadas

               $x    cast x (implicit var of lambda) to string
   (         )'      apply composition (function train) to each character of string
    +/1+!"I"$        cast character to number, create list from 1 to n, sum it
 +/                  sum triangular numbers
{                }\  iterate lambda until result converges, appending each result

0

Jalea , 7 bytes

DRFSµÐĿ

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). Vectoriza

  • F: Flatten y S: Sum ( µsolo crea una nueva cadena monádica)


0

dc, 31 bytes

[[I~d1+*2/rd0<m+]dsmxpd1<f]dsfx

La función mcalcula la función digitangular de su entrada;frepite 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

for i in 23 72 55 78 613 8392 11111 8592025 999999999
    do echo $i '=>' $(dc -e $i'[[I~d1+*2/rd0<m+]dsmxpd1<f]dsfx')
done
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


0

Neim , 8 bytes

ͻ𝐂t𝕕𝐬D÷D

Explicación:

ͻ             Start infinite loop
 𝐂            Split top of stack into each of its characters
  t           Push infinite list of triangular numbers
   𝕕          For each of the characters, get the nth element in the above list.
    𝐬          Sum.
     D         Duplicate.
      ÷        If top of stack is equal to 1, break.
       D       Duplicate.
               Implicitly print all elements in the stack, concatenated.

Pruébalo en línea!

Salida formateada


0

D , 140 bytes

import std.algorithm,std.range,std.conv,std.stdio;void f(T)(T n){n=n.text.map!(u=>u.to!T-48+(u.to!T-48).iota.sum).sum;n.writeln;if(n-1)n.f;}

Pruébalo en línea!


0

PHP, 71 + 1 bytes

for(;1<$n="$s"?:$argn;print$s._)for($i=$s=0;$p--||~$p=$n[$i++];)$s+=$p;

Ejecutar como tubería -nRo probarlo en línea . (requiere PHP 5.3 o posterior para el operador de Elvis)


¿Cuál es el operador de Elvis?
caird coinheringaahing

@cairdcoinheringaahing A?:B: si A es veraz entonces A else B
Titus

0

Agregar ++ , 32 bytes

D,f,@,EDBFEREss
+?
y:1
W!,$f>x,O

Pruébalo en línea!

No genera el primer valor

Cómo funciona

D,f,@,   - Create a monadic function, f.
         - Example argument: [613]
      ED - Digits;   STACK = [[6 1 3]]
      BF - Flatten;  STACK = [6 1 3]
      ER - Range;    STACK = [[1 2 3 4 5 6] [1] [1 2 3]]
      Es - Sum each; STACK = [21 1 6]
      s  - Sum;      STACK = [28]

           f calculates n's digitangular counterpart

+?       - Take input;     x = 613; y = 0
y:1      - Set y to 1;     x = 613; y = 1
W!,      - While x != y...
   $f>x, -   Call f;       x =  28; y = 1
   O     -   Print x;

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.