Ходить мертва жаба


17

Вступ

Джоні хоче грати у Фроггера. Однак він не дуже хороший. Насправді він буде намагатися рухатися лише вперед, і лише після того, як платформи переміститься.

З’ясуйте, чи вдасться жабі Джоні досягти кінця шляху або якщо вона вмирає на своєму шляху.

Виклик

Програма буде отримувати в якості вхідних даних сітки Frogger складеної 0з і 1с, в наступному форматі:

  • Сітка буде довільною шириною та довжиною і принаймні 3х3
  • 1 представляє платформи
  • 0 являє собою воду
  • F являє вихідне положення жаби
  • Кожен перший і останній рядок сітки буде складатися лише з 1s, і не рухатиметься, а жаба Fбуде розміщена навмання в останньому рядку
  • Кожен проміжний шар завжди буде рухатися і матиме <або >в кінці кожного рядка вказує, чи рухається він вліво або вправо

Заміна цих символів на власні дозволена, якщо вони всі виразні, і ви вказали заміни у своїй відповіді.

Вхід може бути у будь-якому сумісному форматі (рядок з розривами рядків, масив рядків, масив символів, ...).

Правила виклику

  • Кожного повороту всі платформи рухатимуться одним квадратом, виходячи із напрямку, зазначеного знаком <або>
  • Платформи знову з’являються на іншій стороні сітки, якщо їх відсунуть на «екран»
  • Якщо жаба знаходиться на платформі, що рухається, вона рухатиметься разом з нею
  • Після цього жаба стрибне на один квадрат у бік верхнього ряду. Жаба рухатиметься кожного кроку.
  • Жаба гине, якщо стрибає у воду ( 0) або торкається сторони сітки разом з рухомою платформою

У вашій програмі має вивести триєдне значення, якщо жаба виживе, а помилкове значення - в іншому випадку.

Це , тому найкоротша відповідь у байтах виграє. Застосовуються стандартні лазівки.

Приклади

Приклад 1

Вхідні дані

11111
00111>
00101<
1F111

Вихідні дані

1

Виконання

Поворот 1:

11111
10011
01010
1F111

11111
10011
0F010
11111

Поворот 2:

11111
11001
F0100
11111

11111
F1001
10100
11111

Поворот 3:

11111
1F100
01001
11111

1F111
11100
01001
11111

Приклад 2

Вхідні дані

11111
00100<
00100<
1F111

Вихідні дані

0

Виконання

Поворот 1:

11111
01000
01000
1F111

11111
01000
0F000
11111

Поворот 2:

11111
10000
F0000
11111

11111
F0000
10000
11111

Поворот 3:

11111
00001
00001
11111

Чи будуть проміжні лінії завжди рухатися? Чи можемо ми взяти список рядків як вхідний? Якщо лінія не рухається, чи можемо ми припустити, що вона закінчується символом, відмінним від цього, <або >ми можемо взяти прямокутні масиви як вхідні дані? До речі, приємний виклик!
ділнан

@dylnan Я уточнив це в тексті виклику. Проміжні шари завжди будуть рухатися і завжди матимуть <або> в кінці.
BgrWorker

Чи жаба рухається вперед кожного кроку, навіть коли перед нею стоїть 0, або буде чекати наступного 1? Якщо він може зачекати, чи буде він рухатися вперед на кожного 1, чи може чекати чесно? Тобто з тестовим випадком 11111 00001< 00011< 11F11, чи буде фальси, тому що він стрибає у воду ( пастбін сходів ); це буде фальси, тому що вона рухається поза рамкою ( пастбін сходів ); чи це буде похмуро, тому що він чекано чекає другої платформи, перш ніж стрибнути вперед ( пастбін кроків )?
Кевін Кройсейсен

@KevinCruijssen рухається на кожному кроці і щасливо самогубство (як я вже сказав, Джоні не дуже хороший гравець)
BgrWorker

@BgrWorker Добре, це робить виклик справді більш можливим. :) Можливо, відредагуйте це в описі виклику, щоб жаба рухалася вперед на кожному кроці, навіть якщо вона стрибнула в a0 .
Кевін Круїйсен

Відповіді:


4

Пітон 2 , 168 165 152 145 137 129 байт

s=input();x=s[-1].find('F');L=len(s[0]);i=k=1
for l in s[-2:0:-1]:d=('<'in l)%-2|1;k*=l[(x-d*i)%L]>'0'>-1<x+d<L;x+=d;i+=1
print k

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

Формат введення - це список рядків; символи, що мають значення, як зазначено в постановці проблеми.

Пояснення:

i- номер повороту (починаючи з обороту 1); x- це позиція жаби на початку цього повороту.

Рядок, на який збирається наступити жаба, - це рядок l(зауважте, що за допомогою нарізки вони надходять у нижньому до верхнього порядку). d=('<'in l)%-2|1врожайність -1або 1залежно від напрямку, в якому рухається рядок.

