Создайте программу, которая определяет, учитывая ввод пути, может ли Марио достигнуть конца, обозначенного E
, с самого начала, обозначенного как S
.
Путь будет выглядеть примерно так:
S = E
=====
В пути различные символы и то, что они представляют:
=
: стена / пол / потолок. Марио не может пройти сквозь стену и не может упасть сквозь пол или прыгнуть через потолок (он ударит себя по голове)S
: air, кроме показа, где начинается Марио. Это всегда будет отображаться в крайнем левом столбце ввода на уровне земли.E
: air, кроме показа, куда Марио хочет попасть. Это всегда будет отображаться в крайнем правом столбце ввода на уровне земли.
Вход будет иметь пробелы в каждом месте, где Марио может ходить.
Марио может двигаться только вперед; в этом примере Марио не может добраться до цели
S
===
===
E
====
и при этом он не может в этом
E
==
==
#==
==
==
==
S ==
======
Тем не менее, он может достичь пространства, обозначенного #
(которое не появится на входе), потому что он может прыгать до четырех ячеек; Марио сверхчеловек. Как еще один пример его сверхчеловечества:
S
=
=
=
=
=
= #
= =
=
=
=
= E
=======
Марио может добраться до E
, прыгнув на большое расстояние, выжить и спокойно идти к E
. Обратите внимание, что он не может достичь #
, потому что Марио падает прямо вниз.
Марио может прыгать очень высоко, но не очень далеко вперед по сравнению.
S E
== ==
= =
Марио может попытаться преодолеть разрыв, но он потерпит неудачу и упадет прямо. Он не может достичь конца.
Марио может достичь цели во всех этих примерах:
E
=
=
=
S=
==
=
= E
S= =
== =
= =
=====
S
=
= E
====
Это код гольф, поэтому побеждает меньше байтов!
источник
#
, потому что Марио падает прямо вниз». Если я правильно смотрю на это, разве он не упадет прямо на#
? Кроме того, прыжки определены как максимум 4 пробела вверх и максимум 1 пробел, верно?#
. Что касается второго вопроса: я не OP, но я предполагаю, что вы правы. (это то, что я предполагал в своем решении)E
не отображается в крайнем правом столбце, потому что уровень земли простирается на один вправо от остальной части карты.Mario cannot walk through wall , and cannot fall past a floor, or jump past a ceiling
Ответы:
Слип ,
382725 байтТребует, чтобы ввод был дополнен прямоугольником так, чтобы в каждой ячейке были пробелы, которые должен пройти Марио (потенциально с линией, полной пробелов). Печатает либо строку, представляющую действительный путь (который включает и все пройденные пути
S
, кроме последнего), либо ничего, если пути не существует.E
=
Проверьте это здесь.
объяснение
Slip - это вступление Sp3000 к нашей задаче разработки языка сопоставления двухмерных шаблонов. Это немного похоже на 2D-расширение регулярного выражения, где вы можете давать инструкции движку движка, когда ему разрешено или необходимо совершать левый или правый повороты. Он также имеет удобную функцию, позволяющую предотвратить продвижение курсора, позволяя сопоставлять одну позицию дважды подряд (с разными рисунками).
Slip не имеет ничего похожего на обходные выражения в регулярных выражениях, но, поскольку вы можете перемещаться по любой позиции несколько раз, можно просто проверить условие и затем вернуться. Мы используем это, чтобы гарантировать, что мы прыгаем только на земле, перемещаясь в плитку земли после каждого шага.
источник
Java
234 230 221 216 208 207 205179 байтСмотри, я победил C и Python? Я достиг истинного превосходства среди смертных! Все шутки в сторону, это было забавное испытание. Следующая функция принимает входные данные как массив строк столбцов, каждая из которых имеет одинаковую длину. Если это противоречит правилам, пожалуйста, дайте мне знать. Он выводит 1, означающий успешный запуск Марио, и любое другое значение, подразумевающее неудачный запуск Марио.
Вот старая логика (которая похожа на текущую версию) с примером использования и вывода. Плюс несколько комментариев, объясняющих логику
источник
Python,
260239222215209206 байт,попробуй его на ideone (с тестовыми примерами)
позвоните как:
f([' S=', ' E='])
примечания к патчу:
Теперь, как и некоторые другие решения, предполагается, что input - это массив строк столбцов, каждая из которых начинается с ""
Оболочка для старой формы ввода:
g=lambda x:f(map("".join,zip(*([" "*x.index("\n")]+x.split("\n")))))
Также я исправил ошибку, из-за которой Марио мог прыгать через блоки над ним.
Нежелательная версия с объяснениями:
f
рекурсивно называет себя во всех направлениях, куда Марио может перейтиy,x
. Он возвращается,True
когда достигает"E"nd
, который затем проходит через все вызовы функций, пока,g
наконец, не вернетсяTrue
.источник
else
до финалаreturn
?Улитки ,
413729 байтСпасибо feersum за некоторую помощь в избежании перекрывающихся путей и за сохранение 4 байтов.
Требует, чтобы ввод был дополнен прямоугольником так, чтобы в каждой ячейке были пробелы, которые должен пройти Марио (потенциально с линией, полной пробелов).
Попробуйте онлайн!
объяснение
Улитки были началом работы Feersum в нашей языковой задаче по сопоставлению шаблонов. Как и Slip, он также похож на регулярное выражение, но основное отличие состоит в том, что a) этот поддерживает утверждения (lookarounds) и b), кроме этих утверждений, невозможно пересечь любую ячейку в сетке дважды. Это делает эту проблему немного сложнее, поскольку есть случаи, когда Марио нужно упасть в яму и выпрыгнуть назад, например:
Помимо этих различий, синтаксис двух языков также довольно сильно отличается.
Чтобы обойти проблему, заключающуюся в том, что мы не можем пройти через ячейку дважды, мы всегда чередуем горизонтальный шаг с вертикальным шагом. Однако это означает, что нам нужно выдержать падение, прежде чем мы перешагнем через уступ. Таким образом, падения будут технически проходить сквозь плитки, но мы будем следить за тем, чтобы они происходили только рядом с открытым пространством
источник
C
256236213197 байтов20 байтов, сохраненных с помощью «Это всегда будет отображаться в крайнем левом столбце ввода»
23 байта, сохраненных благодаря системе на основе столбцов @ RohanJhunjhunwala
Попробуйте это на ideone, с тестовыми примерами ...
Использование:
Разгромленный с объяснением:
источник
PHP,
399338284265251 байтожидает ввод в качестве аргумента командной строки с разрывами строки в стиле Unix и конечными пробелами в каждой строке, возвращает код завершения
1
для успеха,0
для ошибкиразбивка на функции
тесты (по функции м)
источник
Рубин,
153147 байтИзвините, Ява ... Ваше место как лучшего не-гольф-ланга для работы занято!
Входные данные представляют собой список строк столбцов с предваряющим одним пробелом в стиле того, как решения Slip и Snails требуют, чтобы их входы были дополнены прямоугольником пустого пространства.
Попробуйте онлайн!
источник
Грязь, 46 байт (не конкурирует)
После публикации этого задания я несколько раз обновлял Grime, поэтому этот ответ не имеет права на победу. Некоторые изменения настолько новы, что я не смог получить их в TIO, но как только я это сделаю, вы можете попробовать программу . В любом случае мой репозиторий содержит версию, которая правильно обрабатывает этот код.
Программа печатает,
1
если Марио может достичь цели, а0
если нет. Вход должен содержать пробелы во всех местах, которые необходимо посетить Марио. Для общих входных данных у меня есть следующее 57-байтовое решение:объяснение
Высокоуровневое объяснение состоит в том, что нетерминал
A
, определенный в первой строке, соответствует под прямоугольнику 1 × 1 ввода, где Марио может достичь цели.A
определяется как литералE
(Марио уже у цели) или как шаблон 1 × 1 , который находится в левом столбце некоторого прямоугольника 2 × n, содержащего действительный переход Марио к другому совпадениюA
в правом столбце. Вторая строка подсчитывает количество совпадений,A
которые также содержат начальный символS
, и печатает это.Вот разбивка кода:
Идея состоит в том, что
\ {,-4}
часть слева соответствует пространству, через которое Марио прыгает вверх, а\ /*
часть справа соответствует пространственной впадине, в которую он затем падает. Мы требуем, чтобы он приземлился на матчA
(так как мы хотим достичь цели), который находится на вершине=
. Вертикальные стеки под обоими столбцами просто гарантируют, что столбцы имеют одинаковую высоту, поэтому мы можем объединить их (что и делает одно пространство в середине). Вот художественная схема ASCII примера прыжка, разбитого на вышеупомянутые прямоугольники и с пробелами, замененными на*
s:Во второй строке эта опция
n
запускает подсчет всех совпадений вместо того, чтобы найти первое совпадение. В общем решении пробелы также могут быть специальными символами без ввода, и опцияb
заставляет ввод дополняться символами без ввода.Я надеюсь, что все это имеет смысл!
источник