Ваше завдання - написати перекладач RoboZZle. Якщо ви не знайомі з грою, перегляньте це відео на robozzle.com або прочитайте опис нижче.
Робот живе на прямокутній сітці квадратів кольорового червоного, зеленого, синього або чорного кольорів. Чорні квадрати недоступні. Інші доступні, а деякі з них містять зірку. Мета - зібрати всі зірки, не наступаючи на чорні квадрати і не падаючи з карти. Робот займає один квадрат і стикається з певним напрямком - вліво, вправо, вгору або вниз. Дотримується інструкцій, схожих на збірку, згрупованих у підпрограми F1, F2, ..., F5. Інструкція - це пара присудка ("немає", "якщо на червоному", "якщо на зеленому", "якщо на синьому") та дії ("йти вперед", "повернути ліворуч", "повернути праворуч", "пофарбуйте поточний квадрат червоним", "пофарбуйте його в зелений колір", "пофарбуйте його в синій колір", "не робіть нічого", "зателефонуйте F1", ..., "зателефонуйте F5"). Виклики до підпрограм використовують стек і можуть бути рекурсивними. Як і у звичайному програмуванні, після останньої інструкції підпрограми виконання виконується з того моменту, коли викликалася підпрограма. Виконання починається з першої інструкції F1 і триває до тих пір, поки робот не відвідав усі квадрати із зірками, або коли робот крокує на чорному квадраті чи за межами карти, або виконано 1000 інструкцій (невдалі предикати і дії "нічого не робити") не рахувати), або немає більше інструкцій для виконання (стек під переливом).
Вхідні дані:
a
- матриця символів 12х16 (як це зазвичай представлено вашою мовою, наприклад, масив рядків), що кодує карту -'#'
для недоступних (чорних) квадратів,'*'
для квадратів із зіркою,'.'
для рештиc
- матриця символів 12х16, що описує кольори доступних квадратів -'R'
(червоний),'G'
(зелений) або'B'
(синій). Недоступні квадрати будуть представлені довільною літерою з трьох.y
іx
- рядок і стовпець на основі робота;a[y][x]
гарантовано буде'.'
d
- напрямок робот облицювальний:0 1 2 3
для правого, вниз, вліво, вгору, тобто в напрямку(y,x+1)
,(y+1,x)
,(y,x-1)
,(y-1,x)
f
- один рядок, об'єднані реалізації F1 ... F5. Кожна реалізація - це (можливо, порожня) послідовність пар предикатних дій (щонайбільше 10 пар на підпрограму), що закінчується символом a'|'
.предикати:
'_'
жоден,'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()))
і переформатувати результат для вашої мови.
Найкоротші виграші. Без лазівки