Прогулка мертвой лягушки

17

Вступление

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

Выясните, удастся ли лягушке Джонни достичь конца пути или она умрет на своем пути.

Вызов

Программа будет получать в качестве входных данных сетку Frogger, составленную из 0s и 1s, в следующем формате:

  • Сетка будет иметь произвольную ширину и длину, и не менее 3x3
  • 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
BgrWorker
источник
Будут ли промежуточные линии всегда двигаться? Можем ли мы взять список строк в качестве входных данных? Если линия не движется, можем ли мы предположить, что она заканчивается символом, отличным от <или >мы можем взять прямоугольные массивы в качестве входных данных? Кстати, хороший вызов!
Дилнан
@dylnan Я уточнил это в тексте вызова. Промежуточные слои всегда будут перемещаться и всегда будут иметь <или >в конце.
BgrWorker
Лягушка движется вперед каждый ход, даже если 0перед ней стоит перед собой, или она будет ждать следующего 1? Если он может подождать, пойдет ли он вперед на всех 1, или он может с умом ждать? 11111 00001< 00011< 11F11То есть с тестовым случаем , будет ли он ложным, потому что он прыгает в воду ( пастбина шагов ); будет ли он ложным, потому что он выходит за рамки ( пастин ступеней ); или это будет правдой, потому что она ловко ждет вторую платформу, прежде чем прыгнуть вперед ( паста шагов )?
Кевин Круйссен
@KevinCruijssen, он движется каждый ход, и с радостью совершит самоубийство (как я уже говорил, Джонни не очень хороший игрок)
BgrWorker
@BgrWorker Хорошо, это делает задачу действительно более выполнимой. :) Возможно, отредактируйте это в описании вызова, чтобы лягушка двигалась вперед каждый ход, даже если она прыгнет в 0.
Кевин Круйссен

Ответы:

4

Python 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

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

На входе будет список символов:
' '- water
'F'- frog
'L'- plataform
'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
Кевин Круйссен
источник