Оскільки це вже iчерга, цей рядок зміститься зі свого вихідного положення на iбайти; і тому персонаж, який жаба збирається стрибнути, - це l[(x-d*i)%L]де Lширина рядка, тому ми хочемо, щоб цей символ був рівним '1'; тобто >'0'.

Крім того, ми хочемо перевірити, чи жаба не буде зміщена від краю на початку наступного повороту; це функція вираження -1<x+d<L.

Ці умови є прикованими (оскільки '0'>-1це завжди True); і якщо в будь-який момент отриманий вираз буде помилковим, kстане (і тоді залишиться) 0.

У будь-якому випадку ми оновлюємо позицію жаби x+=dта оббиваємо номер рядка; потім мийте, промийте, повторіть.


1

Пітон 2 , 246 245 244 242 байт

-3 байти дякую містеру Xcoder
-1 байт завдяки Джонатану Фреху

m=input()
exec"""for i,r in enumerate(m):
 d=-int(min('1',r[-1]));q=r[d*2]
 if m[i+1:]:r=sum([r[d+1:d-1],[[q,' '][q<'L']]][::d-~d],[])+r[-1:]
 if'F'in r:j=r.index('F');r[j]='L';m[i-1][j]=min('F',m[i-1][j])
 m[i]=r
"""*~-len(m)
print'F'in m[0]

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

Пояснення

  • d це напрямок, яким буде рухатися кожен шар
  • q це персонаж, який буде обгорнутися
    • [q,' '][q<'L'] випаде жаба з екрану
  • sum([r[d+1:d-1],[[q,' '][q<'L']]][::d-~d],[])+r[-1:]видалить останній символ (напрямок), потім видалить перший символ і додайте його або видаліть другий останній і додайте його (на основі d), а додайте напрям назад, ефективно переміщуючи весь рядок вліво / вправо.
  • if'F'in r:j=r.index('F');r[j]='L';m[i-1][j]=min('F',m[i-1][j]) змусить жабу стрибнути вперед
  • min('F',m[i-1][j]) змусить жабу впасти у воду
  • Порівняння ( minта <) символів слід за порядком' ' < '0' < '1' < 'F' < 'L'

Введенням буде список списків символів:
' '- вода
'F'- жаба
'L'- платаформа
'0'- переміщення шару вліво
'1'- переміщення шару вправо


if i<len(m)-1можливо, це може бути if~-len(m)>i.
Джонатан Фрех

0

Java 8, 293 277 байт

a->{for(int l=a.length-1,x=a[l].indexOf('F'),y=l,i,t=a[0].length()-1,b;y>0;y--){for(i=l;i-->1;a[i]=a[i].endsWith("<")?a[i].substring(1,t+1)+a[i].charAt(0*(x-=b))+"<":a[i].charAt(t)+a[i].substring(0*(x+=b),t)+">")b=i==y?1:0;if(x<0|x>t||a[y].charAt(x)<49)return 0>1;}return 1>0;}

Використовує символи за замовчуванням, як зазначено в описі виклику ( 01F<>).

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

Пояснення:

a->{                         // Method with String-array parameter & boolean return-type
  for(int l=a.length-1,      //  Amount of rows minus 1
       x=a[l].indexOf('F'),  //  Start x-position of the frog
       y=l,                  //  Start y-position of the frog
       i,                    //  Index-integer
       t=a[0].length()-1,    //  Length of the rows minus 1
       b;                    //  Temp integer
       y>0;                  //  Loop as long as the frog hasn't reached the other side
       y--){                 //    Jump forward once after every turn
    for(i=l;l-->1;           //   Inner loop over all the moving rows
        ;a[i]=               //     After every iteration: Change the moving row to:
         a[i].endsWith("<")? //      If the current platform moves to the left:
          a[i].substring(1,t+1)
                             //       Last part of the platform
                             //        i.e. "00101<" → "0101"
          +a[i].charAt(0     //       Appended with the first character
                             //        i.e. "00101<" → '0'
            *(x-=b))         //       We are moving left, so subtract `b` from `x`      
          +"<"               //       And append the direction "<" again
                             //        so "00101<" becomes "01010<"
         :                   //      Else (the platform moves to the right):
          a[i].charAt(t)     //       Take the last character
                             //        i.e. "00111>" → '1'
          +a[i].substring(0  //       And append the first part of the platform
                             //        i.e. "00111>" → "0011"
            *(x+=b),t)       //       We are moving right, so add `b` to `x`
          +">")              //       And append the direction "<" again
                             //        so "00111>" becomes "10011>"
      b=i==y?                //    If the frog is on the current row:
         1                   //     Set `b` to 1
        :                    //    Else:
         0;                  //     Set `b` to 0
    if(x<0|x>t               //   If the Frog is out of bounds
       ||a[y].charAt(x)<49)  //   Or jumped into the water
      return 0>1;}           //    Return false
  return 1>0;}               //  If the loop ended the frog made it to the other side,
                             //  so return true
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.