Wiele starych gier Game Boy często wymagało od użytkownika wprowadzania ciągów. Nie było jednak klawiatury. Zostało to rozwiązane poprzez przedstawienie użytkownikowi „ekranu klawiatury” w następujący sposób:
W „wskaźnik znak” rozpocznie się na literę A. Użytkownik może nawigować do każdego żądanego znaku z D-Pad „s cztery przyciski ( UP
, DOWN
, LEFT
i RIGHT
), a następnie naciśnij BUTTON A
, aby dołączyć go do końcowego łańcucha.
Proszę zanotować:
- Siatka owija się , więc naciśnięcie
UP
na literę A zabierze Cię do T. - „Wskaźnik znaków” pozostaje wstawiany po dodaniu litery
Wyzwanie
Powyższa klawiatura ma opcje zmiany wielkości liter i ma nieregularny kształt. Dla uproszczenia w tym wyzwaniu użyjemy następującej klawiatury (prawy dolny róg to ASCII char 32, spacja):
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 .
Pisanie na klawiaturze takiej jak ta jest bardzo wolne - więc aby to ułatwić, Twoim zadaniem jest napisanie programu, który poinformuje użytkownika o najszybszym możliwym sposobie wpisania danego ciągu. Jeśli istnieje wiele najszybszych sposobów, wystarczy tylko jeden z nich.
Klucz wyjściowy powinien być:
>
dlaRIGHT
<
dlaLEFT
^
dlaUP
v
dlaDOWN
.
dlaBUTTON A
(dodaj bieżącą literę do ciągu)
Na przykład po podaniu ciągu DENNIS
rozwiązanie wyglądałoby tak:
>>>.>.>>v..>>.>>>v.
Zasady / Szczegóły
- Pamiętaj, że siatka się zawija!
- Możesz przesłać pełny program lub funkcję, o ile zajmie to ciąg początkowy i wygeneruje ciąg rozwiązania. Białe znaki / końcowe znaki nowej linii są nieistotne, o ile wynik jest poprawny.
- Możesz założyć, że dane wejściowe będą składały się wyłącznie ze znaków, które można wpisać na określonej klawiaturze, ale mogą być puste.
- To jest golf golfowy , więc wygrywa najkrótszy kod. Obowiązują standardowe luki w kodzie golfowym.
Przypadki testowe
Zwykle istnieje wiele rozwiązań o tej samej długości. Do każdego przypadku testowego podałem optymalną długość i przykład. Nie musisz drukować długości w odpowiedzi, tylko rozwiązanie.
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)
Możesz wyświetlić mój generator testów na Rep.it - powiadom mnie, jeśli są jakieś błędy.
Dziękujemy wszystkim za zgłoszenia! Użytkownik ngn jest obecnie zwycięzcą z 61 bajtami, ale jeśli ktoś może znaleźć krótsze rozwiązanie, można przesunąć mały zielony znaczek;)
Odpowiedzi:
Dyalog APL , 61 bajtów
4 7∘{∊'.',⍨⍉↑b⍴¨¨'^v' '<>'⌷¨⍨⊂¨a>b←a⌊⍺-a←⍺|↓2-/0,⍺⊤⍵⍳⍨⎕a,'.'}
zakłada
⎕IO←0
⎕a,'.'
alfabet, po którym następuje kropka⍵⍳⍨
znajdź tam znaki argumentu jako wskaźniki 0..26 (' '
a wszystkie pozostałe będą mieć 27)⍺⊤
zakoduj w bazie 7 (zwróć uwagę, że lewy arg⍺
jest związany4 7
), uzyskaj macierz 2 × n0,
wstaw zera w lewo2-/
różnice między sąsiednimi kolumnami↓
podziel macierz na parę wektorówa←⍺|
weź je odpowiednio modulo 4 i 7, przypisz doa
b←a⌊⍺-a
uczynićb
mniejszyma
i jego modułową odwrotnością'^v' '<>'⌷¨⍨⊂¨a>b
wybierz^
lubv
dla pierwszego wektora i<
lub>
dla drugiego, w zależności od tego, gdzie sięa
różnib
b⍴¨¨
powtarzaj każdy z tychb
czasów⍉↑
zmieszaj dwa wektory w jedną matrycę i przetransponuj, uzyskaj macierz n × 2'.',⍨
dołącz.
-s po prawej stronie∊
spłaszczyćźródło
JavaScript (ES6), 147 bajtów
Ciekawym zachowaniem
substring
jest to, że wymienia argumenty, jeśli drugi jest mniejszy niż pierwszy. Oznacza to, że jeśli obliczę optymalną liczbę lewych / prawych pras jako liczbę od -3 do 3, mogę dodać 3 i wziąć podłańcuch<<<>>>
zaczynając od 3 i otrzymam prawidłową liczbę strzałek. Tymczasem naciśnięcia w dół / w górę są obsługiwane po prostu przez wyszukiwanie tablicy za pomocą bitów i różnicy w wierszach za pomocą 3; ten sposób jest nieco krótszy, ponieważ elementów tablicy jest mniej.źródło
Rubin, 107 bajtów
Niegolfowany w programie testowym
źródło
Mathematica, 193 bajty
Golf
Czytelny
źródło
Python 2, 298 bajtów
To jest dłuższe niż powinno, ale ...
Każda pomoc byłaby bardzo mile widziana!
Wprowadza dane w cudzysłowie.
l
zwraca położenie znaku na klawiaturze.Dwie
if
instrukcje pośrodkud
służą do sprawdzenia, czy optymalne byłoby „owinięcie” klawiatury.Dane wejściowe
s
zostały wcześniej"A"
dodane, ponieważ początkowa pozycja kursora toA
.Pętlujemy sznurkiem parami, odrzucając ostatnią (która nie jest parą:)
[:-1]
, znajdując minimalną odległość między dwiema połówkami pary.Dzięki Flp.Tkc za powiedzenie mi, że mogę to zrobić
a=abs
zamiast mówić zaabs
każdym razem!źródło
Java 8, 1045 bajtów
Golf
Czytelny
Wyjaśnienie
Rozwiązaniem jest bezpośrednie podejście: źle zoptymalizowana brutalna siła. Ta metoda
g(...)
jest podstawowym wyszukiwaniem głębokości w pierwszej kolejności, przeprowadzanym przez każdą permutację (w górę, w dół, w lewo, w prawo). Po drobnych modyfikacjach przy zamawianiu przypadków testowych otrzymuję wynik:źródło