Inspirado por esta pergunta em Math.SE .
Começando com 1
você pode executar repetidamente uma das duas operações a seguir:
Dobre o número.
ou
Reorganize seus dígitos da maneira que desejar, exceto que não deve haver zeros à esquerda.
Tomando um exemplo da postagem vinculada do Math.SE, podemos acessar 1000
as seguintes etapas:
1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 125, 250, 500, 1000
Quais números você pode alcançar com esse processo e qual é a solução mais curta?
O desafio
Dado um número inteiro positivo N
, determine a menor seqüência possível de números inteiros para alcançar N
com o processo acima, se possível. Se houver várias soluções ideais, produza qualquer uma delas. Se essa sequência não existir, você deve exibir uma lista vazia.
A sequência pode estar em qualquer formato conveniente, inequívoco de sequência ou lista.
Você pode escrever um programa ou função, recebendo entrada via STDIN (ou alternativa mais próxima), argumento da linha de comando ou argumento da função e emitindo o resultado via STDOUT (ou alternativa mais próxima), valor de retorno da função ou parâmetro da função (saída).
Isso é código de golfe, então a resposta mais curta (em bytes) vence.
Casos de teste
Aqui está uma lista de todos os números alcançáveis, incluindo 256. A primeira coluna é o número (sua entrada), a segunda coluna é o número ideal de etapas (que você pode usar para verificar a validade da sua solução) e a terceira coluna é uma sequência ideal para chegar lá:
1 1 {1}
2 2 {1,2}
4 3 {1,2,4}
8 4 {1,2,4,8}
16 5 {1,2,4,8,16}
23 7 {1,2,4,8,16,32,23}
29 10 {1,2,4,8,16,32,23,46,92,29}
32 6 {1,2,4,8,16,32}
46 8 {1,2,4,8,16,32,23,46}
58 11 {1,2,4,8,16,32,23,46,92,29,58}
61 6 {1,2,4,8,16,61}
64 7 {1,2,4,8,16,32,64}
85 12 {1,2,4,8,16,32,23,46,92,29,58,85}
92 9 {1,2,4,8,16,32,23,46,92}
104 15 {1,2,4,8,16,32,64,128,256,512,125,250,205,410,104}
106 14 {1,2,4,8,16,32,64,128,256,265,530,305,610,106}
107 14 {1,2,4,8,16,32,23,46,92,29,58,85,170,107}
109 18 {1,2,4,8,16,32,23,46,92,184,368,386,772,277,554,455,910,109}
116 12 {1,2,4,8,16,32,23,46,92,29,58,116}
122 7 {1,2,4,8,16,61,122}
124 16 {1,2,4,8,16,32,23,46,92,29,58,85,170,107,214,124}
125 11 {1,2,4,8,16,32,64,128,256,512,125}
128 8 {1,2,4,8,16,32,64,128}
136 18 {1,2,4,8,16,32,23,46,92,184,148,296,592,259,518,158,316,136}
140 15 {1,2,4,8,16,32,64,128,256,512,125,250,205,410,140}
142 16 {1,2,4,8,16,32,23,46,92,29,58,85,170,107,214,142}
145 17 {1,2,4,8,16,32,23,46,92,184,368,736,376,752,257,514,145}
146 18 {1,2,4,8,16,32,64,128,256,512,125,250,205,410,104,208,416,146}
148 11 {1,2,4,8,16,32,23,46,92,184,148}
149 16 {1,2,4,8,16,32,64,128,182,364,728,287,574,457,914,149}
152 11 {1,2,4,8,16,32,64,128,256,512,152}
154 17 {1,2,4,8,16,32,23,46,92,184,368,736,376,752,257,514,154}
158 16 {1,2,4,8,16,32,23,46,92,184,148,296,592,259,518,158}
160 14 {1,2,4,8,16,32,64,128,256,265,530,305,610,160}
161 13 {1,2,4,8,16,32,23,46,92,29,58,116,161}
163 18 {1,2,4,8,16,32,23,46,92,184,148,296,592,259,518,158,316,163}
164 18 {1,2,4,8,16,32,64,128,256,512,125,250,205,410,104,208,416,164}
166 20 {1,2,4,8,16,32,23,46,92,184,368,736,376,752,257,514,154,308,616,166}
167 17 {1,2,4,8,16,32,23,46,92,184,148,296,269,538,358,716,167}
169 23 {1,2,4,8,16,32,64,128,256,512,125,250,205,410,104,208,416,461,922,229,458,916,169}
170 13 {1,2,4,8,16,32,23,46,92,29,58,85,170}
176 17 {1,2,4,8,16,32,23,46,92,184,148,296,269,538,358,716,176}
182 9 {1,2,4,8,16,32,64,128,182}
184 10 {1,2,4,8,16,32,23,46,92,184}
185 16 {1,2,4,8,16,32,23,46,92,184,148,296,592,259,518,185}
188 23 {1,2,4,8,16,32,23,46,92,184,148,296,592,259,518,185,370,740,470,940,409,818,188}
190 18 {1,2,4,8,16,32,23,46,92,184,368,386,772,277,554,455,910,190}
194 16 {1,2,4,8,16,32,64,128,182,364,728,287,574,457,914,194}
196 23 {1,2,4,8,16,32,64,128,256,512,125,250,205,410,104,208,416,461,922,229,458,916,196}
203 16 {1,2,4,8,16,32,64,128,256,265,530,305,610,160,320,203}
205 13 {1,2,4,8,16,32,64,128,256,512,125,250,205}
208 16 {1,2,4,8,16,32,64,128,256,512,125,250,205,410,104,208}
209 19 {1,2,4,8,16,32,23,46,92,184,368,736,376,752,257,514,145,290,209}
212 8 {1,2,4,8,16,61,122,212}
214 15 {1,2,4,8,16,32,23,46,92,29,58,85,170,107,214}
215 11 {1,2,4,8,16,32,64,128,256,512,215}
218 9 {1,2,4,8,16,32,64,128,218}
221 8 {1,2,4,8,16,61,122,221}
223 14 {1,2,4,8,16,32,23,46,92,29,58,116,232,223}
227 20 {1,2,4,8,16,32,23,46,92,184,148,296,592,259,518,158,316,361,722,227}
229 20 {1,2,4,8,16,32,64,128,256,512,125,250,205,410,104,208,416,461,922,229}
230 16 {1,2,4,8,16,32,64,128,256,265,530,305,610,160,320,230}
232 13 {1,2,4,8,16,32,23,46,92,29,58,116,232}
233 22 {1,2,4,8,16,32,23,46,92,184,368,736,376,752,257,514,154,308,616,166,332,233}
235 19 {1,2,4,8,16,32,23,46,92,184,148,296,269,538,358,716,176,352,235}
236 19 {1,2,4,8,16,32,23,46,92,184,148,296,592,259,518,158,316,632,236}
238 19 {1,2,4,8,16,32,64,128,256,512,125,250,205,410,104,208,416,832,238}
239 25 {1,2,4,8,16,32,23,46,92,184,368,736,376,752,257,514,154,308,616,166,332,233,466,932,239}
241 16 {1,2,4,8,16,32,23,46,92,29,58,85,170,107,214,241}
244 8 {1,2,4,8,16,61,122,244}
247 21 {1,2,4,8,16,32,23,46,92,184,148,296,592,259,518,158,316,632,362,724,247}
248 17 {1,2,4,8,16,32,23,46,92,29,58,85,170,107,214,124,248}
250 12 {1,2,4,8,16,32,64,128,256,512,125,250}
251 11 {1,2,4,8,16,32,64,128,256,512,251}
253 19 {1,2,4,8,16,32,23,46,92,184,148,296,269,538,358,716,176,352,253}
256 9 {1,2,4,8,16,32,64,128,256}
Se você deseja ainda mais dados de teste, aqui está a mesma tabela, incluindo 1.000 .
Qualquer número que não apareça nessas tabelas deve gerar uma lista vazia (desde que o número esteja no intervalo da tabela).
fonte
Respostas:
Pitão, 43 bytes
Demonstração.
Isso começa gerando todas as sequências duplas ou reorganizadas possíveis. No entanto, como eu realmente queria vê-lo terminar, adicionei um curto-circuito.
Ele é executado até encontrar uma solução ou para um número de iterações iguais à entrada; nesse ponto, ele desiste e retorna
[]
.É garantido que sejam iterações suficientes. Primeiro, sabemos que essas muitas iterações são suficientes para todos n <= 1000, graças aos resultados do exemplo. Para números maiores, o seguinte argumento é válido:
Primeiro, cada etapa do processo deve manter ou aumentar o número de dígitos.
Segundo, três números que são todos rearranjos um do outro nunca podem aparecer em uma sequência mais curta, porque teria sido mais rápido fazer apenas um rearranjo do primeiro ao último.
Terceiro, todos os múltiplos de 3 são inacessíveis, porque nem a duplicação nem o rearranjo podem produzir um múltiplo de 3 a partir de um não múltiplo de 3.
Assim, a sequência mais longa possível que termina em um determinado número é igual à soma do dobro do número de conjuntos de dígitos com menos ou igual a tantos dígitos quanto a entrada e onde os dígitos não somam um múltiplo de 3.
O número desses conjuntos de dígitos para cada número de dígitos:
Além disso, sabemos pelos exemplos que nenhuma sequência mais curta que termina com um número de 3 dígitos é maior que 26. Assim, um limite superior dos comprimentos da sequência é:
Em cada caso, o limite superior é menor que qualquer número com o número de dígitos
O número de conjuntos de dígitos não pode aumentar mais do que um fator de 10 quando o número de dígitos é aumentado em um, porque os novos números podem ser separados em grupos pelo último dígito, cada um dos quais não pode ter mais conjuntos do que havia com menos um. dígito.
Portanto, o limite superior será menor que qualquer número com tantos dígitos para todos os números possíveis de dígitos maiores ou iguais a 4, o que completa a prova de que sempre é suficiente um número de iterações iguais à entrada.
fonte
SWI-Prolog, 252 bytes
Exemplo:
a(92,Z).
saídasZ = [1, 2, 4, 8, 16, 32, 64, 46, 92]
Ainda não verifiquei se isso funciona para N> 99 por causa do tempo que leva, mas não vejo razão para que não funcione.
fonte
Julia,
306245218 bytesAinda trabalhando nisso. Fornecerá uma versão não destruída assim que terminar.
fonte
Haskell, 246 bytes
Não tenho muita certeza se isso funciona, mas se a sequência que primeiro diverge mais baixo (como classificada abaixo) é sempre mais curta, como por exemplo
[1,2,4,8,16,32,64,128,256,512,125,250,500,1000]
é mais curto que
[1,2,4,8,16,32,64,128,256,512,251,502,250,500,1000]
que eu testei para ser verdade até 1000.
fonte
Bytes em C # 655
Ligue para (LinqPad):
Não testou números acima de 99. Se você tiver tempo -> boa sorte ;-)
edit: versão não destruída:
fonte
CJam, 83
Experimente online
Estou sentado nisso há um longo tempo, não é muito curto nem rápido, e não tenho certeza se tenho energia / motivação para melhorá-lo, então estou postando.
fonte