Eu tenho um balcão. É um pequeno dispositivo que se parece com isso:
O visor passa de 0000
para 9999
. Possui um pequeno botão na parte superior que aumenta a contagem em 1 e um pequeno botão à direita, cujo objetivo é redefinir o contador de volta para 0.
Agora, o importante sobre o pequeno botão é que, se você o girar para trás, poderá aumentar qualquer dígito que desejar, depois que o girar novamente. Portanto, se eu pressionar o botão do contador 10 vezes para que o contador apareça 0010
, posso girar o botão para trás até ouvir um pequeno clique, depois girá-lo para frente novamente e fazê-lo ir direto para 0090
.
Porém, o botão sempre aumentará todas as ocorrências do mesmo dígito em 1 sempre que empurrar os números para frente. Portanto, se o contador aparecer 6060
, você só poderá aumentar para7070
, não para 6070
ou 7060
. Além disso, o botão vai rolar 9
s sobre a 0
sem proceder, assim 0990
irá avançar para 0000
, em vez de 1000
ou 1100
.
Quero saber a maneira mais eficiente de definir o contador para um determinado número. Sua tarefa é escrever um programa ou função que determine a menor seqüência de pressionamentos de botões e avanços dos botões necessários para fazê-lo.
Seu programa terá como entrada um número de 4 dígitos de 0000
a 9999
e retornará uma série de etapas no seguinte formato:
> 0001
C
> 0093
C12345678C12345678CCC
> 1000
C12345678C12345678C12345678C12345678C12345678C12345678C12345678C
> 9999
012345678
Onde C
significa "pressione o botão do contador" e qualquer dígito D
de 0 a 9 significa "use o botão para avançar todas as ocorrências de D
1".
Seu programa deve produzir uma sequência válida de etapas para todas as combinações possíveis de quatro dígitos e será pontuado pelo número total de etapas necessárias para todos os 10.000 casos. No caso de empate (provavelmente quando o algoritmo ideal for encontrado), o código mais curto vencerá.
fonte
0010
em0020
nesse caso? Ou você só pode girar o botão para trás? E também, cada "D" conta como número "D" de avanços do botão (por exemplo,1234567
significa girar o botão 1 vez, depois 2 vezes, depois 3 vezes, etc.)? Ou significa apenas cada giro do botão separado (por exemplo, significa1234567
apenas girar o botão 7 vezes)?Respostas:
Lua, 327763 etapas (ideal, 276 bytes)
Versão Golfed:
Versão aprimorada dos exemplos em questão (apenas
1000
aprimorada):Versão não destruída:
fonte
Mathematica, pontuação 512710
Corrige um erro com
StringRepeat
(comporta-se incorretamente porStringRepeat[x_String,0]
)fonte
StringRepeat[x_String, 0]:=""
?Pyth, 327763 etapas (ideal, 130 bytes)
Desde o compilador online é inepto em lidar com tal tarefa enorme, eu ter dado menos trabalho, de modo que só gera
0
,1
e1111
. No entanto, teoricamente, ele pode resolver o problema, porque usa o mesmo algoritmo que Lua no topo.Experimente online!
Como funciona:
fonte
JavaScript (ES6), 327763 etapas (ideal, 184 bytes)
Uma primeira pesquisa abrangente, nem tão inteligente nem tão rápida.
Menos golfe
Teste
fonte