Persistência Multiplicativa
- Multiplique todos os dígitos em um número
- Repita até que você tenha um único dígito restante
Conforme explicado por Numberphile :
- Numberphile "O que há de especial no 277777788888899?"
- Numberphile "Persistência multiplicativa (metragem extra)"
Exemplo
- 277777788888899 → 2x7x7x7x7x7x7x8x8x8x8x8x8x9x9 = 4996238671872
- 4996238671872 → 4x9x9x6x2x3x8x6x7x1x8x7x2 = 438939648
- 438939648 → 4x3x8x9x3x9x6x4x8 = 4478976
- 4478976 → 4x4x7x8x9x7x6 = 338688
- 338688 → 3x3x8x6x8x8 = 27648
- 27648 → 2x7x6x4x8 = 2688
- 2688 → 2x6x8x8 = 768
- 768 → 7x6x8 = 336
- 336 → 3x3x6 = 54
- 54 → 5x4 = 20
- 20 → 2x0 = 0
A propósito, este é o registro atual: o menor número com o maior número de etapas.
Golfe
Um programa que pega qualquer número inteiro como entrada e, em seguida, gera o resultado de cada etapa, começando com a própria entrada, até atingirmos um único dígito. Para 277777788888899, a saída deve ser
277777788888899
4996238671872
438939648
4478976
338688
27648
2688
768
336
54
20
0
(Contar o número de etapas é deixado como um exercício para o usuário).
Mais exemplos
De A003001 :
25
10
0
A partir de A003001 também:
68889
27648
2688
768
336
54
20
0
Do Numberphile vídeo:
327
42
8
Portanto, houve uma pergunta sobre a persistência aditiva , mas essa é a persistência multiplicativa. Além disso, essa pergunta pede o número de etapas como saída, enquanto estou interessado em ver os resultados intermediários.
Respostas:
Gelatina , 4 bytes
Experimente online!
Explicação
Como bônus, aqui está um TIO que encontrará os números com o maior número de etapas para um determinado intervalo de números de dígitos. Escala bem mesmo no TIO.
fonte
TI-BASIC (TI-84),
303231 bytes-1 byte graças a @SolomonUcko!
A entrada é no
Ans
.A saída é exibida como as solicitações de desafio. O final
Ans
é necessário para imprimir a última etapa.Admito que não pensei nessa fórmula, mas a encontrei aqui e a modifiquei para melhor atender ao desafio.
EDIT: Ao reler o desafio, percebi que o programa deve terminar se o produto tiver um dígito. Portanto, 2 bytes deveriam ser adicionados para explicar isso.
Exemplo:
Explicação:
Modelo Visual:
Ans
começa como125673
.Este modelo cobre apenas a lógica por trás da multiplicação dos dígitos; tudo o resto é mais fácil de entender.
Notas:
TI-BASIC é uma linguagem tokenizada. Contagem de caracteres não é igual à contagem de bytes.
10^(
é esse token de um byte .Este programa não fornecerá a sequência correta de produtos com números inteiros maiores que 14 dígitos, devido às limitações da precisão decimal nas calculadoras de TI.
fonte
10^(
foraseq(
e omitindo o parêntese de fechamento?K (ngn / k) , 9 bytes
Experimente online!
{
}\
continue aplicando a função entre chaves até a sequência convergir$x
formate o argumento como uma sequência (lista de caracteres).'
avaliar cada um (outros dialetos de k requerem dois pontos.:'
)*/
vezes, ou seja, produtofonte
dzaima / APL ,
1411 bytesExperimente online!
fonte
R , 59 bytes
Experimente online!
Como
print
invisibly
retorna sua entrada, podemos usarprint(n)
dentro dowhile
loop para simular umdo-while
loop. Isto é inspirado por uma das minhas dicas para golfe em R .O cabeçalho ajuda a impedir que grandes números sejam impressos em notação científica.
fonte
05AB1E ,
74 bytesExperimente online ou verifique todos os casos de teste .
Explicação:
fonte
Wolfram Language (Mathematica) , 47 bytes
Experimente online!
fonte
Wolfram Language (Mathematica) , 45 bytes
Experimente online!
fonte
Echo
.Perl 6 , 23 bytes
Experimente online!
fonte
Python 2 ,
4643 bytes-3 graças a xnor (comparação encadeada)
Experimente online!
fonte
>
no lugar deand
.PowerShell , 54 bytes
Experimente online!
Método iterativo que primeiro grava o argumento de entrada, depois o converte em uma string e o canaliza em uma matriz de caracteres. Essa matriz é unida por um único asterisco e é executada como um comando com o alias da expressão de chamada. Como isso escreve o número inicial até o último número maior que 0, (20, no cenário de teste fornecido), adiciono uma final
$a
ao final na saída.fonte
C # (compilador interativo do Visual C #) ,
797468 bytesEu tento ficar longe da recursão em C # devido ao tempo que a declaração do método é, mas nesse caso ela salva em comparação com um loop.
Experimente online!
fonte
PHP , 63 bytes
Versão iterativa, ligue com
php -nF
entrada deSTDIN
.Experimente online!
PHP ,
7271 bytesExperimente online!
Versão recursiva, como função.
Entrada: 277777788888899
Entrada: 23
fonte
Python 2 ,
616259 bytesExperimente online!
-3 bytes, graças a Jonathan Allan
fonte
int.__mul__
é três bytes menor quelambda a,b:a*b
f(reduce(int.__mul__,map(int,`n`)))
paraf(eval('*'.join(`n`)))
para salvar 13 bytes.perl 5 (
-n
-M5.01
),323025 bytes25 bytes
30 bytes
32 bytes
fonte
-lpF//
-lpF//
, atualizandoMathGolf ,
910 bytesExperimente online!
Agora, ele manipula corretamente entradas com um dígito. Não é perfeito, mas pelo menos está correto.
Explicação
fonte
Julia 0,7 ,
3633 bytesExperimente online!
Graças a H.PWiz por -3 bytes.
fonte
[n;f(prod(digits(n)))]
JavaScript (ES6), 45 bytes
Retorna uma matriz de números inteiros.
Experimente online!
fonte
PowerShell , 51 bytes
Experimente online!
fonte
APL (NARS), 19 caracteres, 38 bytes
teste:
fonte
Haskell, 45 bytes
Experimente online!
fonte
J , 16 bytes
Experimente online!
fonte
Ruby ,
383534 bytesExperimente online!
1 byte salvo por G B.
fonte
Japt
-R
, 9 bytesHorrivelmente ineficiente - nem tente executar o primeiro caso de teste!
Tente
fonte
Braquilog , 7 bytes
Experimente online!
Explicação
fonte
JavaScript (Nó Babel) , 46 bytes
Experimente online!
JavaScript (Nó Babel) , 44 bytes
Se a entrada puder ser tomada como String
Experimente online!
fonte
PowerShell ,
6459 bytesExperimente online!
Método iterativo. Pega a entrada e a armazena
$a
, depois entra em umfor
loop desde que o comprimento de$a
seja dois ou mais (ou seja, é maior que9
). Dentro do loop, produzimos$a
e depois o recalculamos, convertendo-o emt
CharArray
,join
juntando-o com*
, e depoisiex
(abreviação deInvoke-Expression
e semelhante aeval
). Uma vez que estamos fora do circuito, temos um único dígito para imprimir, então colocamos$a
no pipeline novamente.-5 bytes graças ao KGlasier.
fonte
9-lt$a
vez de$a.length-1
salvar 5 bytes. E se você não seguisse o tempo todo, poderia cortar um pedaço decente. Confira minha tentativa de PowerShell, se quiser!Carvão vegetal , 13 bytes
Experimente online! Link é a versão detalhada do código. Explicação:
Imprima a entrada pela primeira vez.
Repita enquanto o comprimento da entrada não for 1.
Substitua a entrada pelo seu produto digital convertido em string.
Imprima a entrada em uma nova linha.
fonte
Retina , 24 bytes
Experimente online! Explicação:
Imprima o valor atual em sua própria linha no início de cada loop até que ele pare de mudar e não imprima o valor inalterado duas vezes. Avalie o valor atual no final de cada loop.
Adicione um
*
após cada dígito.Termine de transformar a entrada em uma expressão que seja avaliada para o produto digital.
Apenas para o registro, o Retina pode fazer isso em uma linha (25 bytes):
fonte
C (gcc) , 58 bytes
Experimente online!
A abordagem iterativa acaba sendo 1 byte menor.
C (gcc) ,
6159 bytes (recursivo)Experimente online!
A recursão parece ser mais curta que a iteração para impressão e etapa ...fonte