вдохновение
Этот вопрос навеян карточками Throne Room и King's Court из популярной карточной игры Dominion .
Как часть своего хода, каждый играет последовательность действий. Эти два конкретных действия приводят к повторению следующего проигрываемого действия два или три раза *. Другие «общие» действия вызывают определенные игровые эффекты, но мы не будем интересоваться подробностями, просто помечая их буквами.
Интересный случай, когда Тронный Зал или Королевский Суд воздействуют на другой Тронный Зал Королевского Суда, в результате чего эффект удвоения или утроения сам по себе удваивается или утраивается. Длинные цепочки Тронных комнат, Королевских Судов и умноженные действия могут сбить с толку даже опытных игроков Доминиона.
Ваша цель - написать код, который правильно разрешает эти цепочки, используя как можно меньше байтов. Я опишу требования программы, прежде чем объяснить, как цепочки разрешаются в правилах Доминиона.
* Технически, вы выбираете действие, на которое влияют, как часть решения Тронного Зала или Королевского Суда, но этот взгляд является более чистым для этой задачи.
Требования к программе
Написать программу или именованную функцию . Он должен принимать цепочку сыгранных действий (ввод STDIN или функции) и выводить или распечатывать результирующую цепочку действий от эффектов удвоения и утроения. Побеждает несколько байтов.
вход
Строка, представляющая последовательность сыгранных действий. Общие действия представлены заглавными буквами A
через Z
. Специальное Удвоение действие Тронный зал представлен характер 2
, и троекратное действие короля Суд по 3
,
Количество символов (действий) будет от 1 до 30 включительно. При желании вы можете ввести конец строки в новой строке.
Пример ввода: WA23G3GA
Выход
Строка заглавных букв A
в Z
. Это должна быть последовательность общих действий, возникающих в результате разрешения эффектов удвоения и утроения, в порядке их возникновения.
У вас может быть выходной конец в новой строке, если вы хотите. В противном случае не должно быть никаких дополнительных символов.
Пример вывода: WAGGGGGGAAA
.
Как работает удвоение и утроение в Доминионе
Здесь я расскажу о том, как работают цепочки Тронных комнат ( 2
ов) и Королевских судов ( 3
ий) в соответствии с правилами Доминиона.
После того, как вы сыграете a 2
, следующее действие, которое будет решено, произойдет дважды. Итак, если вы впервые играете 2
, значит A
, вы A
встречаетесь дважды.
2A -> AA
Так же,
A2BC -> ABBC
3DE -> DDDE
3N2BC3XY2 -> NNNBBCXXXY
Обратите внимание, в последнем примере, что финал не 2
имеет ничего, чтобы удвоить, поэтому он не имел никакого эффекта.
Интересная вещь происходит, когда эффекты удвоения или утроения сами удваиваются или утраиваются. Например,
22AB -> AABB
Во-первых, вы играете 2
. Затем вы играете другой 2
, который удваивается от предыдущего 2
. В результате следующие два действия удваиваются. Во-первых, две копии A
разрешения. Затем копии B
разрешения.
Обратите внимание, что A
это не в четыре раза: после того, как первый экземпляр 2
действует на первый A
, следующий экземпляр действует на следующее неразрешенное действие, которое есть B
. Без B
, мы бы
22A -> AA
где вторая копия 2
ожидает удвоения следующего действия, но никаких действий не происходит.
Наконец, давайте посмотрим на сложный пример.
223BCDE -> BBBCCCDDE
Как и прежде, первое 2
вызывает 2
удвоение второго . Итак, следующие два действия будут удвоены. Первая копия 2
удваивает следующее действие 3
, которое должно быть решено полностью перед разрешением следующей копии 2
. Первая копия 3
троек B
, а вторая копия троек C
. Теперь, все еще ожидающая вторая копия 2
удваивает следующее все еще неразрешенное действие, которое является D
. После этого эффекты удвоения или утроения не сохраняются, и окончательное действие E
просто происходит.
Контрольные примеры
Они даны как (input,output)
.
(FY, FY)
(A2BC, ABBC)
(3DE, DDDE)
(3N2BC3XY2, NNNBBCXXXY)
(WA23G3GA, WAGGGGGGAAA)
(32, )
(33RST, RRRSSSTTT)
(2A32B2CDEFG, AABBCCDDEEFG)
(A2A323AB2CD2D2E3ABC, AAAAAABBBCCDDDDEEAAABBBC)
(P22LL3Q2Q22T, PLLLLQQQQQTT)
(322322ABCDEFGHIJKLMN, AABBCCDDEEEFFGGHHIJKLMN)
1
в том, чтобы помещать под стеком одинаковые умноженные действия так же, как умноженные. Не могли бы вы объяснить подробнее, как вы манипулируете различными стеками? В частности, что делает \ "сделать стек репов на вершине"?