Ваша задача - написать интерпретатор RoboZZle. Если вы не знакомы с игрой, посмотрите видео на robozzle.com или прочтите мое описание ниже.
Робот живет на прямоугольной сетке из квадратов красного, зеленого, синего или черного цвета. Черные квадраты недоступны. Другие доступны, и некоторые из них содержат звезду. Цель состоит в том, чтобы собрать все звезды, не наступая на черные квадраты и не падая с карты. Робот занимает один квадрат и направлен в определенном направлении - влево, вправо, вверх или вниз. Он следует инструкциям, подобным сборке, сгруппированным в подпрограммы F1, F2, ..., F5. Инструкция - это пара предикатов («нет», «если на красном», «если на зеленом», «если на синем») и действия («идти вперед», «повернуть налево», «повернуть направо», «закрасить текущий квадрат красным», «закрасить его зеленым», «закрасить его синим», «ничего не делать», «вызвать F1», ..., «вызвать F5»). Вызовы подпрограмм используют стек и могут быть рекурсивными. Как и в обычном программировании, после того, как последняя инструкция подпрограммы завершена, выполнение продолжается с того места, где была вызвана подпрограмма. Выполнение начинается с первой инструкции F1 и продолжается до тех пор, пока робот не посетит все квадраты со звездами, или пока робот не выйдет на черный квадрат или за пределами карты, или пока не будет выполнено 1000 инструкций (неудачные предикаты и действия «ничего не делать») не в счет), или больше нет инструкций для выполнения (потеря стека).
Входы:
a
- матрица символов 12x16 (как обычно представлено на вашем языке, например, массив строк), которая кодирует карту -'#'
для недоступных (черных) квадратов,'*'
для квадратов со звездочкой,'.'
для остальныхc
- матрица символов 12x16, описывающая цвета доступных квадратов -'R'
(красный),'G'
(зеленый) или'B'
(синий). Недоступные квадраты будут представлены произвольной буквой из трех.y
иx
- строка и столбец робота на основе 0;a[y][x]
гарантированно будет'.'
d
- направление робот облицовочный:0 1 2 3
для правого, вниз, влево, вверх, то есть в направлении(y,x+1)
,(y+1,x)
,(y,x-1)
,(y-1,x)
f
- одиночная строка, связанные реализации F1 ... F5. Каждая реализация представляет собой (возможно, пустую) последовательность пар предикат-действие (не более 10 пар на подпрограмму), оканчивающихся на'|'
.предикаты:
'_'
нет,'r'
красный,'g'
зеленый,'b'
синийдействия:
'F'
идти вперед,'L'
повернуть налево,'R'
повернуть направо,'r'
покрасить красный,'g'
покрасить зеленый,'b'
покрасить синий,'1'
вызвать F1, ...,'5'
вызвать F5,'_'
ничего не делать
Вам не нужно называть входные данные, как указано выше, но их значения должны быть такими, как указано.
Вывод: 1
(или true
) если робот собирает все звезды в соответствии с правилами, 0
( false
) в противном случае.
Пример :
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)
Другой пример , включающий «рисование» инструкций:
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
Чтобы создать свой собственный тест, перейдите к головоломке из списка на robozzle.com , попробуйте решить ее (или не решить), нажмите F12 в браузере и введите консоль 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()))
и переформатировать результат для вашего языка.
Кратчайшие победы. Нет лазеек.