Вступление
Джонни хочет сыграть Фроггера. Однако он не очень хорош. На самом деле он будет пытаться двигаться только вперед и только после того, как платформы переместятся.
Выясните, удастся ли лягушке Джонни достичь конца пути или она умрет на своем пути.
Вызов
Программа будет получать в качестве входных данных сетку Frogger, составленную из 0
s и 1
s, в следующем формате:
- Сетка будет иметь произвольную ширину и длину, и не менее 3x3
1
представляет платформы0
представляет водуF
представляет начальную позицию лягушки- Каждая первая и последняя строка сетки будет состоять только из
1
s и не будет двигаться, а лягушка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
источник
<
или>
мы можем взять прямоугольные массивы в качестве входных данных? Кстати, хороший вызов!<
или>
в конце.0
перед ней стоит перед собой, или она будет ждать следующего1
? Если он может подождать, пойдет ли он вперед на всех1
, или он может с умом ждать?11111 00001< 00011< 11F11
То есть с тестовым случаем , будет ли он ложным, потому что он прыгает в воду ( пастбина шагов ); будет ли он ложным, потому что он выходит за рамки ( пастин ступеней ); или это будет правдой, потому что она ловко ждет вторую платформу, прежде чем прыгнуть вперед ( паста шагов )?0
.Ответы:
Python 2 ,
168165152145137129 байтПопробуйте онлайн!
Формат ввода представляет собой список строк; символы, имеющие значения, указанные в постановке задачи.
Объяснение:
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
и поднимаем номер строки; затем мыть, полоскать, повторять.источник
Python 2 ,
246245244242 байт-3 байта благодаря мистеру Xcoder
-1 байту благодаря Джонатану Фреху
Попробуйте онлайн!
объяснение
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
.Java 8,
293277 байтИспользует символы по умолчанию, как указано в описании вызова (
01F<>
).Попробуйте онлайн.
Объяснение:
источник