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"]]
Odpowiedzi:
CJam,
987 931 925663 bajtówZauważ, że zawiera on wszystkie znaki ASCII o kodzie ASCII od 32 do 255. Niektóre znaki mogą być pomijane przez SE, więc lepiej skopiować kod z linku powyżej
Powyższy kod jest podstawową wersją następującego rozwiązania 925 bajtowego:
Nowe linie są tylko na pokaz.
Można dużo grać w golfa , ale przynajmniej udało mi się przejść wszystkie testy -_-.Trwało to dłużej niż oczekiwano.
AKTUALIZACJA 1 - trochę zagrał w golfa w części kodu. Nadal można uzyskać więcej. Część struny można również przekształcić w golfa / bazę, ale powstrzymam się od tego teraz, ponieważ wszystkie inne odpowiedzi też tego nie robią.
AKTUALIZACJA 2 - Koniec gry w golfa, teraz czas na kompresję tego ciągu.
AKTUALIZACJA 3 - Baza przekonwertowała ciąg znaków, aby zmniejszyć rozmiar kodu do 663 bajtów (można go zmniejszyć do 640 bajtów, ale są też od 0 do 31 znaków kodu ASCII, z którymi naprawdę trudno sobie poradzić, a ja będę się tylko z nimi zajmował kiedy znów mnie pobiją).
Wypróbuj online tutaj
źródło
Python 2, 685
Definiuje funkcję
f
akceptującą dwa ciągi. Zwracana wartość to ciąg znaków,Surrender
jeśli gracz się poddaje; w przeciwnym razie zestaw składający się ze strun (które wskazują zaklęcia dwuręczne) i krotek strun o długości 2 (wskazujących osobne zaklęcia dla każdej ręki).Źródło zakodowane w standardzie Base64:
Źródło ma postać,
exec "eu352909HE%#NTHQh".decode('zip')
która wykonuje następujący kod:źródło
Jawa,
15651388Zadzwoń z
java M %leftString %rightString
. Wysyła,Surrender
jeśli gracz się poddaje. W przeciwnym razie wyświetla ciąg znaków w tej formiebothHandSpell;oneHandSpell,oneHandSpell;...
. Uwaga: jest to jedno rozwiązanie liniowe dla dość skomplikowanego problemu. :)Zębaty:
Edycja: Wykorzystano sugestię Piotra, aby utworzyć tablicę ciągów z mniejszym kodem.
Będziemy wdzięczni za wszelkie wskazówki, które mogłyby to poprawić.
źródło
JavaScript (ES6),
1070941Kodowane w Base64:
Uruchamiasz go
eval(atob("Zj0obCxyK..."))
w konsoli Firefox.Kod w golfa (może zawierać znaki nieobsługiwane przez Stack Exchange):
Ponieważ słownik pisowni składa się tylko z liter, możemy traktować go jako ciąg zakodowany w standardzie base64 i używać liczb jako separatorów i spacji. „Zdekodowałem” ciąg podobny do base64 na ciąg binarny, który ma 3/4 rozmiaru oryginału.
Lekko niegolfowany:
Jednym z golfów, które szczególnie lubię, jest testowanie pustych tablic
array - 1
.[] - 1 => "" - 1 => 0 - 1 => -1 (truthy)
["foo"] - 1 => "foo" - 1 => NaN (falsey)
źródło