J'ai un comptoir. C'est un petit appareil qui ressemble à ceci:
L'affichage va de 0000
à 9999
. Il a un petit bouton poussoir en haut qui augmente le décompte de 1, et un petit bouton à droite dont le but est de remettre le compteur à 0.
Maintenant, la chose à propos du petit bouton est que si vous le tournez vers l'arrière, vous pouvez lui faire augmenter le chiffre que vous voulez une fois que vous le tournez à nouveau vers l'avant. Donc, si j'appuie 10 fois sur le bouton du compteur pour que le compteur s'affiche 0010
, je peux ensuite tourner le bouton vers l'arrière jusqu'à ce que j'entende un petit clic, puis le tourner à nouveau vers l'avant et le faire avancer directement 0090
.
Mais, le bouton augmentera toujours toutes les occurrences du même chiffre de 1 à chaque fois qu'il poussera des nombres vers l'avant. Donc, si le compteur s'affiche 6060
, vous ne pouvez que le faire passer à 7070
, pas à 6070
ou 7060
. De plus, le bouton roulera 9
sur 0
sans porter, donc 0990
avancera à la 0000
place de 1000
ou 1100
.
Je veux connaître le moyen le plus efficace de régler le compteur sur un certain nombre. Votre tâche consiste à écrire un programme ou une fonction qui déterminera la séquence la plus courte d'appuis sur les boutons et les avancements des boutons nécessaires pour le faire.
Votre programme prendra en entrée un nombre à 4 chiffres de 0000
à 9999
et renverra une série d'étapes au format suivant:
> 0001
C
> 0093
C12345678C12345678CCC
> 1000
C12345678C12345678C12345678C12345678C12345678C12345678C12345678C
> 9999
012345678
Où C
signifie «appuyez sur le bouton du compteur» et n'importe quel chiffre D
de 0 à 9 signifie «utilisez le bouton pour avancer toutes les occurrences de D
1».
Votre programme doit produire une séquence d'étapes valide pour toutes les combinaisons possibles à quatre chiffres et sera notée par le nombre total d'étapes requises pour les 10 000 cas. En cas d'égalité (très probablement lorsque l'algorithme optimal est trouvé), le code le plus court l'emportera.
la source
0010
dans0020
dans ce cas? Ou pouvez-vous seulement tourner le bouton vers l'arrière? Et aussi, chaque "D" compte-t-il comme un nombre "D" d'avancées du bouton (par exemple, cela1234567
signifie- t -il tourner le bouton 1 fois, puis 2 fois, puis 3 fois, etc.)? Ou cela signifie-t-il simplement chaque tour de bouton séparé (par exemple, cela1234567
signifie- t-il simplement tourner le bouton 7 fois)?Réponses:
Lua, 327763 pas (optimal, 276 octets)
Version golfée:
Version améliorée des exemples en question (seule
1000
est améliorée):Version non golfée:
la source
Mathematica, score 512710
Corrige un bug avec
StringRepeat
(se comporte incorrectement pourStringRepeat[x_String,0]
)la source
StringRepeat[x_String, 0]:=""
?Pyth, 327763 pas (optimal, 130 octets)
Étant donné que le compilateur en ligne est inepte à faire face à cette tâche énorme, je l' ai donné moins de travail, de sorte qu'il ne génère que
0
,1
et1111
. Cependant, il peut théoriquement résoudre le problème, car il utilise le même algorithme que le Lua en haut.Essayez-le en ligne!
Comment ça fonctionne:
la source
JavaScript (ES6), 327763 étapes (optimal, 184 octets)
Une recherche en largeur, pas si intelligente et pas si rapide.
Moins golfé
Tester
la source