Допоможіть pannenkoek порахувати A натискає


28

pannenkoek2012 має на меті виконати Super Mario 64 якомога менше натискань на кнопку A, завдяки чому Маріо стрибає. Кожна преса складається з трьох частин:

  • Натискання кнопки
  • Тримайте його будь-який проміжок часу
  • Звільняючи його

Частини преси A, з відео Pannenkoek2012

Дивіться у цьому відео (1:15 - 3:23), щоб отримати чудове пояснення, яке містить наведене вище зображення. (Однак цей виклик не буде використовувати термінологію напівпресування A і створюватиме перешкоди, які потребують звільнення А.)

Завдання:

Враховуючи послідовність перешкод, які потребують натискання (P), утримування (H) або відпускання (R) кнопки A, видайте найменшу кількість натискань, необхідних для їх подолання у заданому порядку. Спочатку кнопка 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

Табло:


1
А як щодо перешкод, які вимагають не утримувати кнопку A? У графіку є чотири стани кнопок (я думаю, що вони теж можуть існувати в грі)
Random832

3
Насправді існує 3 стани: Press, Held і Not-hold. Жоден стан не потребує кнопки "Відпустити". Виклик трохи неправильний у порівнянні з реальністю.
користувач202729

1
@ 11684 "Що стосується випуску, ну, наразі немає випадків, коли це корисно чи важливо, тому не хвилюйтеся з приводу цієї частини". (1:48 - 1:52)
користувач202729

3
Хтось хоче це зробити в зборі MIPS? (мова, яка використовується для програмування Super Mario 64)
користувач202729

1
@ user202729 Ого, це один ретельний млинець. Спасибі!
11684

Відповіді:



3

Pyth , 13 байт

tl:z"P?H*R?"3

Спробуйте тут! або Перевірте всі тестові випадки.

Зауважте, що 1також працює замість 3.

Як це працює?

tl: z "P? H * R?" 3 | Повна програма. Бере вхід з STDIN, виводить на STDOUT.

  : z 3 | Розділити вхідний рядок на збіги ...
    "P? H * R?" | Регулярний вираз "P? H * R?".
 l | Отримайте довжину.
т | Зменшення (тому що розщеплення включає порожній рядок).

Більше про регулярний вираз:

П? | P - Буквальний символ P, залежно від регістру.
       | ? - кількісний показник. Збігається або в один, або в нуль разів більше попереднього символу.
  Н * | Н - Буквальний символ Н, залежно від регістру.
       | * - Квантор. Відповідає будь-якій кількості подій попереднього символу.
    R? | R - Буквальний символ R, залежний від регістру.
       | ? - кількісний показник. Збігається або в один, або в нуль разів більше попереднього символу.

Ах, фейк, ти мене до цього побив!
Кудлатий

приємно! Другий до останнього рядка в описі регулярного виразу повинен говорити "Буквальний символ R", правда?
vidstige

@vidstige Так, дякую. Виправлено
пан Xcoder

2

Желе , 10 байт

o5ḄƝ%⁵>4S‘

Монадійний ланцюжок, що бере список ( P,H,R : 0,1,2опція) і повертає ціле число, вважається.

Спробуйте в Інтернеті! або побачити набір тестів

Як?

Ефективно працює шляхом отримувати всі суміжні пари , то вважаючи , що будь-який не «продовження» пари ( PR, PH, HR, або HH) і додавши до нього один.

o5ḄƝ%⁵>4S‘ - Link: list of integers (in [0,1,2])  e.g.: [0,0,1,0,2,1,1,2,2,0] (representing PPHPRHHRRP)
o5         - logical OR with 5                          [5,5,1,5,2,1,1,2,2,5]
   Ɲ       - for all adjacent pairs:              i.e.: [5,5],[5,1],[1,5],[5,2],[2,1],[1,1],[1,2],[2,2],[2,5]
  Ḅ        -   convert from binary                      [ 15 ,  11 ,  7  ,  12 ,  5  ,  3  ,  4  ,  6  ,  9 ]
     ⁵     - literal ten
    %      - modulo                                     [  5 ,   1 ,  7  ,   2,   5  ,  3  ,  4  ,  6  ,  9 ]
      >4   - greater than four?                         [  1 ,   0 ,  1  ,   0,   1  ,  0  ,  0  ,  1  ,  1 ]
        S  - sum                                        5
         ‘ - increment                                  6

Попереднє рішення 11 байт:

ḅ3Ɲạ3ḟ1,2L‘

Спробуйте в Інтернеті! або побачити набір тестів

Як?

Працює як описано вище, але зовсім по-іншому ...

ḅ3Ɲạ3ḟ1,2L‘ - Link: list of integers (in [0,1,2])  e.g.: [0,0,1,0,2,1,1,2,2,0] (representing PPHPRHHRRP)
  Ɲ         - for all adjacent pairs:              i.e.: [0,0],[0,1],[1,0],[0,2],[2,1],[1,1],[1,2],[2,2],[2,0]
ḅ3          -   convert from base three                  [ 0  ,  1  ,  3  ,  2  ,  7  ,  4  ,  5  ,  8  ,  6 ]
   ạ3       - absolute difference with three             [ 3  ,  2  ,  0  ,  1  ,  4  ,  1  ,  2  ,  5  ,  3 ]
     ḟ1,2   - filter discard if in [1,2]                 [ 3        ,  0        ,  4              ,  5  ,  3 ]
         L  - length                                     5
          ‘ - increment                                  6

і інше, знову зовсім інше:

+19*Ɲ%13ḂS‘

(додайте 19 до кожної, потім для сусідніх пар виконайте експоненцію, модуль на 13, модуль на 2, підсумовуйте та додайте одне).


