Twoim zadaniem jest napisanie interpretera RoboZZle. Jeśli nie znasz gry, obejrzyj wideo na robozzle.com lub przeczytaj mój opis poniżej.
Robot żyje na prostokątnej siatce kwadratów w kolorze czerwonym, zielonym, niebieskim lub czarnym. Czarne kwadraty są niedostępne. Inne są dostępne, a niektóre z nich zawierają gwiazdkę. Celem jest zebranie wszystkich gwiazd bez wchodzenia na czarne kwadraty i spadania z mapy. Robot zajmuje jeden kwadrat i jest skierowany w określonym kierunku - w lewo, w prawo, w górę lub w dół. Postępuje zgodnie z instrukcjami podobnymi do złożenia pogrupowanymi w podprogramy F1, F2, ..., F5. Instrukcja jest parą predykatu („brak”, „jeśli na czerwonym”, „jeśli na zielonym”, „jeśli na niebieskim”) i akcja („idź do przodu”, „skręć w lewo”, „skręć w prawo”, „pomaluj bieżący kwadrat na czerwono”, „pomaluj na zielono”, „pomaluj na niebiesko”, „nic nie rób”, „zadzwoń do F1”, ..., „zadzwoń do F5”). Wywołania podprogramów używają stosu i mogą być rekurencyjne. Podobnie jak w konwencjonalnym programowaniu, po zakończeniu ostatniej instrukcji podprogramu wykonywanie jest kontynuowane od momentu wywołania podprogramu. Wykonanie rozpoczyna się od pierwszej instrukcji F1 i trwa do momentu, gdy robot odwiedzi wszystkie kwadraty z gwiazdami lub gdy robot wejdzie na czarny kwadrat lub poza mapę, lub wykona 1000 instrukcji (nieudane predykaty i akcje „nic nie rób”) nie licz) lub nie ma już instrukcji do wykonania (niedopełnienie stosu).
Wejścia:
a
- matryca 12 x 16 znaków (jak zwykle reprezentowana w twoim języku, np. tablica ciągów znaków), która koduje mapę -'#'
dla niedostępnych (czarnych) kwadratów,'*'
dla kwadratów z gwiazdą,'.'
dla resztyc
- matryca znaków 12x16 opisująca kolory dostępnych kwadratów -'R'
(czerwony),'G'
(zielony) lub'B'
(niebieski). Niedostępne kwadraty będą reprezentowane przez dowolną literę z trzech.y
orazx
- wiersz i kolumna robota oparte na 0;a[y][x]
gwarantowane jest'.'
d
- kierunek robota stoi:0 1 2 3
na prawo, w dół, w lewo, w górę, czyli w kierunku(y,x+1)
,(y+1,x)
,(y,x-1)
,(y-1,x)
f
- pojedynczy ciąg, połączone implementacje F1 ... F5. Każda implementacja to (być może pusta) sekwencja par predykat-akcja (maksymalnie 10 par na podprogram), zakończona znakiem'|'
.predykaty:
'_'
brak,'r'
czerwony,'g'
zielony,'b'
niebieskiakcje:
'F'
idź do przodu,'L'
skręć w lewo,'R'
skręć w prawo,'r'
pomaluj na czerwono,'g'
pomaluj na zielono,'b'
pomaluj na niebiesko,'1'
zadzwoń do F1, ...,'5'
zadzwoń do F5,'_'
nic nie rób
Nie musisz nazywać swoich danych wejściowych jak wyżej, ale ich wartości muszą być zgodne z podanymi.
Wyjście: 1
(lub true
) jeśli robot zbiera wszystkie gwiazdy zgodnie z zasadami, 0
( false
) w przeciwnym razie.
Przykład :
a=["################","################","##*....*...*#.##","##.####.#####.##","##.####.#####.##","##.####*...*#.##","##.########.####","##*........*#.##","################","################","################","################"]
c=["RRRRRRRRRRRRRRRR","RRRRRRRRRRRRRRRR","RRRBBBBRGGGGRRRR","RRBRRRRGRRRRRRRR","RRBRRRRGRRRRRRRR","RRBRRRRRGGGBRRRR","RRBRRRRRRRRGRRRR","RRRBBBBGGGGBRBRR","RRRRRRRRRRRRRRRR","RRRRRRRRRRRRRRRR","RRRRRRRRRRRRRRRR","RRRRRRRRRRRRRRRR"]
y=2; x=6; d=2
// and then depending on "f":
f="_FrLg2_1|_FbLrR_2||||" // result:1
f="_FrRg2_1|_FbLrR_2||||" // result:0 (stepped on a black square)
f="_FrLrL_1|_FbLrR_2||||" // result:0 (1000-step limit exceeded)
f="_FrLg2__|________||||" // result:0 (stack underflow)
Kolejny przykład dotyczący instrukcji „malowania”:
a=["#***************","#*###*###*###*##","#*###*###*###*##","***#***#***#***#","***#***#***#***#","*###*###*###*###","***#***#***#***#","***#***#***#***#","***#***#***#***#","*###*###*###*###","*.*#***#***#***#","***#***#***#***#"]
c=["RGGGGGGGGGGGGGGG","RBRRRGRRRGRRRGRR","RBRRRGRRRGRRRGRR","RBRRGGGRGGGRGGGR","BRRRGGGRGGGRGGGR","BRRRGRRRGRRRGRRR","BRRRGGGRGGGRGGGR","RBRRGGGRGGGRGGGR","BRRRGGGRGGGRGGGR","BRRRGRRRGRRRGRRR","BGRRGGGRGGGRGGGR","RBRRGGGRGGGRGGGR"]
y=10; x=1; d=0
f="_2_R_R_1|_FgRgFgFg3rRr4b2_Fgb|_F_F_R|_2_L_r||"
// result:1
Aby wygenerować własny test, przejdź do układanki z listy na stronie robozzle.com , spróbuj ją rozwiązać (lub nie rozwiązać), naciśnij F12 w przeglądarce, wpisz w konsoli JS:
r=robozzle;s=JSON.stringify;with(r.level)console.log('a='+s(Items)+'\nc='+s(Colors)+'\ny='+RobotRow+'\nx='+RobotCol+'\nd='+RobotDir+'\nf='+s(r.encodeSolution()))
i ponownie sformatuj wynik dla swojego języka.
Najkrótsze wygrane. Bez luk.