Гра з роботами для дітей - До якої літери я дістанусь?


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')

Безголівки:

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
Лука

Дякую, @Luke. Я фактично можу зберегти купу байтів, видаливши тест "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

Пітон 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"])

Спробуйте в Інтернеті!


0

Мова Вольфрама / Математика, 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@#]&@#]&

Безголівки:

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@#] &@#] &
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.