Mini-golfe de segunda-feira: Uma série de perguntas curtas sobre código de golfe , postadas (espero!) Toda segunda-feira.
(Desculpe, estou atrasado novamente; eu estava longe do meu computador basicamente ontem e hoje.)
Nós programadores (especialmente os jogadores de código) certamente adoram seqüências inteiras arbitrárias. Temos até um site inteiro dedicado a essas sequências que atualmente possui cerca de 200.000 entradas. Neste desafio, implementaremos mais um conjunto dessas seqüências.
Desafio
Seu desafio é escrever um programa ou função que receba um número inteiro N e produza uma sequência de números inteiros de base 10, onde cada próximo número inteiro é determinado da seguinte maneira:
- Comece em 1.
Para cada dígito D na representação base 10 do número anterior:
- Se D for 0, adicione um ao número inteiro atual.
- Caso contrário, multiplicar o número inteiro corrente por D .
Detalhes
- Você pode assumir que 0 < N <2 31 .
- Você deve gerar cada número inteiro na sequência, começando com o número de entrada, até que um número menor que 10 seja alcançado.
- A saída pode ser uma matriz ou uma sequência separada por espaços, vírgulas, novas linhas ou uma combinação delas.
- Um espaço à direita e / ou nova linha é permitido, mas não uma vírgula à direita.
- Nunca deve haver zeros à esquerda.
Exemplos
Exemplo 1: 77
Este exemplo é bastante direto:
77 = 1*7*7 = 49
49 = 1*4*9 = 36
36 = 1*3*6 = 18
18 = 1*1*8 = 8
Assim, a saída adequada é 77 49 36 18 8
.
Exemplo 2: 90
Aqui temos:
90 = 1*9+1 = 10
10 = 1*1+1 = 2
Então a saída seria 90 10 2
.
Exemplo 3: 806
Leia as equações da esquerda para a direita:
806 = 1*8+1*6 = 54 (((1*8)+1)*6)
54 = 1*5*4 = 20
20 = 1*2+1 = 3
A saída deve ser 806 54 20 3
.
Casos de teste
O primeiro número em cada linha é a entrada e a linha completa é a saída esperada.
77 49 36 18 8
90 10 2
249 72 14 4
806 54 20 3
1337 63 18 8
9999 6561 180 9
10000 5
8675309 45369 3240 25 10 2
9999999 4782969 217728 1568 240 9
1234567890 362881 2304 28 16 6
Como referência, aqui estão os próximos inteiros adequados de 10 a 100:
Current | Next
--------+-----
10 | 2
11 | 1
12 | 2
13 | 3
14 | 4
15 | 5
16 | 6
17 | 7
18 | 8
19 | 9
20 | 3
21 | 2
22 | 4
23 | 6
24 | 8
25 | 10
26 | 12
27 | 14
28 | 16
29 | 18
30 | 4
31 | 3
32 | 6
33 | 9
34 | 12
35 | 15
36 | 18
37 | 21
38 | 24
39 | 27
40 | 5
41 | 4
42 | 8
43 | 12
44 | 16
45 | 20
46 | 24
47 | 28
48 | 32
49 | 36
50 | 6
51 | 5
52 | 10
53 | 15
54 | 20
55 | 25
56 | 30
57 | 35
58 | 40
59 | 45
60 | 7
61 | 6
62 | 12
63 | 18
64 | 24
65 | 30
66 | 36
67 | 42
68 | 48
69 | 54
70 | 8
71 | 7
72 | 14
73 | 21
74 | 28
75 | 35
76 | 42
77 | 49
78 | 56
79 | 63
80 | 9
81 | 8
82 | 16
83 | 24
84 | 32
85 | 40
86 | 48
87 | 56
88 | 64
89 | 72
90 | 10
91 | 9
92 | 18
93 | 27
94 | 36
95 | 45
96 | 54
97 | 63
98 | 72
99 | 81
100 | 3
Você pode encontrar esta lista expandida para 10000 aqui .
Pontuação
Este é o code-golf , pelo que o código válido mais curto em bytes vence. O desempatador vai para o envio que atingiu sua contagem final de bytes primeiro. O vencedor será escolhido na próxima segunda-feira, 19 de outubro. Boa sorte!
Edit: Parabéns ao seu vencedor, @isaacg , usando Pyth novamente por 14 bytes !
|*GHhG
salva um byte?H*GHhG
.PowerShell,
9291908887 bytesfonte
(...)
para alavancar a saída automática ... Vou precisar lembrar disso no futuro.Pip ,
282523 bytesPega um número como argumento da linha de comando e gera a sequência em linhas sucessivas.
Explicação:
Agora, fico feliz por ter mudado
P
de uma declaração para um operador várias revisões atrás.Pa
é uma expressão que avaliaa
o valor de mas também o gera, para que eu possa imprimira
e testar simultaneamente se é menor que dez usandot>Pa
.fonte
CJam,
26252422 bytesou
Experimente online.
Como funciona
Ambos os programas fazem essencialmente o mesmo; a primeira é uma abordagem recursiva, a segunda é iterativa. Vou explicar o primeiro, que considero mais interessante.
fonte
Minkolang 0.7 ,
5246 bytesWoohoo loops aninhados!
Explicação
fonte
Mathematica, 66 bytes
fonte
Python 3, 74,
76bytesJá havia uma resposta em Python aqui com redução, então eu queria fazer uma sem ela. Deve ser chamado com um int.
fonte
Python,
8580 bytesIsso agora imprime corretamente a lista inteira, em vez de apenas o primeiro valor.
fonte
g=
.K5 , 24 bytes
Reunir uma lista de itens enquanto itera para um ponto fixo é exatamente o que o operador de digitalização
\
faz. Em cada iteração, primeiro converto o número em uma sequência e depois avalio cada caractere (.:'$:
), explodindo o número em seus dígitos. Então eu executo uma redução (/
) começando com 1 e usando o lambda{(x*y;x+1)@~y}
. Nesse caso,x
é o valor redutor ey
cada termo sucessivo da sequência.Em ação:
fonte
Julia,
938988868377 bytesIsso cria uma função recursiva
f
que imprime os elementos de sequência em linhas separadas.Ungolfed:
Experimente online
Economizou 6 bytes graças a Dennis!
fonte
n>9
em conformidade com o segundo exemplo. Além disso,f(n)=(println(n);if(d=n>9)for i=reverse(digits(n)) i<1?d+=1:d*=i end;f(d)end)
é um pouco menor.Ruby
83, 72 bytesOriginal declarado como uma função:
Eu tentei usar,
Enumerator.new
mas ele usa tantos bytes :-(Melhorado usando recursão:
fonte
C # e LINQ,
165146 bytesj (para jarvis) é a função recursiva. r é a lista de int do resultado.
testado no LINQPAD:
fonte
int n = 1
pode serint n=1
, etc.Haskell, 71 bytes
Uso:
g 8675309
->[8675309,45369,3240,25,10,2]
.fonte
Matlab, 108
fonte
Java 8, 148 bytes
formatado
fonte
Geléia , 9 bytes
Experimente online!
fonte