Viele alte Game Boy- Spiele erforderten häufig Zeichenfolgeneingaben vom Benutzer. Es gab jedoch keine Tastatur. Dies wurde erreicht, indem dem Benutzer ein "Tastaturbildschirm" wie folgt präsentiert wurde:
Der ‚Zeichenzeiger‘ würde auf Buchstaben A beginnt , der Benutzer zu jedem gewünschten Zeichen mit der Ebene würde D-Pad ‚s vier Tasten ( UP
, DOWN
, LEFT
und RIGHT
) und drückt BUTTON A
es auf die endgültige Zeichenfolge angehängt.
Bitte beachten Sie:
- Das Gitter ist umlaufend.
UP
Wenn Sie also auf Buchstabe Adrücken, gelangen Sie zu T. - Der 'Zeichenzeiger' bleibt nach dem Anhängen eines Buchstabens gesetzt
Die Herausforderung
Die obige Tastatur bietet Optionen zum Ändern der Groß- / Kleinschreibung und weist eine unregelmäßige Form auf. Der Einfachheit halber verwenden wir in dieser Herausforderung die folgende Tastatur (unten rechts steht ASCII-Zeichen 32, ein Leerzeichen):
A B C D E F G
H I J K L M N
O P Q R S T U
V W X Y Z .
Das Schreiben auf solchen Tastaturen ist extrem langsam. Um dies zu vereinfachen, müssen Sie ein Programm schreiben, das dem Benutzer den schnellstmöglichen Weg zur Eingabe einer bestimmten Zeichenfolge weist . Wenn es mehrere schnellste Wege gibt, müssen Sie nur einen zeigen.
Der Ausgabeschlüssel sollte sein:
>
zumRIGHT
<
zumLEFT
^
zumUP
v
zumDOWN
.
forBUTTON A
(aktuellen Buchstaben an String anhängen)
Wenn beispielsweise die Zeichenfolge angegeben wird DENNIS
, sieht die Lösung folgendermaßen aus:
>>>.>.>>v..>>.>>>v.
Regeln / Details
- Bitte denken Sie daran, das Gitter wickelt sich um!
- Sie können ein vollständiges Programm oder eine Funktion einreichen, solange die ursprüngliche Zeichenfolge verwendet wird und eine Lösungszeichenfolge erstellt wird. Leerzeichen / abschließende Zeilenumbrüche sind irrelevant, solange die Ausgabe korrekt ist.
- Sie können davon ausgehen, dass die Eingabe nur aus Zeichen besteht, die auf der angegebenen Tastatur eingegeben werden können, sie kann jedoch leer sein.
- Das ist Code-Golf , also gewinnt der kürzeste Code. Standard Code-Golf-Lücken gelten.
Testfälle
In der Regel gibt es mehrere Lösungen gleicher Länge. Ich habe für jeden Testfall die optimale Länge und ein Beispiel angegeben. Sie müssen nicht die Länge in Ihrer Antwort drucken, sondern nur die Lösung.
FLP.TKC -> 25 steps: <<.<v.<<<v.<<<v.^.<<^.<^.
MOYLEX -> 23 steps: <<v.>>v.>>>v.>^^.^.<<^.
FEERSUM -> 18 steps: <<.<..<vv.>.>>.<^.
MEGO -> 14 steps: <<v.<^.>>.>vv.
A CAT -> 17 steps: .<^.>>>v.<<.<<vv.
BOB -> 10 steps: >.<vv.>^^.
(space) -> 3 steps: <^.
(empty) -> 0 steps: (empty)
Sie können meinen Testfallgenerator auf repl.it anzeigen - bitte benachrichtigen Sie mich, wenn Fehler auftreten.
Vielen Dank an alle für die Einsendungen! User ngn ist momentan der Gewinner mit 61 Bytes, aber wenn jemand eine kürzere Lösung findet, kann das kleine grüne Häkchen verschoben werden;)
Antworten:
Dyalog APL , 61 Bytes
4 7∘{∊'.',⍨⍉↑b⍴¨¨'^v' '<>'⌷¨⍨⊂¨a>b←a⌊⍺-a←⍺|↓2-/0,⍺⊤⍵⍳⍨⎕a,'.'}
geht davon aus
⎕IO←0
⎕a,'.'
das Alphabet gefolgt von einem Punkt⍵⍳⍨
finde die Zeichen des Arguments dort als Indizes 0..26 (' '
und alle anderen werden 27 sein)⍺⊤
codiere in Basis 7 (beachte, dass das linke Argument⍺
gebunden ist4 7
), erhalte eine 2 × n Matrix0,
Stellen Sie links Nullen voran2-/
Unterschiede zwischen benachbarten Spalten↓
Teilen Sie die Matrix in ein Paar von Vektorena←⍺|
nimm sie modulo 4 bzw. 7, ordne zua
b←a⌊⍺-a
machen Sieb
das kleinerea
und sein modulares Inverse'^v' '<>'⌷¨⍨⊂¨a>b
Wählen Sie^
oderv
für den ersten Vektor und<
oder>
für den zweiten, je nachdem, wo sich diesera
unterscheidetb
b⍴¨¨
Wiederholen Sie jede dieserb
Zeiten⍉↑
Mischen Sie die beiden Vektoren zu einer einzigen Matrix und transponieren Sie diese. Sie erhalten eine n × 2-Matrix'.',⍨
hängt.
-s auf der rechten Seite an∊
ebnenquelle
JavaScript (ES6), 147 Byte
Ein interessantes Verhalten von
substring
ist, dass es die Argumente austauscht, wenn das zweite kleiner als das erste ist. Das bedeutet, wenn ich die optimale Anzahl von Links- / Rechtsdrücken als Zahl zwischen -3 und 3 berechne, kann ich 3 addieren und die Teilzeichenfolge von<<<>>>
ab 3 nehmen, und ich erhalte die richtige Anzahl von Pfeilen. Währenddessen werden die Abwärts- / Aufwärtspressen einfach gehandhabt, indem ein Array bitweise nach oben geschaut wird und der Zeilenunterschied mit 3 angegeben wird. Dieser Weg ist etwas kürzer, da weniger Array-Elemente vorhanden sind.quelle
Ruby, 107 Bytes
Ungolfed im Testprogramm
quelle
Mathematica, 193 Bytes
Golf
Lesbar
quelle
Python 2, 298 Bytes
Das ist länger als es sein sollte, aber ...
Jede Hilfe wäre sehr dankbar!
Nimmt Eingaben in Anführungszeichen vor.
l
Gibt die Position eines Zeichens auf der Tastatur zurück.Die beiden
if
Aussagen in der Mitte vond
dienen dazu, zu überprüfen, ob es optimal wäre, die Tastatur zu umschließen.Die Eingabe
s
wurde"A"
vorangestellt, da die Anfangsposition des Cursors istA
.Wir durchlaufen die Zeichenkette paarweise, wobei wir die letzte (die kein Paar ist:) verwerfen
[:-1]
und den Mindestabstand zwischen den beiden Hälften des Paares ermitteln.Vielen Dank an Flp.Tkc, dass Sie mir gesagt haben, dass ich das tun kann,
a=abs
anstatt esabs
jedes Mal zu sagen !quelle
Java 8, 1045 Bytes
Golf
Lesbar
Erläuterung
Die Lösung ist ein direkter Ansatz: schlecht optimierte Brute Force. Die Methode
g(...)
ist eine grundlegende Tiefensuche, die jede Permutation durchläuft (oben, unten, links, rechts). Mit einigen geringfügigen Änderungen in der Bestellung für die Testfälle erhalte ich die Ausgabe:quelle