灵感
这个问题的灵感来自于流行的甲板建筑纸牌游戏《Dominion》中的《王座室》和《王宫》。
作为回合的一部分,人们扮演一系列动作。这两个特定动作导致下一个播放的动作重复两次或三次*。其他“一般”动作会导致特定的游戏效果,但是我们对细节不感兴趣,只需用字母标记它们即可。
有趣的情况是,当一个王室或国王法院影响另一个王室的王室时,使自身的加倍或三倍效果增加了一倍或三倍。长久的宝座室,国王宫廷和繁复的动作链会混淆甚至是经验丰富的Dominion玩家。
您的目标是编写使用尽可能少的字节正确解析这些链的代码。在解释这些链如何在Dominion规则中解析之前,我将描述程序要求。
*从技术上讲,您选择受影响的行动是解决“王室”或“国王法院”的一部分,但这种观点对于解决这一挑战是比较干净的。
课程要求
写一个 程序或命名函数。它应该接受所播放的动作链(STDIN或函数输入),并输出或打印因加倍和三倍效果而产生的动作链。最少的字节数获胜。
输入值
一个字符串,表示播放的动作序列。一般的操作是用大写字母来表示A
通过Z
。特殊加倍动作王座室由人物表示2
,三重动作“国王法院”由表示3
,
字符(动作)的数量在1到30之间(含1和30)。如果需要,可以在换行符后面输入输入。
输入示例: WA23G3GA
输出量
大写字母组成的字符串A
来Z
。这应该是解决双重和三重影响所产生的一般动作的顺序,顺序是它们发生的顺序。
如果需要,可以将输出结尾换行。否则不应有其他字符。
输出示例:WAGGGGGGAAA
。
Dominion中的两倍和三倍如何工作
在这里,我将详细说明根据自治领规则2
,王室室和国王法院的链条如何3
工作。
播放后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
入堆栈的技巧,将未乘的动作与乘的相同。您能否解释一下有关如何处理各种堆栈的更多信息?特别是,“将rep栈带到顶部”怎么办?