( Relacionado )
Dado um número inteiro n > 1
,
1) Construa o intervalo de números n, n-1, n-2, ... 3, 2, 1
e calcule a soma
2) Pegue os dígitos individuais desse número e calcule o produto
3) Pegue os dígitos individuais desse número e calcule a soma
4) Repita as etapas 2 e 3 até você atingir um único dígito. Esse dígito é o resultado.
Os primeiros vinte termos da sequência estão abaixo:
3, 6, 0, 5, 2, 7, 9, 2, 7, 9, 1, 9, 0, 0, 9, 6, 7, 0, 0, 6
Nota: Esta sequência NÃO está no OEIS.
E / S e regras
- Os números ficarão muito grandes rapidamente, portanto, a solução deve ser capaz de lidar com números de entrada de até 100.000 sem falhas (tudo bem se o seu código aguentar além disso).
- A entrada e saída podem ser fornecidas por qualquer método conveniente .
- Um programa completo ou uma função são aceitáveis. Se uma função, você pode retornar a saída em vez de imprimi-la.
- As brechas padrão são proibidas.
- Isso é código-golfe, portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
Exemplos
n output
1234 9
3005 3
5007 5
9854 8
75849 8
100000 0
code-golf
sequence
number-theory
AdmBorkBork
fonte
fonte
n
. A solução postada apenas precisa funcionar atén = 100000
.Numbers will get very large quickly
não, nãoRespostas:
Python 2 ,
7772716260 bytesGraças a @xnor por jogar fora 2 bytes!
Experimente online!
fonte
repeat until you reach a single digit
?236172
; e esse é o único abaixo de 1 milhão.05AB1E , 7 bytes
Experimente online!
Exlpanação
fonte
Gelatina , 8 bytes
Experimente online!
Programa completo (retorna uma matriz singleton contendo o resultado, mas os colchetes não são visíveis no STDOUT).
fonte
MATL ,
1513 bytesEm homenagem ao idioma do mês :
Experimente online!
Eu não acho que exista uma maneira mais simples de obter os dígitos de um número do que converter o número em uma string
V
, transpor e transpor!
esse vetor vertical de volta para um numéricoU
.Economizou 2 bytes graças ao próprio Criador 1 ! Eu esqueci o fim implícito, o que significa que eu poderia remover
]
e, em vez de comparar o número de elementos1
, eu poderia simplesmente diminuir esse valor e usá-lo como um booleano diretamente.Então, a explicação é assim:
1 ... de MATL, Luis Mendo.
fonte
JavaScript (ES6), 60 bytes
Experimente online!
Comentado
Versão alternativa, 59 bytes (não concorrente)
Uma versão não recursiva que funciona apenas para n <236172 . (Ele cobre o intervalo solicitado, mas não se qualifica como um algoritmo genérico válido.)
Experimente online!
fonte
Number.MAX_SAFE_INTEGER ** 0.5 ~= 94906265
.Haskell ,
7271 63 bytesGraças a @BMO por um byte e @nimi por 8 bytes!
Experimente online!
fonte
Stax ,
141310 bytesExecute e depure
Foi muito divertido de fazer. Gostaria de saber se existe uma maneira mais concisa de fazer a comparação no final.
Explicação
-1 bytes graças a ovs
-3 bytes graças ao Scrooble
fonte
R ,
152 130109 bytesExperimente online!
A Giuseppe encontrou
2142 bytes com várias coisas de R que eu ainda não estou acostumada, junto com uma maneira de obter os dígitos de um número sem forçar a string e voltar e com menos bytes!options(scipen=9)
sefoi necessário para o caso de 9854 para a função de idade, porque a primeira fase de produto acaba como 80000, o qual R gravuras como 8e + 05.fonte
scipen
: Experimente online ! note quemax(0,log10(x))
é porque sex=0
, entãolog10(0)=-Inf
isso causa um erro.Pitão , 11 bytes
Experimente aqui!
fonte
Carvão , 18 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Soma os números inteiros até a entrada.
Enquanto o resultado for maior que 9, pegue a soma dos dígitos do produto dos dígitos.
Transmitir o resultado para string e imprimi-lo implicitamente.
fonte
Gaia , 8 bytes
Experimente online!
A explicação antiga (antes de corrigir um bug que é culpa de Gaia, IMO: P):
Guardado 1 byte graças a Dennis .
fonte
┅⟨ΣΠ⟩°
salva um byte.4
0
resultados[]
por algum motivo :(F #, 175 bytes
Experimente online!
A única ressalva à função é que o valor de entrada deve ser do tipo
uint64
.Ungolfed é um pouco assim:
A função
d n
converte o númeron
em seus dígitos do componente. Ele primeiro se converte em uma sequência e depois obtém cada caractere na sequência. Cada caractere deve ser convertido novamente em uma seqüência de caracteres, caso contrário, os caracteres serão convertidos em seus valores ASCII em vez de em seus valores "reais".A
c n
função é a função principal, comn
o valor inicial. Nesta funçãor
é o nosso valor atual. Owhile
loop faz o seguinte:r
em seus dígitos componentes (d r
).Seq.reduce
uma função com o valor acumulado (a
) e o próximo valor na sequência (x
) e, nesse caso, retorna o produto. O valor inicial é o primeiro elemento na sequência.d
).r
.fonte
Befunge, 136 bytes
Você pode tentar aqui .
Embora nem todos os intérpretes tenham um tamanho de célula grande o suficiente, ele funciona com números pequenos para praticamente qualquer pessoa. Para um número maior de
n
você pode precisar de um intérprete como o BefunExec .fonte
Gol> <> ,
3533 bytesExperimente online!
-2 bytes por Jo King.
Uso extensivo de funções e loops infinitos implícitos.
Exemplo de programa completo e como funciona
fonte
Japonês,
161413 bytesTente
Explicação
fonte
Casca , 7 bytes
Experimente online!
fonte
PHP 7, 89 bytes
Execute como pipe
-r
ou experimente online .+
cast para int para~
funcionar como desejado.for()
vez dedo ... while()
.O PHP mais antigo requer mais um byte:
for($s=str_split,$a=...;$a>9;)$a=array_sum($s(...));
(Não atribuir
str_split
a uma variável de modo algum desperdiçaria outro byte.)fonte
Perl 6 , 49 bytes
Experimente online!
fonte
[*](.comb).comb
vez de([*] .comb).comb
Tcl , 118 bytes
Experimente online!
fonte
Núcleo do PowerShell ,
91 10193 bytesExperimente online!
Ungolfed um pouco ...
Os primeiros passos foram dividir os números inteiros em dígitos - fiz isso dividindo o número inteiro em uma matriz de
caracteresdecadeias. Posteriormente, insira o operando e avalie a sequência como um comando. Então, é uma questão de fazer o ciclo de adição múltipla até que a entrada tenha um dígito.iex
é um alias para oInvoke-Command
qual avalia uma sequência passada na primeira posição de parâmetro.Editar: conforme solicitado por @AdmBorkBork , adicionei um cabeçalho de função à contagem de bytes. Além disso, fiz um pouco de matemática e percebi que um limite superior para o número de iterações é
< log log 10^6 < log 6 < 2
, de modo a economizar outros seis bytes.Edite x2: o @AdmBorkBork encontrou uma maneira mais concisa de converter o número inteiro em uma expressão matemática e, em seguida, sugeriu encaminhá-lo para
iex
. Isso economizou 8 bytes. Obrigado!fonte
Function F($a){ }
na sua contagem de bytes. No entanto, você deve conseguir economizar alguns usando, em[char[]]
vez de-split''-ne''
, eu acho.[char[]]1234=Ӓ
, que é inválido; Talvez eu consiga fazê-lo funcionar, mas pode não ser óbvio agora. Obrigado pela sugestão![char[]]"$o"
e um|iex
pouco do queiex( )
.Perl 5
-p
, 61 bytesExperimente online!
fonte
Ruby , 57 bytes
Experimente online!
fonte
Java 8, 129 bytes
Experimente online.
Explicação:
fonte
Julia 0.6 , 56 bytes
Experimente online!
Bem simples: calcule
(n+1)n÷2
a soma de 1..n, verifique se é um número de um dígito (>9
); caso contrário, tente novamente com k definido como a soma dos dígitos do produto dos dígitos de k, caso contrário, retorne k.fonte