Pannenkoek2012 стремится завершить Super Mario 64 с минимальным количеством нажатий кнопки A, что заставляет Mario прыгать. Каждый «Пресс» состоит из трех частей:
- Нажатие кнопки
- Держать его в течение любого промежутка времени
- Выпуская это
Посмотрите это видео (1:15 - 3:23) для лучшего объяснения, которое включает в себя изображение выше. (Тем не менее, эта задача не будет использовать терминологию полу-пресса и создаст препятствия, которые требуют освобождения А.)
Задача:
Учитывая последовательность препятствий, требующих нажатия (P), удерживания (H) или отпускания (R) кнопки A, выведите наименьшее количество нажатий, необходимых для их преодоления, в указанном порядке. Кнопка А изначально не удерживается.
Сформулируем формально: учитывая строку символов S PHR
, рассмотрим строки формы, (PH*R)*
которые содержат S как подпоследовательность, и выведите наименьшее возможное число P
's в такой строке. Или, в качестве альтернативы, найдите наименьшее количество кусков в форме, на P?H*R?
которые можно разбить S.
пример
Давайте посмотрим на вход RHRPHHHR
. Кнопка A начинает не удерживаться, поэтому для преодоления начального препятствия R
необходимо нажать и отпустить кнопку (нажмите # 1). Затем мы должны удерживать кнопку H
, которая снова требует, чтобы она сначала была нажата (нажмите # 2). Затем он может быть затем отпущен для удовлетворения R
после него. Наконец, оставшиеся PHHHR
могут быть удовлетворены с помощью одного нажатия (нажмите # 3), а затем удерживая HHH
и отпуская R
. Итак, количество выводов равно 3.
Другой способ увидеть это, это то, что мы можем разбить входную строку на 3 части формы, PHH..HHR
где буквы могут быть опущены.
R
HR
PHHHR
Формат ввода
Входными данными будет список или строка элементов, представляющих нажатия, удержания и отпускания по вашему выбору:
P, H, R
p, h, r
1, 2, 3
0, 1, 2
соответствует в указанном порядке. Ввод не будет пустым.
Тестовые случаи:
P 1
H 1
R 1
HP 2
RHP 3
HHR 1
PHRH 2
RHRPHHHR 3
HHHHHH 1
PPRRHHPP 6
HPPRHRPRHPPRHPPHRP 12
PRHRHPHHPRRRHPPRHHPPRRRHRHPRPHPRPRHHRPPPRHPRP 28
Leaderboard:
Ответы:
Сетчатка , 9 байт
Попробуйте онлайн!
источник
Pyth , 13 байт
Попробуй это здесь! или Проверьте все контрольные примеры.
Обратите внимание, что
1
также работает вместо3
.Как это работает?
Подробнее о регулярном выражении:
источник
Желе , 10 байт
Монадическая цепочка, принимающая список (
P,H,R : 0,1,2
опция) и возвращающая целое число, количество.Попробуйте онлайн! или посмотрите набор тестов
Как?
Эффективно работает путем получать все смежные пары , то считая , что любой не «продолжение» пары (
PR
,PH
,HR
, илиHH
) и добавив к нему один.Предыдущее 11-байтовое решение:
Попробуйте онлайн! или посмотрите набор тестов
Как?
Работает как выше, но совершенно по-другому ...
и другое, опять же совсем другое:
(добавьте 19 к каждому, затем для соседних пар возведите в степень, по модулю 13, по модулю 2, суммируйте и добавьте единицу).
источник
Пакетный, 69 байт
Принимает ввод как список 0-индексированных параметров командной строки, но вы можете использовать список букв
p, h, r
в верхнем или нижнем регистре, если вы наберетеset /a p=0, h=1, r=2
первый. Объяснение:b
ведется последний ввод (по умолчанию2
для выпущен) иn
количество нажатий. Каждый ввод добавляет нажатие, если последний вход был выпуском или текущий ввод является нажатием.источник
set
можно установить несколько переменных одновременно? Полезно знать.set /a
- это арифметическая оценка, поэтому, пока все переменные, которые вы хотите установить, являются числовыми, вы можете просто использовать запятую для объединения выражений присваивания.Python 2, 44 байта
Использует P-> 1 H-> 2 R-> 3
источник
Deorst , 11 байт
Попробуйте онлайн!
Использует регулярное выражение мистера Xcoder
источник
Japt, 11 байт
Попробуй это | Проверьте все тесты
è
считает количество совпадений RegEx на входе иÉ
вычитает 1.источник
Python 2 , 48 байт
Попробуйте онлайн!
Принимает в
0,1,2
качестве ввода.источник
Шелуха ,
65 байтПопробуйте онлайн! Ввод - это список поверх
0,1,2
(ссылка TIO использует буквы для упрощения копирования тестовых случаев).объяснение
Я использую ту же общую идею, что и в ответе Jelly на Джонатана Аллана : разбить на случаи появления «пар разрывов» PP, HP, RH, RR и RP и подсчитать полученные блоки. В кодировке 0,1,2 эти пары являются именно теми, чей левый элемент равен 2 или правый элемент равен 0.
источник
Javascript (ES6), 30 байт
источник
Haskell , 36 байт
Попробуйте онлайн!
Использует
0,1,2
кодировку.источник
Желе , 10 байт
Попробуйте онлайн! или тестовый набор! (
УкраденоЗаимствовано у Джонатана.)Альтернатива:
Попробуйте онлайн!
Желе , 11 байт
Сохранено 1 байт с помощью caird.
Попробуйте онлайн!
источник
μ
из третьегоКотлин , 36 байт
украшенный
Тест
TIO
TryItOnline
источник
J ,
1817 байт-1 Спасибо @FrownyFrog
Принимает вход в виде
0,1,2
. Вспомогательная функция в TIO преобразует контрольные примеры в эту форму.Попробуйте онлайн!
Логика сравнений все еще может быть пригодна для игры в гольф. Я скручиваю свой мозг в узлы, пытаясь придумать более эквивалентные и короткие выражения.
Пояснение (предыдущее решение)
Единственная разница между текущим решением и предыдущим заключается в том, как создаются сравнения. Текущее решение явно сравнивает соседние элементы путем смещения массива, а предыдущее решение сравнивает соседние элементы, просматривая инфиксы 2.
Это было бы намного чище, если бы два трюма ничего не сделали. Код принимает инфиксы из двух и проверяет, не являются ли они восходящими и не являются ли они двумя. Если это так, то мы добавляем один к нашему окончательному счету. Мы должны добавить 1 к концу, так как иначе мы на единицу (или вы можете добавить
_
или любое значение больше 2).Он проверяет, является ли инфикс двумя удержаниями, путем умножения двух значений вместе и проверки, является ли оно одним (два удержания являются
1 1
).источник
1+1#.}:(<+:1=*)}.
один короче.1+1#.0=}.*2-}:
Vim +
wc
, 25 байт␊
является ключом возврата и␘
является Ctrl+XПопробуйте онлайн!
объяснение
источник