Новий желе швидкий!
користувач202729

2

Пакет, 69 байт

@set/ab=2,n=0
@for %%b in (%*)do @set/an+=b/2^|!%%b,b=%%b
@echo %n%

Вводиться як список списку параметрів командного рядка, що індексується 0, але ви можете використовувати список букв p, h, rу верхньому або нижньому регістрі, якщо ви введете set /a p=0, h=1, r=2перший. Пояснення: bпідтримує останній ввід (за замовчуванням 2для звільненого) та nкількість натискань. Кожен вхід додає пресу, якщо останнім входом був випуск або поточним входом є преса.


О, чи setможна встановити кілька змінних одночасно? Корисно знати.
користувач202729

1
@ user202729 set /a- це арифметичне оцінювання, якщо всі змінні, які ви хочете встановити, є числовими, ви можете просто використовувати оператор кома для об'єднання виразів призначення.
Ніл

2

Python 2, 44 байти

Використовує P-> 1 H-> 2 R-> 3

lambda a:sum(1/y|x/3for x,y in zip([3]+a,a))




1

Лушпиння , 6 5 байт

Lġo&ε

Спробуйте в Інтернеті! Введення - це список 0,1,2(посилання TIO використовує літери для полегшення копіювання тестових випадків).

Пояснення

Я використовую ту саму загальну ідею, що і відповідь Джонатана Аллана на Jelly : розділити на виникнення "пар розривів" PP, HP, RH, RR та RP, і підрахувати отримані блоки. У кодуванні 0,1,2 ці пари є саме тими, чий лівий елемент дорівнює 2, а правий - 0.

Lġo&ε  Input is a list.
 ġ     Split between pairs that do not satisfy:
    ε  the left element is at most 1
  o&   and the right element is truthy.
L      Length.



1

Желе , 10 байт

Pn1></µƝS‘

Спробуйте в Інтернеті! або Тестовий набір! ( Викрадене запозичене у Джонатана.)

Альтернатива:

P=1=</µƝS‘

Спробуйте в Інтернеті!

Pn1></µƝS‘ | Monadic chain.

      µƝ   | Map over each pair of "neighbours" (x, y) in the list.
P          | And check whether their product...
 n1        | ... 1 if it doesn't equal 1, 0 otherwise...
   >       | Is higher than?
    </     | The pair reduced by "Smaller than?". 1 if x < y, else 0.
        S  | Sum.
         ‘ | Add 1.

Желе , 11 байт

Збережено 1 байт за допомогою інструментів для співпраці з птахами.

ḅ3Ɲf⁽vḲD¤L‘

Спробуйте в Інтернеті!


Aww, я пропустив шанс бути першим, хто скористався сусідами швидко :(
caird coinheringaahing

Ви можете зняти μтретій
caird coinheringaahing

1

Котлін , 36 байт

Regex("P?H*R?").findAll(i).count()-1

Прикрасили

Regex("P?H*R?").findAll(i).count()-1

Тест

fun f(i:String) =
Regex("P?H*R?").findAll(i).count()-1
data class Test(val input: String, val output: Int)

val TESTS = listOf(
        Test("P", 1),
        Test("H", 1),
        Test("R", 1),
        Test("HP", 2),
        Test("RHP", 3),
        Test("HHR", 1),
        Test("PHRH", 2),
        Test("RHRPHHHR", 3),
        Test("HHHHHH", 1),
        Test("PPRRHHPP", 6),
        Test("HPPRHRPRHPPRHPPHRP", 12),
        Test("PRHRHPHHPRRRHPPRHHPPRRRHRHPRPHPRPRHHRPPPRHPRP", 28)
)

fun main(args: Array<String>) {
    for ((input, expectded) in TESTS) {
        val actual = f(input)
        if (actual != expectded) {
            throw AssertionError("$input $expectded $actual")
        }
    }
}

ТІО

TryItOnline


0

J , 18 17 байт

-1 Завдяки @FrownyFrog

1+1#.}:(<+:1=*)}.

Вводиться у вигляді 0,1,2. Хелперна функція на TIO перетворює тестові випадки у цю форму.

Спробуйте в Інтернеті!

Логіка порівнянь все-таки може бути головою. Я скручую мозок у вузли, намагаючись придумати більш рівноцінні та короткі висловлювання.

Пояснення (попереднє рішення)

1+1#.2(</+:1=*/)\]

Єдина відмінність поточного рішення від попереднього полягає в тому, як формуються порівняння. Поточне рішення явно порівнює сусідні елементи шляхом зміщення масиву, а попереднє рішення порівнює сусідні елементи, переглядаючи інфікси 2.

1 + 1 #. 2 (</ +: 1 = */)\ ]
         2               \ ]  On infixes of 2 on the input
                  1 = */        Is the infix 1 1 (two holds)?
            </                  Is the infix x y such that x < y?
               +:               These results NORed
    1 #.                       Add all of the results together (debase to base 1)
1 +                            Add one

Це було б набагато чистіше, якби два трюми нічого не зробили. Код бере інфікси з двох і перевіряє, чи вони не висхідні та не два затримки. Якщо це так, то ми додамо його до остаточного підрахунку. Ми мусимо додати 1 до кінця, оскільки ми вимкнемось іншим способом (або ви можете додати _або будь-яке значення, що перевищує 2).

Те, як він перевіряє, чи є інфікс двома затримками, шляхом множення двох значень разом і перевірки, чи є одна (два затримки є 1 1).


1
1+1#.}:(<+:1=*)}.на один коротший.
FrownyFrog

@FrownyFrog Розумний, я відредагую це.
cole

1
14:1+1#.0=}.*2-}:
Хмурий жаба

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.