Игра с роботами для детей - Какую букву я достану?

12

TL; DR: учитывая массив символов и робота в начальной позиции массива, напишите алгоритм, который может читать строку с движениями ( Fдля «вперед», Rдля «поворота на 90 градусов вправо» и Lдля «поворота на 90 градусов»). оставил ") и вычислил конечную позицию робота. Более подробная информация в полном тексте.

У нас дома очень простое программируемое устройство для детей: маленькое транспортное средство с кнопками, чтобы заставить автомобиль двигаться вперед, повернуть на 90 градусов влево или повернуть на 90 градусов вправо. Что-то похожее на это:

Мышь автомобиль

У нас также есть пенный коврик с такими буквами:

Игровой коврик

Цель всего этого - научить детей азбуке и элементам программирования одновременно.

Соревнование

Предположим, что мы случайно расположили наш поролоновый коврик так:

+---+---+---+---+---+---+---+
| E | R | L | B | I | X | N |
+---+---+---+---+---+---+---+
| O | A | Q | Y | C | T | G |
+---+---+---+---+---+---+---+
| F | W | H | P | D | Z | S |
+---+---+---+---+---+---+---+
    | K | V | U | M | J |   
    +---+---+---+---+---+
            |   |
            +---+

Предположим также, что мы изменили транспортное средство так, что когда мы программируем команду «идти вперед», транспортное средство движется вперед ровно на один квадрат в мате. Таким образом, если транспортное средство находится на Uплощади и движется на север, оно останавливается именно на Pплощади.

Все инструкции даны транспортному средству до того, как он начинает движение, а именно:

  • F: Машина едет вперед на следующую площадь.
  • R: Автомобиль поворачивает на 90 градусов вправо на своем месте (без дальнейшего движения).
  • L: Автомобиль поворачивает на 90 градусов влево на своем месте (дальнейшее движение отсутствует).

После того, как инструкции даны, вы можете нажать кнопку «GO» и отправить автомобиль на заданную позицию, поскольку он будет следовать каждой инструкции в указанном порядке. Таким образом, вы можете сказать ребенку, чтобы вставить необходимые инструкции для транспортного средства, чтобы перейти к данному письму.

Вы должны написать самую короткую программу / функцию, которая обрабатывает string(входной параметр) с набором инструкций и вычисляет букву, которую автомобиль останавливает (вывод string).

Детали:

  • Автомобиль всегда начинается с пустого квадрата внизу и направлен на север (в сторону Uквадрата).
  • Строка ввода будет содержать только буквы F, R, Lи G(для кнопки «Go»). Вы можете использовать строчные буквы для мата и инструкции, если вы предпочитаете.
  • Алгоритм должен подчиняться каждой инструкции в строке перед первой G(каждая инструкция после этого игнорируется, поскольку транспортное средство начало движение).
  • Если транспортное средство выходит из мата в любой момент (даже если входная строка не была полностью обработана), алгоритм должен вернуть строку Out of mat.
  • Если нет, алгоритм должен вернуть букву, по которой автомобиль остановился. Начальная точка считается как символ (или пустая строка).

Примеры:

Input: FFG
Output: P

Input: FRFRFG
Output: Out of mat

Input: RRFFG
Output: Out of mat

Input: FFFRFFLFG
Output: X

Input: FFFRFFLF
Output:      <-- Nothing or a whitespace (the robot has not started moving)

Input: FFFRRFFFG
Output:      <-- Nothing or a whitespace (the robot has returned to the starting point)

Input: RRRRRLFFFLFFRFRFGFFRRGRFF
Output: L    (Everything after the first G is ignored)

Это , поэтому победит самая короткая программа для каждого языка!

Чарли
источник
1
Далее: то же самое, но с конфигурацией мата как строковым вводом, с @начальной позицией и пробелами вне мата, так что эта конфигурация будет ERLBIXN\nOAQYCTG\nFWHPDZS\n KVUMJ \n @(с другим интервалом, SE испортила это)
Стивен

Ответы:

3

JavaScript (ES6), 194 176 169 163 байта

Сохранено несколько байтов благодаря @Luke и @Arnauld.

s=>(p=35,d=3,t='ERLBIXN1OAQYCTG1FWHPDZS11KVUMJ11111 11',[...s].every(i=>i=='L'?d--:i>'Q'?d++:i<'G'?+t[p+=[1,8,-1,-8][d%4]]||!t[p]?p=1/0:p:0)?'':t[p]||'Out of mat')

Ungolfed:

