В аркадной версии игры Pac-Man ест пакоты. Однако в этом испытании он жаждет буквенно-цифровых символов и знаков препинания в строке.
Ваша задача - создать функцию, которая будет кормить Pac-Man строкой, оценивать, сможет ли он ее съесть или нет, и возвращает строку с указанием местоположения Pac-Man.
Pac-Man ( <
) поедает персонажей слева направо, оставляя подчеркивание или пробел для каждого персонажа по ходу, и его цель - добраться от первой позиции-1 до последней позиции + 1:
1. <Pac
2. _<ac
3. __<c
4. ___<
Тем не менее, естественный враг Pac-Man, призрак, остановит его, если он встретит одну из букв в слове «GHOST» (без учета регистра). Ваша функция должна возвращать строку с местоположением Pac-Man, когда он встречает ghost
персонажа:
1. <No!
2. _<o!
Единственное, что может победить призрака - это гранула. Если Pac-Man достигнет буквы в слове «ПЕЛЛЕТ» (также не чувствительной к регистру) перед тем, как прийти к призраку, он съест призрака и продолжит движение, и этот шарик будет израсходован. Силовые пеллеты могут складываться (то есть в ppgg
обоих призраков можно было бы съесть). Символ Т существует как призрак и шарик, поэтому его можно игнорировать (например, любую другую букву a
).
1. <Pop
2. _<op
3. __<p
4. ___<
Для дальнейшего уточнения, в строке «Pac-Man проигрывает здесь» выполняются следующие операции:
P <P, +1 Pellet (1 pellet)
a <a
c <c
- <-
M <M
a <a
n <n
<[space]
l <l, +1 Pellet (2 pellets)
o <o, -1 Pellet (1 pellet)
s <s, -1 Pellet (0 pellets)
e <e, +1 Pellet (1 pellet)
s <s, -1 Pellet (0 pellets)
<[space]
h <h, ghost wins, returns
e
r
e
Примеры
Input: Pacman wins!
Output: ____________<
Input: Pacman loses wah-wah :(
Output: _______________<h-wah :(
Input: PELLET PELLET GHOST
Output: ___________________<
Input: Hello World!
Output: <Hello World!
Input: <_!@12<_<_<
Output: ___________<
Это код-гольф - выигрывает самая низкая оценка в байтах.
источник
<
символ ...Ответы:
Желе,
3433 байтаПопробуйте онлайн!
Я думаю, что я наконец начинаю понимать Jelly. Чувствует себя немного страшно.
источник
Retina ,
5538 байтПопробуйте онлайн! (Первая строка позволяет запускать сразу несколько тестовых случаев.)
объяснение
Проблема заключается в том, чтобы найти самый длинный префикс, который не имеет непревзойденных закрывающих скобок. Кроме того, что мы можем использовать либо
e
,l
илиp
в месте ,(
и либоg
,h
,o
илиs
на месте)
.Следовательно, это решение является почти учебным примером балансировки групп. Я не буду вдаваться в подробности того, как они работают, так как этот код по сути такой же, как и стандартный пример, который вы можете прочитать в моем SO-ответе о балансировке групп .
Поэтому вся программа представляет собой одну подстановку регулярных выражений.
i
Активирует прецедентное нечувствительность. Затем мы либо сопоставляем шарик с[elp]
и увеличиваем счетчик глубины (в виде стека захвата группы2
), либо сопоставляем что-то, что не является призраком,[ghos]
либо сопоставляем призрак с.
и уменьшаем счетчик глубины, выталкивая из стека2
, Конечно, в принципе это позволяет сопоставить шарик с[^ghos]
разделом или не-призрак с.
разделом, но благодаря жадному сопоставлению и способу обратного выражения регулярного выражения, эти возможности никогда не используются движком регулярного выражения.Затем подстановка использует две особенности Retina:
$*
повторяет символ справа столько раз, сколько указано токеном слева. Этот токен -$.&
это длина всего матча. Это просто означает, что мы заменяем каждый символ в матче на_
. И затем мы также добавляем<
к этим подчеркиваниям. Та часть ввода, которая не была съедена, остается незатронутой подстановкой.источник
Python 2,
114113108 байтисточник
None
, а не ответ. А как ты считаешь 107? Я считаю 110.Python 2, 89 байт
Иногда моя упрямая решимость сделать Python функциональным языком имеет свои преимущества.
(Слегка) ungolfed:
Создает строку результата, используя рекурсию. Обновление
l
(для «жизней») добавляет 1 для pellets (True - False == 1
), вычитает 1 для ghosts (False - True == -1
) и добавляет 0 для любого другого персонажа. Он также добавляет 0, когдаs
это пустая строка, благодаря разрезанию в Python и тому факту'' in any_str == True
, что пеллет и призрак отменяются.Оператор возврата используется
test and b or a
вместо того,a if test else b
чтобы сохранить один байт. Базовый случай рекурсии происходит, когда либо заканчивается строка, либо у Pac-Man заканчиваются шарики, кратко представленные какs*p
, что равно''
(и поэтому оценивается как ложное), когда либо либо,s == ''
либоp == 0
.источник
C #,
269256232212211 байтПервый в истории пост здесь, так что это, вероятно, намного дольше, чем могло бы быть (и, вероятно, потому что это в C #). Любые советы о том, где я мог бы сократить это было бы здорово!
Спасибо всем в комментариях, кто мне помог!
Гольф версия
Неуправляемая версия
источник
else
сохранения еще 5 символов. И запустив цикл уi = 1
вас должна быть возможность удалить последний if, так как код может выполняться каждый раз.s[i]
доступ для 5 символов.P="PELpel"
иG="GHOSghos"
? Вы используете их только один раз каждый. Я что-то упустил или это просто 4 лишних символа? Кроме того, вам нужноelse
?"PELpel".Contains(c)
и"GHOSghos".Contains(c)
должен быть взаимоисключающим.Pyth,
534844 байта4 байта спасибо @ Pietu1998 за трюк
!!@
->}
(который могут понять только люди, которые знают Pyth)Тестирование.
источник
!!@
это просто триграф}
, верно? : pMATL ,
373635 байтПопробуйте онлайн!
объяснение
источник
JavaScript (ES6), 98 байт
Пояснение:
p
поддерживает текущее количество гранул. Если он уже отрицательный, мы просто возвращаем символ и продолжаем, так что остальная часть строки остается нетронутой. В противном случае мы проверяем текущий символ, и если онp
становится отрицательным, мы вставляем<
символ, в противном случае мы заменяем текущий символ на_
. Наконец, еслиp
никогда не становится отрицательным, мы добавляем суффикс a<
к строке.источник
Pyth,
474644 байтаПопробуйте онлайн. Тестирование.
Совсем иной подход, чем у Лики Нун, и я совершенно уверен, что это можно сделать в дальнейшем.
источник
Z
вместоG
и изменитеf!
наf!h
t
в"ghost"
должен быть удаленЛуа,
198190184185163 байтаХорошо, я признаю, это долго. Очень долго. У Lua есть некоторые инструменты для работы со строками, но он ограничен, то же самое касается условных выражений, которые занимают много места.
Редактировать: спасибо @LeakyNun за спасение мне 9 байтов :) Потерял несколько байтов, чтобы исправить ошибку
Редактировать 2: 163 байта решение найдено @LeakyNun
Старый 185
Ungolfed
источник
d=c:lower()
и искать заглавные буквы, а такжеand 1or s and 1or s
s and s
print(('').rep('_',i)..','..z:sub(i+1))
i
может бытьnil
Python 3,
176157150149134133124 байтаОпределите функцию с именем,
f
которая принимает строку в качестве аргументаМожет быть, больше в гольф
Спасибо всем, кто прокомментировал: D
источник
x=c.upper()
и найти строчные буквы;
а не располагая каждое в отдельной строке. Также вы можете использовать Python 2, который позволяет использовать пробелы в качестве первого целевого уровня и вкладки в качестве второго.n=i=0
неn=0
аi=0
.t[i]="_"
вместо тогоt[i] = "_"
же дляt[i] = "<"
.return''.join(t)
, удали это место."GgHhOoSs"
и"PpEeLl"
.Python 3,
114110 байтМой первый код гольф.
Спасибо Dr Green Eggs и Iron Man за сохранение 4 байтов.
Использует вычисление логических значений в единицу и ноль для сжатия логического И для умножения. (0 * 0 = 0, 1 * 0 = 0, 1 * 1 = 1). Я надеюсь, что это хорошая первая попытка.
источник
while s[x:]*l
4 байта.Powershell, 185
Ungolfed:
источник
Python3,
211184 байтаАргумент 's' является строкой
Буду признателен за советы по игре в гольф, так как это моя первая попытка игры в гольф
Спасибо за комментарий :)
источник
return "_"*c + "<" + s[c:]
на простоbreak
как этот код будет выполняться после цикла for в любом случае.Haskell,
119113 байтСпасибо Даниэлю Вагнеру за 6 байтов меньше.
Назовите это как
p "Hello World!"
.Это
1then
крайний случай, который правильно интерпретируется в моем GHC (7.10), но он отбрасывает большинство подсветок синтаксиса. Так что это может интерпретироваться по-разному и в вашем компиляторе.Ungolfed:
источник
n!(c:s)|elem c"blah"=blah|elem c"blah"=blah|0<1=blah
.C 237 байт
источник
C ++,
315373327 байт(Примечание: все еще игра в гольф)
источник
if()
, и удаления пробелов вокруг!=
,||
,=
,-
, и<=
. Кроме того, неcin>>input
работает вместоgetline
? Вы также можете сгущаться вокруг;
.Рубин (119 байт)
Вероятно, есть некоторые вещи, которые я пропускаю, поскольку я новичок в этом ...
Руби мой друг :)
источник
Perl, 54 (52 + 2) байта
Необходимо
-p
указать в параметрах командной строки.Объяснение:
-p
Опция заставляет заявление быть обернуты в цикле чтение-модификация-печати, где во время каждой итерации цикла,$_
содержит строку ввода, в том числе линии разделителя.Регулярное выражение в значительной степени та же идея, что и в ответе Retina.
Назовите шаблон поиска
([pel](?1)*[ghos]|[^ghos ])*
"приемлемым". Тогда это может быть рекурсивно определено как:Строка является «приемлемой», если:
PELLET
кроме»T
, за которым следует допустимая строка, за которой следует символ в «GHOST
кроме»T
.GHOST
за исключением того,T
что это не символ перевода строки.Это определение допускает больше шариков, чем призраков:
PEL
персонаж может быть сопоставлен либо с шариком, либо с не призрачным персонажем.Пустая строка считается приемлемой, поэтому регулярное выражение гарантированно совпадает в позиции 0, где будет найдена самая длинная приемлемая подстрока.
Эту самую длинную приемлемую подстроку затем сопоставляют подчеркивания равной длины, за которым следует
<
.источник
-p
использования-
, например,perl -e
->perl -pe
, то-
это бесплатно. Но я думаю, чтоperl -e
версия длиннее из-за цитирования, поэтому я не могу использовать это здесь.