Zagadka:
Rozważ grę konsolową / ręczną z padem kierunkowym, w której musisz podać nazwę. Pojawiało się to w wielu starszych grach, zanim użycie QWERTY zostało spopularyzowane w konsolach (np. Wierzę, że Wii używa układu klawiatury QWERTY do wprowadzania danych). Zazwyczaj klawiatura ekranowa wygląda na *:
Domyślna:
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 _ + ^ =
Po zmianie obudowy:
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 - + ^ =
Oznacza to, że wszystkie klawisze alfanumeryczne i następujące:
_
: Pojedyncza spacja
-
: Łącznik
+
:
^
Zmień wielkość liter tylko na następną literę : Przełącz blokadę wielkich liter (to znaczy, zmieniaj wielkość liter wszystkich liter)
=
: Wprowadź, zakończ
* Oczywiście klucze takie jak „BKSP” i „ENTER” zastąpiłem krótszymi wersjami
A następnie sprzęt obejmowałyby D-pad (lub jakąś formę kontroli, gdzie można pójść up
, down
, left
i right
)
Ekran zazwyczaj pozwala także na przechodzenie z jednej strony bezpośrednio na drugą. Oznacza to, że jeśli skupiłeś się na liście J
, naciśnięcie right
umożliwi przejście do litery A
.
Ilekroć wpisałem swoje imię, zawsze starałem się znaleźć najszybszy sposób, aby to zrobić.
Cel:
Twój program pobierze ciąg znaków, który może zawierać dowolny znak alfanumeryczny, w tym spację i łącznik, a Twoim celem jest wygenerowanie jak najmniejszej liczby naciśnięć klawiszy na klawiaturze kierunkowej, aby uzyskać wymagany ciąg znaków.
Uwagi:
Nie trzeba dołączać klawisza do naciśnięcia rzeczywistego znaku.
Fokus zawsze zaczyna się na A
Enter, =
należy nacisnąć na końcu
Przykład:
input: Code Golf
output: 43
Wyjaśnienie:
A
-> C
= 2
C
-> ^
= 6 (przejście w lewo)
^
-> 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
Zauważ, że szybciej jest trafić +
dwa razy dla a _
i G
niż trafić ^
raz, a następnie zamienić z powrotem.
Zwycięskie zgłoszenie (pozwolę co najmniej 1 w) będzie najkrótszym rozwiązaniem (w bajtach). Ponieważ jest to moje pierwsze pytanie, mam nadzieję, że jest to jasne i niezbyt trudne.
Odpowiedzi:
Rubinowy (369 bajtów)
Pobiera dane z wiersza poleceń.
Zaoszczędziłem sporo bajtów dzięki @Charlie :)
źródło
j=(K.index(c.upcase) or 36)
można zastąpić,j=K.index(c.upcase)||36
aby zaoszczędzić 4 bajty.def d(x,y)
można zastąpić przez,def d x,y
aby zapisać bajt, i to samo dotyczydef v
.v(...) if
dov(...)if
innego bajtu. W ostatnim wierszu,v(...)
można zastąpićv ...
, aby zapisać 1 bajt, atrue
ze!!0
zaoszczędzić kolejny bajt.&&
z&
i||
z|
.K=...
) można zastąpić zakresem (K='0123456789'+('A'..'Z').to_a.join+' +^='
)Swift 1.2,
812588670 bajtówEdycja: Usunięto 224 bajty, zastępując duże tablice liczb zakresem i przekształcając je w tablicę.
Edycja2: Dodano pętlę w pionie
Aby uruchomić, umieść kod w
.swift
pliku i uruchom go za pomocąswift <filename> <your name>
Wykorzystuje to proste podejście, w którym dwie „klawiatury” są przechowywane jako tablice.
B:(I)->(I,I)={a in(a%10,a/10)}
Konwertuje indeks z tablicy na pozycję x, y na wirtualnej klawiaturze.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)))}
Pobiera indeks początkowy / końcowy i zwraca minimalną liczbę ruchów do przejścia od jednego do drugiego (uwzględniając zawijanie w poziomie)func D(c:S,_ e:I=10,_ f:Bool=false,_ g:Bool=false)->I
Jest główną funkcją rekurencyjną, która wykonuje większość obliczeń. To oblicza odległość od aktualnej pozycji do charakteru docelowego, chyba że sprawa powinna się zmienić, a następnie oblicza zarówno na zmianę i to caps lock metod i zajmuje najmniejszy.Uruchamianie
swift codegolf.swift Code Golf
wydruków43
źródło
Python
679661619602589576539520496482 BajtówUruchom to, a poprosi o wprowadzenie danych (bez tekstu zachęty). Dla wejścia
Code Golf
drukuje się43
.Pełny program:
Rozszerzone wyjście z pełnego programu:
źródło
C 675 bajtów
Pobiera dane wejściowe z argumentu wiersza poleceń. Używa rekurencyjnej głównej:
źródło