Ich habe einen Zähler. Es ist ein kleines Gerät, das so aussieht:
Die Anzeige geht von 0000
bis 9999
. Oben befindet sich ein kleiner Druckknopf, der die Anzahl um 1 erhöht, und rechts ein kleiner Knopf, mit dem der Zähler auf 0 zurückgesetzt werden soll.
Das Besondere an dem kleinen Knopf ist, dass Sie ihn, wenn Sie ihn rückwärts drehen, beliebig vergrößern können, sobald Sie ihn wieder vorwärts drehen. Wenn ich also den Zählerknopf 10 Mal drücke, damit der Zähler angezeigt wird 0010
, kann ich den Knopf nach hinten drehen, bis ich ein winziges Klicken höre, ihn dann wieder nach vorne drehen und ihn direkt zu bewegen 0090
.
Der Knopf erhöht jedoch jedes Mal, wenn er Zahlen nach vorne drückt, alle Vorkommen derselben Ziffer um 1. Wenn der Zähler angezeigt wird 6060
, können Sie ihn nur auf 7070
, nicht auf 6070
oder erhöhen 7060
. Außerdem wird der Knopf rollen 9
s über 0
ohne zu tragen, so 0990
wird Voraus 0000
statt 1000
oder 1100
.
Ich möchte wissen, wie der Zähler am effizientesten auf eine bestimmte Zahl eingestellt werden kann. Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die die kürzeste Folge von Tastendrücken und Knopfbewegungen bestimmt, die dazu erforderlich sind.
Ihr Programm nimmt eine 4-stellige Zahl von 0000
bis als Eingabe 9999
und gibt eine Reihe von Schritten im folgenden Format zurück:
> 0001
C
> 0093
C12345678C12345678CCC
> 1000
C12345678C12345678C12345678C12345678C12345678C12345678C12345678C
> 9999
012345678
Wobei C
für "Druckknopf drücken" steht und jede Ziffer D
von 0 bis 9 für "Verwenden Sie den Knopf, um alle Vorkommen D
um 1 vorzuschieben" steht.
Ihr Programm muss eine gültige Abfolge von Schritten für alle möglichen vierstelligen Kombinationen erstellen und wird anhand der Gesamtzahl der Schritte bewertet, die für alle 10.000 Fälle erforderlich sind. Bei einem Gleichstand (höchstwahrscheinlich, wenn der optimale Algorithmus gefunden wurde) gewinnt der kürzere Code.
quelle
0010
in0020
in diesem Fall? Oder können Sie den Knopf nur rückwärts drehen? Und zählt jedes "D" als "D" Anzahl der Vorschübe des Knopfes (bedeutet zum Beispiel,1234567
den Knopf 1 Mal, dann 2 Mal, dann 3 Mal usw. zu drehen)? Oder bedeutet es nur jede einzelne Knopfdrehung (bedeutet zum Beispiel1234567
nur, den Knopf 7 Mal zu drehen)?Antworten:
Lua, 327763 Schritte (optimal, 276 Bytes)
Golfversion:
Verbesserte Version der fraglichen Beispiele (nur
1000
verbessert):Ungolfed Version:
quelle
Mathematica, Punktzahl 512710
Behebt einen Fehler mit
StringRepeat
(verhält sich falsch fürStringRepeat[x_String,0]
)quelle
StringRepeat[x_String, 0]:=""
?Pyth, 327763 Schritte (optimal, 130 Bytes)
Da die Online - Compiler auf dem Umgang mit solchen enormen Aufgabe unfähiger ist, habe ich ihm weniger Arbeit gegeben, so dass es erzeugt nur
0
,1
und1111
. Es kann das Problem jedoch theoretisch lösen, da es denselben Algorithmus wie das Lua oben verwendet.Probieren Sie es online aus!
Wie es funktioniert:
quelle
JavaScript (ES6), 327763 Schritte (optimal, 184 Byte)
Eine breite erste Suche, nicht so klug und nicht so schnell.
Weniger Golf gespielt
Prüfung
quelle