s=>(
  p=35,
  d=3,
  t='ERLBIXN1OAQYCTG1FWHPDZS11KVUMJ11111 11',
  [...s].every(i=>i=='L'?d--:
                  i<'Q'?d++:
                  i<'G'?+t[p+=[1,8,-1,-8][d%4]]||!t[p]?p=1/0:p:
                  0
              )?'':
               t[p]||'Out of mat'
)

f=
s=>(p=35,d=3,t='ERLBIXN1OAQYCTG1FWHPDZS11KVUMJ11111 11',[...s].every(i=>i=='L'?d--:i>'Q'?d++:i<'G'?+t[p+=[1,8,-1,-8][d%4]]||!t[p]?p=1/0:p:0)?'':t[p]||'Out of mat')

console.log(f('FFG')); //P
console.log(f('FRFRFG')); //Out of mat
console.log(f('RRFFG')); //Out of mat
console.log(f('FFFRFFLFG')); //X
console.log(f('FFFRFFLF')); //(space)
console.log(f('FFFRRFFFG')); //(space)
console.log(f('RRRRRLFFFLFFRFRFGFFRRGRFF')); //L
console.log(f('FFFFFRRFG')); //Out of mat

Рик Хичкок
источник
1
Вы можете сохранить 3 байта, заменив falseна!1
Люк
Спасибо, Люк. На самом деле я могу сохранить кучу байтов, удалив тест «G». Если это не «L», «R» или «F», его можно считать «G» (если только «G» отсутствует). В любом случае, everyметод обрабатывает это.
Рик Хичкок
Вот решение для 165 байтов:(s,p=35,d=3,t='ERLBIXN1OAQYCTG1FWHPDZS11KVUMJ11111 11')=>[...s].every(i=>i=='L'?d--:i=='R'?d++:i=='F'?+t[p+=[1,8,-1,-8][d%4]]||!t[p]?p=1/0:1:0)?'':t[p]||'Out of mat'
Люк
Не уверен, как это приведет меня к 165 байтам (?) Но мне, конечно, не нужна отдельная переменная для [1,8,-1,-8]массива, спасибо!
Рик Хичкок
Упс, должно быть, неправильно подсчитали, это 171. Я также удалил лишний пробел, который все еще находится в текущем ответе (это последний пробел).
Люк
2

Python 2 , 235 байт

x=0;y=1;a=4;b=3
p='ERLBIXN','OAQYCTG','FWHPDZS','aKVUMJ','aaa '
r=''
for i in input():
 if'G'==i:r=p[a][b];break
 elif'G'>i:
  b+=x;a-=y;
  if(-1<a<5)-1or(''<p[a][b:]<'a')-1:r='Out of mat';break
 else:x,y=[[y,-x],[-y,x]][i<'R']
print r

Попробуйте онлайн!

овс
источник
2

Python 3 , 226 231 241 байт

Второе редактирование; должен работать сейчас. Опять же, предстоит много оптимизации.

n=input();s="0ERLBIXN00OAQYCTG00FWHPDZS000KVUMJ000000 00000";d=1;c=40;i=0;w=[-1,-9,1,9]
while n[i]!="G"and c>=0:
 if n[i]=="F":c+=w[d]
 else:d=[d+[-1,3][d<0],-~d%4][n[i]=="R"]
 i+=1
print(["Out of mat",s[c]][c in range(len(s))and s[c]!="0"])

Попробуйте онлайн!

Fedone
источник
0

Wolfram Language / Mathematica, 300 байт

p=Re[(1-7I)#[[1]]]&;d=Drop;t=Throw;s=Switch;s[#,0,"Out of mat",_,StringPart["000 0000KVUMJ0FWHPDZSOAQYCTGERLBIXN",p@#]]&@Catch@Fold[If[MemberQ[d[d[Range[4,35],{2,5}],{7}],p@#],#,t@0]&@(s[#2,"F",#+{#[[2]],0},"R",#{1,-I},"L",#{1,I},_,t[#]]&)[#1,#2]&,{4,I},If[StringFreeQ["G"]@#,{"G"},Characters@#]&@#]&

Ungolfed:

p = Re[(1 - 7 I) #[[1]]] &;
d = Drop;
t = Throw;
s = Switch;
s[#,
    0, "Out of mat",
    _, StringPart["000 0000KVUMJ0FWHPDZSOAQYCTGERLBIXN", p@#]] &@
  Catch@
  Fold[
    If[MemberQ[d[d[Range[4, 35], {2, 5}], {7}], p@#], #, 
        t@0] &@(s[#2, "F", # + {#[[2]], 0}, "R", # {1, -I}, 
          "L", # {1, I}, _, t[#]] &)[#1, #2] &,
    {4, I},
    If[StringFreeQ["G"]@#, {"G"}, Characters@#] &@#] &
Чу ý
источник