Das Puzzle:
Stellen Sie sich ein Konsolen- / Handspiel mit einem Steuerkreuz vor, bei dem Sie eine Art Namen eingeben müssen. Dies trat in vielen älteren Spielen auf, bevor die Verwendung von QWERTY in Konsolen populär wurde (z. B. verwendet die Wii meines Erachtens ein QWERTY-Tastaturlayout für die Eingabe). In der Regel sieht die Bildschirmtastatur wie folgt aus:
Standard:
0 1 2 3 4 5 6 7 8 9
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 _ + ^ =
Mit dem Fall geschaltet:
0 1 2 3 4 5 6 7 8 9
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 heißt, alle alphanumerischen Tasten und die folgenden:
_
: Ein einzelnes Leerzeichen
-
: Ein Bindestrich
+
: Groß- / Kleinschreibung nur für den nächsten Buchstaben
^
umschalten: Feststelltaste umschalten (dh Groß- / Kleinschreibung aller Buchstaben umschalten)
=
: Eingeben, abschließen
* Offensichtlich habe ich Tasten wie "BKSP" und "ENTER" durch kürzere Versionen ersetzt
Und dann würde die Hardware gehört ein D-Pad (oder irgendeine Form der Kontrolle , wohin Sie gehen könnten up
, down
, left
und right
)
Auf dem Bildschirm können Sie in der Regel auch direkt von einer Seite zur anderen wechseln. Wenn Sie sich also auf den Buchstaben konzentrieren J
, können Sie durch Drücken right
von zum Buchstaben wechseln A
.
Wann immer ich meinen Namen eingab, versuchte ich immer, den schnellsten Weg zu finden.
Tor:
Ihr Programm übernimmt die Eingabe von Zeichenfolgen, die beliebige alphanumerische Zeichen einschließlich Leerzeichen und Bindestrich enthalten können. Ihr Ziel ist es, die kürzeste Anzahl von Tastendrücken auf dem Steuerkreuz auszugeben, um die erforderliche Zeichenfolge auszugeben.
Überlegungen:
Sie müssen die gedrückte Taste nicht einschließen, um das tatsächliche Zeichen zu drücken .
Fokus beginnt immer bei der A
Enter Taste =
muss am Ende gedrückt werden
Beispiel:
input: Code Golf
output: 43
Erklärt:
A
-> C
= 2
C
-> ^
= 6 (nach links bewegen)
^
-> o
= 5
o
-> d
= 2
d
-> e
= 1
e
-> +
= 5
+
-> _
= 1
_
-> +
= 1
+
-> G
= 3
G
-> o
= 3
o
-> l
= 3
l
-> f
= 5
f
-> =
= 6
Beachten Sie, dass es schneller ist, +
zweimal für a _
und a G
zu schlagen, als ^
einmal, und dann zurück zu tauschen.
Die gewinnende Einsendung (ich erlaube mindestens 1 W) ist die kürzeste Lösung (in Bytes). Da dies meine erste Frage ist, hoffe ich, dass dies klar und nicht zu schwer ist.
Antworten:
Ruby (369 Bytes)
Übernimmt Eingaben von der Kommandozeile.
Dank @Charlie eine Menge Bytes gespart :)
quelle
j=(K.index(c.upcase) or 36)
kann durch ersetzt werdenj=K.index(c.upcase)||36
, um 4 Bytes zu sparen.def d(x,y)
kann mit ersetzt werdendef d x,y
, um ein Byte zu speichern, und das gilt auch fürdef v
.v(...) if
umv(...)if
für ein weiteres Byte. In der letzten Zeilev(...)
kann durch ersetzt werdenv ...
, um 1 Byte zu speichern, undtrue
durch!!0
, um ein anderes Byte zu speichern.&&
mit&
und||
mit ersetzen|
.K=...
) kann durch eine Range (K='0123456789'+('A'..'Z').to_a.join+' +^='
) ersetzt werdenSwift 1.2,
812588670 BytesBearbeiten: 224 Bytes wurden entfernt, indem die großen Zahlenfelder durch einen Bereich ersetzt und stattdessen in ein Array konvertiert wurden.
Edit2: Loop vertikal hinzugefügt
Fügen Sie zum Ausführen den Code in eine
.swift
Datei ein und führen Sie ihn mit ausswift <filename> <your name>
Hierbei wird der einfache Ansatz verwendet, bei dem die beiden 'Tastaturen' als Arrays gespeichert werden.
B:(I)->(I,I)={a in(a%10,a/10)}
Konvertiert einen Index aus dem Array in eine x, y-Position auf der virtuellen Tastatur.func C(e:I,f:I)->I{let(a,b)=B(e),(c,d)=B(f) return abs(d-b)+min(abs(c-a),abs(10-(c-a)))}
Nimmt einen Start- / Endindex und gibt die minimale Anzahl von Zügen zurück, um von einem zum anderen zu gelangen (Berücksichtigung des horizontalen Umlaufs)func D(c:S,_ e:I=10,_ f:Bool=false,_ g:Bool=false)->I
Ist die rekursive Hauptfunktion, die die meisten Berechnungen durchführt. Er berechnet die Entfernung von der aktuellen Position zum Zielzeichen, sofern sich die Groß- / Kleinschreibung nicht ändert. Er berechnet dann sowohl die Verschiebungsmethode als auch die Feststelltaste und verwendet die kleinste.Laufender
swift codegolf.swift Code Golf
Druck43
quelle
Python
679661619602589576539520496482 BytesFühren Sie dies aus und es wird nach einer Eingabe gefragt (ohne Aufforderungstext). Für die Eingabe
Code Golf
wird gedruckt43
.Volles Programm:
Erweiterte Ausgabe aus dem vollen Programm:
quelle
C 675 Bytes
Übernimmt die Eingabe vom Befehlszeilenargument. Verwendet rekursives main:
quelle