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.yorazx- wiersz i kolumna robota oparte na 0;a[y][x]gwarantowane jest'.'d- kierunek robota stoi:0 1 2 3na 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.