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 n
está um número inteiro positivo.
A contraparte digitangular de um número é calculada da seguinte maneira:
- Divida um número em uma matriz de seus dígitos, por exemplo
613 => [6 1 3]
- Para cada número na matriz, calcule o
n
número triangular;[6 1 3] => [21 1 6]
- Soma a matriz resultante;
[21 1 6] => 28
Sua tarefa é, dado um número inteiro n
, calcular repetidamente n
a 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 código de golfe, 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
141
e tenhan
dígitos. O valor máximo que sua contraparte digitangular pode ter é45n
, entãodigi-△(x) ≤ 45n < 45(1+log_10(x))
, e parax > 141
, temos45(1+log_10(x)) < x
, portanto ,digi-△(x) ≤ x-1
parax > 141
e, uma vez ultrapassado o141
limite, bem, provamos a força bruta por meio de programas.Respostas:
Casca , 6 bytes
Experimente online!
Explicação
fonte
05AB1E ,
65 bytesExperimente online! Editar: salvou 1 byte graças a @Emigna. Explicação:
fonte
€
porS
, poderá pular umaO
.L
se comporta dessa maneira?J,
2019 bytesExperimente online!
Também gera o número original.
Explicação
fonte
[:+/
->1#.
miau!APL (Dyalog) ,
232017 bytes3 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á.fonte
1↓
(gota em primeiro lugar){+/∊⍳¨⍎¨⍕⎕←⍵}⍣≡
sem ter o último 1 impresso?Haskell,
514746 bytesExperimente online!
Edit: @ H.PWiz salvou um byte. Obrigado!
fonte
Python 2 , 62 bytes
Experimente online!
fonte
Wolfram Language (Mathematica) ,
4341 bytesExperimente online!
Como funciona
A expressão
#.(#+1)/2&@IntegerDigits@#
fornece a contraparte digitangular de#
. NósEcho
inserimos, usamos a avaliação de curto-circuito com&&
para parar se tivermos chegado1
e, de outra forma, recorremos na contraparte digital.-2 bytes graças a Martin Ender pelo
.
truque: não precisamosTr
somar os dígitos se substituirmos a multiplicação#(#+1)/2
pelo produto escalar#.(#+1)/2
.fonte
Tr
:Echo@#>1&�[#.(#+1)/2&@IntegerDigits@#]&
FixedPointList
exceto como isso imprime o ponto fixo duas vezes). Parece que isso deveria ter acontecido antes.Wolfram Language (Mathematica) ,
494239 bytesAgradecemos a Misha Lavrov por salvar 3 bytes.
Experimente online! (O TIO precisa de parênteses
++y
por 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.fonte
#//.x_:>(y=IntegerDigits@Echo@x).++y/2&
. (. ... talvez Por alguma razão, TIO não gosta disso, mas está bem Mathematica com isso?)#//.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.Ohm v2 ,
97 bytesExperimente online!
Explicação
fonte
u
desnecessário?}
não irá dividir os dígitosRetina , 21 bytes
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
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 isso1
),:
imprime o número antes de cada iteração e;
impede que o resultado final seja impresso duas vezes no final do programa. EssaG
é apenas a minha maneira usual de criar um estágio sem operação.Converta cada dígito em unário e coloque-o em sua própria linha.
Calcule o número triangular em cada linha, substituindo cada um
1
pelo seu prefixo. Também poderíamos usarM!&`1+
aqui, o que nos dá todos os sufixos de cada linha.Conte todos os
1
s, que soma todos os números triangulares e converte o resultado novamente em decimal.fonte
Ruby,
60 4742 bytes-13 bytes de @JustinMariner
-5 bytes por @GB
Experimente online!
fonte
[*...]
) e mudança(k+1)
para-~k
salvar 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!.map
que não poderia receber arrays.Befunge-93 , 51 bytes
Experimente online!
James Holderness inteligentemente reformulou meu programa em uma forma de 51 bytes. Obrigado!
fonte
Pushy ,
24222117 bytesExperimente online!
Explicação
fonte
Japonês ,
1917 bytesRecebe a entrada como uma matriz de elemento único.
Tente
fonte
R , 70 bytes
Experimente online!
Retorna o valor original também.
R , 80 bytes
Experimente online!
Não retorna o valor original.
fonte
Lua , 91 bytes
Experimente online!
fonte
05AB1E ,
2012 bytesGuardado 2 bytes graças a caird coinheringaahing
Experimente online!
Explicação
(versão antiga)
fonte
JavaScript,
6157 bytesExperimente online!
fonte
Python 2 , 69 bytes
Experimente online!
fonte
Carvão , 18 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
fonte
dc , 62 bytes
Experimente online!
fonte
k , 19 bytes
Sem surpresa, funciona de maneira semelhante às soluções APL e J já publicadas
fonte
Geléia , 7 bytes
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 eS
: Sum (µ
apenas cria uma nova cadeia monádica)fonte
dc, 31 bytes
A função
m
calcula a função digitangular de sua entrada;f
repete 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
fonte
Python 2 , 76 bytes
Experimente online!
fonte
Neim , 8 bytes
Explicação:
Experimente online!
Saída formatada
fonte
D , 140 bytes
Experimente online!
fonte
PHP, 71 + 1 bytes
Execute como pipe
-nR
ou experimente online . (requer PHP 5.3 ou posterior para o operador Elvis)fonte
A?:B
: se A é verdade, então A else BAdicionar ++ , 32 bytes
Experimente online!
Não gera o primeiro valor
Como funciona
fonte
Perl 6 , 36 bytes
Experimente online!
Inclui o número de entrada na lista de saída.
fonte