Gra Waving Hands znajduje się gdzieś pomiędzy kartką Magic: the Gathering i bardzo skomplikowanymi Rock Paper Scissors. Za każdym razem zapisujesz jeden z ośmiu gestów dla każdej ręki:
- poruszył
F
ingers - zaproponował
P
jałmużnę S
drzemkaW
zdrowaśkaD
igit wskazującC
podołek- sta
B
N
othing
Istnieje kilka ważnych zasad, które mają pierwszeństwo przed resztą:
- Jeśli obie ręce wykonają gest
P
, automatycznie się poddajesz . (To uproszczenie, ale pójdziemy z tym.) - Tylko jedna ręka może gestować
B
.
Seria gestów wykonywanych tą samą ręką może rzucić zaklęcie, przy czym każde zaklęcie jest powiązane z jedną określoną sekwencją. Sekwencje te mogą się nakładać, ale każdy gest może być użyty tylko jako ostatni gest pojedynczego zaklęcia (dzięki czemu możesz utworzyć do dwóch zaklęć w jednej turze). Niektóre zaklęcia wymagają wykonania gestu obiema rękami jednocześnie.
Twoim zadaniem jest określenie listy gestów dla każdej ręki, aby określić, które zaklęcia można rzucić w bieżącej turze. Dla każdej ręki ostatnia litera na liście reprezentuje gest wybrany dla bieżącej tury.
Oto lista sekwencji gestów. Wielkie litery odnoszą się do gestu wykonywanego jedną ręką, małe litery odnoszą się do gestu wykonywanego obiema rękami.
B Stab
cDPW Dispel magic
cSWWS Summon elemental
cw Magic mirror
DFFDD Lightning bolt
DFPW Cure heavy wounds
DFW Cure light wounds
DPP Amnesia
DSF Confusion
DSFFFc Disease
DWFFd Blindness
DWSSSP Delayed effect
DWWFWc Raise dead
DWWFWD Poison
FFF Paralysis
FPSFW Summon troll
FSSDD Fireball
P Shield
p Surrender
PDWP Remove enchantment
PPws Invisibility
PSDD Charm monster
PSDF Charm person
PSFW Summon ogre
PWPFSSSD Finger of death
PWPWWc Haste
SD Missile
SFW Summon goblin
SPF Antispell
SPFPSDW Permanency
SPPc Time stop
SSFP Resist cold
SWD Fear
SWWc Fire storm
WDDc Lightning bolt
WFP Cause light wounds
WFPSFW Summon giant
WPFD Cause heavy wounds
WPP Counterspell
WSSc Ice storm
WWFP Resist heat
WWP Protection from evil
WWS Counterspell
Tak, Lightning bolt
i Counterspell
każda z nich ma dwie różne sekwencje.
Możesz napisać program lub funkcję, przyjmując dane wejściowe w dowolnym dogodnym formacie listy lub ciągu, za pomocą STDIN, argumentu wiersza poleceń lub argumentu funkcji, o ile nie jest on wstępnie przetworzony. Możesz generować pary zaklęć poprzez wartość zwracaną lub drukując do STDOUT. Ponownie możesz użyć dowolnego wygodnego formatu listy lub łańcucha, o ile dane wyjściowe są jednoznaczne.
Możesz założyć, że sekwencje dla lewej i prawej ręki są tej samej długości i że są prawidłowe (w szczególności B
nigdy nie będą wykonywane dwiema rękami jednocześnie). Pamiętaj, że dane wejściowe będą zawierać tylko wielkie litery. Małe litery są używane tylko na powyższej liście, aby wskazać, że obie ręce muszą wykonać ten sam gest (wielkie litery).
W przypadku zaklęć kończących się oburęcznym gestem powinieneś po prostu rzucić jeden czar. Jeśli jedna ręka nie może wykonać zaklęcia, musi to być oznaczone ciągiem zawierającym tylko łącznik,-
.
To jest kod golfowy, więc wygrywa najkrótsza odpowiedź (w bajtach).
Przykłady
Każdy przykład składa się z trzech wierszy: sekwencji lewej ręki, sekwencji prawej ręki (oba dane wejściowe; najbardziej prawy gest jest najnowszy) oraz lista wszystkich możliwych kombinacji zaklęć (wynik).
WFP
WWS
[["Cause light wounds","Counterspell"],["Shield","Counterspell"]]
SD
BB
[["Missile","Stab"]]
WWP
WPP
[["Surrender"]]
DFW
CCW
[["Cure light wounds","-"]]
FFW
WWF
[["-","-"]]
DCW
CCW
[["Magic mirror"]]
WFPSFW
PPDDPP
[["Summon goblin","Shield"],["Summon ogre","Shield"],["Summon troll","Shield"],
["Summon giant","Shield"],["Summon goblin","Amnesia"],["Summon ogre","Amnesia"],
["Summon troll","Amnesia"],["Summon giant","Amnesia"]]
BSWWS
CSWWS
[["Counterspell","Counterspell"]]
CSWWS
CSWWS
[["Counterspell","Counterspell"],["Counterspell","Summon elemental"],
["Summon elemental","Counterspell"],["Summon elemental","Summon elemental"]]
PWPWWC
BBSPPC
[["Haste"],["Time stop"]]