Gravity Guy - игра, в которой единственным пользовательским вводом является одиночная клавиша, которая меняет направление гравитации. Учитывая художественный уровень ASCII, определите, возможно ли Gravity Guy достичь конца.
правила
- Начальное направление гравитации вниз .
- Первый столбец ввода всегда будет содержать только один
#
, над которым начинается Gravity Guy . - На каждой итерации он перемещается к персонажу прямо справа от него .
- Если его путь заблокирован, и он входит в
#
, игрок проигрывает . - После перемещения игрок может при желании переключать гравитацию вниз или вверх или вниз.
- Гравитационный парень затем падает на следующий
#
(в текущем направлении гравитации). - Если нет
#
возможности упасть, и он падает с сетки , игрок проигрывает . - Если Gravity Guy смещается с правой стороны входной сетки, игрок выигрывает .
пример
Если это была входная сетка:
###
# # #
###
Гравитационный парень начинал с x
этих позиций после каждой итерации. ^
= переключить гравитацию вверх и v
= переключить гравитацию вниз.
v ^ v
-------------------------------------------------------------
### | ### | ### | ### | ### | ###
x | | x | x | x |
# # | #x # | # # | # # | # # | # # x
### # | ### # | ### # | ### # | ### # | ### #
Как вы можете видеть, переключая гравитацию в это время, Gravity Guy достигает конца, поэтому этот вход вернет истинное значение.
Характеристики
- Входная сетка может иметь любой подходящий формат «сетки» (многострочная строка, дополненная пробелами, массив строк, массив символов и т. Д.).
- Если это возможно для игрока , чтобы выиграть уровень, выводить
truthy
значение. Если нет, выведитеfalsey
значение. - Ширина и высота сетки будут не более
50
символов. - Это код-гольф , пусть победит самый короткий код в байтах!
Тестовые случаи
(каждый случай, разделенный ----------
пробелами, также должен быть дополнен пробелами)
Правда
######### ######## ###### ######
# # # # # # #
### # # # # # # # # #
# ## # # ## # # # # # ##
# # # # # # # # # #######
# # # # # ### # #
# ## # ## # # # #
# # # # # #
# #################################### #
# #
#############################################
----------
###
----------
#####
####
----------
#####
# # #
# # #
#####
----------
############
###### ######
############
----------
### ###
# #
#### # ####
# #
# #
#
----------
######
#
##
#######
### #
# #
#####
----------
#####
# #
## #
#######
###
#
######
----------
###
# # #
###
----------
### ###
### ##
# #
#####
----------
#
# #
#
# # #
#
#
#
#
----------
##### ####
# # #
# # # ## #
# #
##### #### #
#
#########
----------
###########################
# # # # # # #
# # # # # # # # # #
# # # ######### ###########
# # # # # # # #
# # # ## ##### ### #
## # # # ## ###
# ##### #### ########### #
# # # # # ## #
# # ##### ### # # # # # #
# # # # ##
###########################
Ложь
###
#
####
----------
### ###
----------
#
### ###
#### ###
#
----------
### ###
# # #
#### # # ####
# #
# #
# #
#
----------
#######
# #
## #####
### ######
# #
#######
----------
###########################
# # # # # # # #
# # # # # # # # # #
# # # ######### ###########
# # # # # # # #
# # # ## ##### ### #
## # # # ## ###
# ##### #### ########### #
# # # # # ## #
# # ##### ### # # # # # #
# # # # ##
###########################
code-golf
ascii-art
decision-problem
user81655
источник
источник
column
тип, я думаю, это будет нормально.#
чтобы первый столбец находился в первом ряду?Ответы:
Улитки , 15 байт
Попробуйте онлайн?
0
^
это опция, которая требует запуска шаблона в верхнем левом углу.\
: совпадать пространствоn
: Поворот на 90 градусов в любом направлении\ ,
: совпадать с пробелом ноль или более раз=\#
проверьте, что#
перед намиr
: установите направление вправо}+
: сделать все предыдущие один или несколько раз~
сопоставить ячейку, находящуюся за пределами сеткиисточник
Perl,
93898177767574 байтаВключает +2 для
-0p
Запустите с шаблоном ввода (со всеми пробелами на одной и той же длине) в STDIN:
gravity.pl
:Эта файловая версия нуждается в последнем переводе строки, так что на самом деле это 75 байт. Но версия для командной строки не нуждается в этой дополнительной новой строке, поэтому она считается 74 байтами:
Объяснение:
Это создаст нить
w
в каждой позиции, которой может достичь гравитационный парень. Так что для второго до последнего правдивого примера он построит:Так что гравитационный парень может сделать это, если и только если есть
w
в последнем столбце. Строка будет построена путем замены одного доступного пространства наw
каждый раунд.Каждая замена будет иметь вид
который потребует, чтобы перед пробелом стоял префикс, а за ним следовал постфикс, но заменил только пробел
w
без необходимости в расширенной группировке.Предположим,
$n
содержит регулярное выражение, которое будет прогрессировать настолько, что левая и правая стороны будут точно друг под другом. Тогда соответствующие регулярные выражения:С этим легко справиться с программой:
источник
JavaScript (ES6), 174 байта
Принимает горизонтальный массив строк и возвращает количество точек выхода. Транспонирование массива стоит мне 29 байт. Ungolfed:
источник
Пип ,
85686259 + 1 = 60 байтИспользует
-r
флаг для чтения всех строк стандартного ввода.Попробуйте онлайн!
Краткое объяснение
Стратегия - это поиск в ширину. Мы транспонируем ввод и зацикливаем строки (столбцы), сохраняя список y-позиций, которые игрок может достичь в этом столбце. Вывод после последнего столбца представляет собой непустой список, если игрок может выиграть, или пустой список (который печатается как только завершающий перевод строки), если игрок проигрывает.
Полное объяснение
Встроенные переменные , используемые в этой программе:
i == 0
,l == []
,s == " "
.-r
Флаг помещает список линий ввода вg
.FcZg{...}
молнииg
и петли над каждым столбцомc
. (УнарныйZ
, когда применяется к списку итераций, действует как Pythonzip(*g)
, аккуратно перемещая двумерный массив.) Обратите внимание, чтоc
это будет список, а не строка.Внутри цикла столбцов мы возвращаемся
y
к пустому списку с помощьюY
ankingl
.Fxi
перебираетi
. В последующих итерацияхi
будет представлен список y-координат, которые игрок смог достичь в предыдущем столбце. В первый раз, мы хотим начать с просто0
(верхний левый угол). Переменная инициализируется в Scalar0
, а не в List[0]
, но Pip выполняет итерацию в любом случае.Для каждой из допустимых позиций в последнем столбце
Ic@xQs
проверяется, есть ли пробел в этой позиции в текущем столбце. Если нет, игрок просто врезался в стену, и мы продолжаем пробовать следующую возможность. Если это так, то мы хотим найти позиции, в которые игрок попадет в этот столбец для каждого направления силы тяжести, и добавить их в списокy
с помощью оператораP
ushB
ack.Повышение силы тяжести (слева, в транспонированной версии):
Снижение силы тяжести (справа, в транспонированной версии):
Если игрок падает с сетки в определенном направлении, соответствующая
@?
операция не найдет#
и даст ноль. Это недопустимый индекс, и он будет генерировать некоторые предупреждения на следующей итерации, которые, однако, не видны без-w
флага. Для наших целей эти случаи по существу исключены из рассмотрения.После внутреннего цикла
i:UQy
берет списокy
созданных нами позиций, удаляет дубликаты и присваивает егоi
. (Устранение дубликатов необходимо, потому что в противном случае список расширяется экспоненциально.) Затем мы переходим к следующему столбцу. Когда мы прошли через все столбцы, если был правильный путь,i
будет непустой список позиций (правда); если нет, то это будет пустой список (фальси).источник