Números digitangular


20

Um número triangular é um número que pode ser expresso como a soma dos números inteiros positivos consecutivos, iniciando em 1. Eles também podem ser expressos com a fórmula n(n + 1) / 2, onde nestá um número inteiro positivo.

A contraparte digitangular de um número é calculada da seguinte maneira:

  1. Divida um número em uma matriz de seus dígitos, por exemplo 613 => [6 1 3]
  2. Para cada número na matriz, calcule o nnúmero triangular;[6 1 3] => [21 1 6]
  3. Soma a matriz resultante; [21 1 6] => 28

Sua tarefa é, dado um número inteiro n, calcular repetidamente na contraparte digital retangular, até que o resultado seja igual a 1, em seguida, gerar todos os valores que foram calculados. Você pode emitir os valores em qualquer ordem e com uma inclusão opcional do número original no início da matriz. Este é um portanto o código mais curto vence.

Casos de teste

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 o número original como o primeiro na matriz resultante?
Uriel

1
Como sabemos que sempre cai para 1?
Simply Beautiful Art

5
Vamos supor que um número seja maior que 141e tenha ndígitos. O valor máximo que sua contraparte digitangular pode ter é 45n, então digi-△(x) ≤ 45n < 45(1+log_10(x)), e para x > 141, temos 45(1+log_10(x)) < x, portanto , digi-△(x) ≤ x-1para x > 141e, uma vez ultrapassado o 141limite, bem, provamos a força bruta por meio de programas.
Simply Beautiful Art

1
Posso ter 1 à direita no final da minha saída?
Simply Beautiful Art

1
Relacionado: Números digitangular , buscando provas alternativas de que essa sequência chega a 1 eventualmente.
Simply Beautiful Art

Respostas:


10

Casca , 6 bytes

U¡(ṁΣd

Experimente online!

Explicação

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

Experimente online! Editar: salvou 1 byte graças a @Emigna. Explicação:

Δ       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

Se você substituir por S, poderá pular uma O.
Emigna

@ Emigna ... por que Lse comporta dessa maneira?
Neil

Se bem me lembro, foi um bug que se mostrou útil e que permaneceu como um recurso. Eu acho que foi um dos primeiros métodos que vetorizou.
Emigna

4

J, 20 19 bytes

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

Experimente online!

Também gera o número original.

Explicação

(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 não é um truque original, embora eu certamente faça amplo uso dele quando me lembro.
cole

4

APL (Dyalog) , 23 20 17 bytes

3 bytes salvos graças a @ngn

{⍵∪⍨+/∊⍳¨⍎¨⍕⊃⍵}⍣≡

Experimente online!

Quão?

⍵∪⍨ - acrescente o array atual ao

+/ - soma de

- achatado

⍳¨ - intervalos de cada

⍎¨⍕ - dígito do

⊃⍵ - valor anterior

⍣≡até convergência. O uso de (união) garante que após a junção do primeiro 1, o próximo será excluído devido à exclusividade definida e a matriz convergirá.


Por curiosidade, quanto tempo levaria se você não tivesse permissão para gerar o valor original também?
caird coinheringaahing

@cairdcoinheringaahing 2 bytes - 1↓(gota em primeiro lugar)
Uriel

@Uriel Aqui o limite de potência (⍣≡) fornece uma solução mais curta que a recursão: {⍵∪⍨ + / ∊⍳¨∊⍳¨⍕⊃⍵} ⍣≡ mas é uma pena que o APL não tenha uma maneira concisa de coletar todas as iterações de uma função até a convergência: ⍵ (f⍵) (f⍣2⊢⍵) (f⍣3⊢⍵) ...
ngn

@ngn obrigado! Eu tentei usar o operador de energia, mas não pensei no fato de que ele converge após o 1. Será atualizado em breve
Uriel

@ngn alguma idéia de como usar {+/∊⍳¨⍎¨⍕⎕←⍵}⍣≡sem ter o último 1 impresso?
Uriel

3

Haskell, 51 47 46 bytes

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

Experimente online!

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 

Edit: @ H.PWiz salvou um byte. Obrigado!



2

Wolfram Language (Mathematica) , 43 41 bytes

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

Experimente online!

Como funciona

A expressão #.(#+1)/2&@IntegerDigits@#fornece a contraparte digitangular de #. Nós Echoinserimos, usamos a avaliação de curto-circuito com &&para parar se tivermos chegado 1e, de outra forma, recorremos na contraparte digital.


-2 bytes graças a Martin Ender pelo .truque: não precisamos Trsomar os dígitos se substituirmos a multiplicação #(#+1)/2pelo produto escalar #.(#+1)/2.


2
Só vi sua resposta agora. Você pode vencer o meu usando o truque do produto escalar para evitar Tr:Echo@#>1&&#0[#.(#+1)/2&@IntegerDigits@#]&
Martin Ender

@ MartinEnder Obrigado, esse é um truque legal. Gostaria de saber se existem maneiras ainda mais eficientes de fazer "imprimir todas as iterações dessa função no caminho para um ponto fixo" (essencialmente, reimplementar, FixedPointListexceto como isso imprime o ponto fixo duas vezes). Parece que isso deveria ter acontecido antes.
Misha Lavrov

2

Wolfram Language (Mathematica) , 49 42 39 bytes

Agradecemos a Misha Lavrov por salvar 3 bytes.

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

Experimente online! (O TIO precisa de parênteses ++ypor algum motivo. Na instalação local do Mathematica, ele funciona sem eles, como deveria.)

Imprime cada valor em sua própria linha, precedido por >>e inclui o número inicial.


Você pode voltar a bater minha resposta com #//.x_:>(y=IntegerDigits@Echo@x).++y/2&. (. ... talvez Por alguma razão, TIO não gosta disso, mas está bem Mathematica com isso?)
Misha Lavrov

Bem, #//.x_:>(y=IntegerDigits@Echo@x).(++y)/2&tem 41 bytes e funciona no TIO. Mas minha cópia do Mathematica não acha que os parênteses são necessários.
Misha Lavrov #

@MishaLavrov Thanks. Sim, não há idéia de por que o TIO precisa dos parênteses, mas a sintaxe nos arquivos de script às vezes é um pouco complicada.
Martin Ender

1

Ohm v2 ,  9  7 bytes

·Ω}#ΣΣu

Experimente online!

Explicação

          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

Não é udesnecessário?
Nick Clifford

É necessário caso contrário }não irá dividir os dígitos
Cinaski

Hum. Isso pode ser um bug. Vou dar uma olhada.
Nick Clifford

1

Retina , 21 bytes

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

Experimente online! (As saídas dos casos individuais não são bem separadas, mas cada saída termina com a 1.)

Imprime cada número em sua própria linha, em ordem, incluindo o número inicial.

Explicação

;{:G`

Esta é apenas uma configuração do programa. {faz o loop do programa até que ele não mude o resultado (o que acontece quando chegamos a isso 1), :imprime o número antes de cada iteração e ;impede que o resultado final seja impresso duas vezes no final do programa. Essa Gé apenas a minha maneira usual de criar um estágio sem operação.

.
$*1¶

Converta cada dígito em unário e coloque-o em sua própria linha.

1
$%`1

Calcule o número triangular em cada linha, substituindo cada um 1pelo seu prefixo. Também poderíamos usar M!&`1+aqui, o que nos dá todos os sufixos de cada linha.

1

Conte todos os 1s, que soma todos os números triangulares e converte o resultado novamente em decimal.


O Retina é um idioma completo?

@ThePirateBay yes.
Martin Ender

1

Ruby, 60 47 42 bytes

-13 bytes de @JustinMariner

-5 bytes por @GB

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

Experimente online!


Você pode deixar cair a matriz e splat ( [*...]) e mudança (k+1)para -~ksalvar um total de 5 bytes: Experimente online! Além disso, você pode economizar mais 8 mudando para uma função lambda anônima: Experimente online!
Justin Mariner

Humm, não faço ideia do por que eu pensei .mapque não poderia receber arrays.
Simply Beautiful Art

Você pode usar "soma {...}" em vez de e remova o espaço antes "enquanto" "mapa {...} soma."
GB

1

Befunge-93 , 51 bytes

p&>>:25*%:1+*2/v
  |:/*52p00+g00<
00<vp000_@#-1.::g

Experimente online!

James Holderness inteligentemente reformulou meu programa em uma forma de 51 bytes. Obrigado!


1

Pushy , 24 22 21 17 bytes

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

Experimente online!

Explicação

[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)

Experimente online!

Retorna o valor original também.

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}

Experimente online!

Não retorna o valor original.



0

05AB1E , 20 12 bytes

Guardado 2 bytes graças a caird coinheringaahing

ΔD,þ€iLO}O}}

Experimente online!

Explicação

(versão antiga)

Δþ€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):''

Experimente online!



0

Carvão , 18 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação:

   θ                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}\

Sem surpresa, funciona de maneira semelhante às soluções APL e J já 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

Geléia , 7 bytes

DRFSµÐĿ

Experimente online!

  • DRFSµÐĿ: Programa completo / link monádico.

  • ÐĿ: Faça loop até que os resultados não sejam mais exclusivos (se algo diferente de 1 ocorrer duas vezes, a entrada fornecida não terá um resultado definido, pois nunca alcançaria 1).

  • D: Converte de inteiro para decimal.

  • R: Intervalo (indexado 1). Vectorizes.

  • F: Flatten e S: Sum ( µapenas cria uma nova cadeia monádica)


0

dc, 31 bytes

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

A função mcalcula a função digitangular de sua entrada;frepete isso até o resultado atingir 1.

Observe que usamos o radical de entrada para extrair dígitos - isso significa que ele funcionará em qualquer sistema básico, não apenas decimal.

Demo

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

Explicação:

ͻ             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.

Experimente online!

Saída formatada


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;}

Experimente online!


0

PHP, 71 + 1 bytes

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

Execute como pipe -nRou experimente online . (requer PHP 5.3 ou posterior para o operador Elvis)


O que é o operador Elvis?
caird coinheringaahing

@cairdcoinheringaahing A?:B: se A é verdade, então A else B
Titus

0

Adicionar ++ , 32 bytes

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

Experimente online!

Não gera o primeiro valor

Como 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;

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.