Permainan Waving Tangan adalah suatu tempat antara pena dan kertas Magic: Gathering dan sangat rumit batu gunting kertas. Setiap belokan Anda menuliskan satu dari delapan gerakan untuk masing-masing tangan:
F
inger menggoyangkan- menawarkan
P
alm S
tidur sebentarW
aveD
igit menunjukC
putaran- staf
B
N
othing
Ada beberapa aturan penting yang diutamakan daripada yang lain:
- Jika kedua tangan memberi isyarat
P
Anda secara otomatis menyerah . (Ini adalah penyederhanaan, tapi kami akan melakukannya.) - Hanya satu tangan pada satu waktu yang bisa memberi isyarat
B
.
Serangkaian gerakan yang dilakukan oleh tangan yang sama dapat membuat mantra, di mana masing-masing mantra terikat pada satu urutan tertentu. Urutan ini dapat tumpang tindih, tetapi setiap gerakan hanya dapat digunakan sebagai gerakan terakhir dari satu mantra (sehingga Anda dapat membuat hingga dua mantra dalam satu putaran). Beberapa mantra membutuhkan gerakan yang harus dilakukan dengan kedua tangan secara bersamaan.
Tugas Anda adalah, diberikan daftar gerakan untuk masing-masing tangan, untuk menentukan mantra mana yang bisa dilemparkan pada giliran saat ini. Untuk masing-masing tangan, huruf terakhir dalam daftar mewakili gerakan yang dipilih untuk giliran saat ini.
Berikut adalah daftar urutan gerakan. Huruf besar mengacu pada gerakan yang dilakukan oleh satu tangan, sedangkan huruf kecil mengacu pada gerakan yang dilakukan dengan kedua tangan.
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
Ya, Lightning bolt
dan Counterspell
masing-masing memiliki dua urutan yang berbeda.
Anda dapat menulis sebuah program atau fungsi, mengambil input dalam daftar apa pun atau format string, melalui STDIN, argumen baris perintah atau argumen fungsi, selama itu tidak diproses sebelumnya. Anda dapat mengeluarkan pasangan mantra melalui nilai balik atau dengan mencetak ke STDOUT. Sekali lagi, Anda dapat menggunakan format string atau daftar yang mudah digunakan, selama outputnya tidak ambigu.
Anda dapat mengasumsikan bahwa urutan untuk tangan kiri dan kanan sama, dan bahwa mereka valid (khususnya, B
tidak akan pernah dilakukan oleh dua tangan pada saat yang sama). Perhatikan bahwa input hanya akan berisi huruf besar. Huruf kecil hanya digunakan dalam daftar di atas untuk menunjukkan bahwa kedua tangan perlu melakukan gerakan (huruf besar) yang sama.
Untuk mantra yang berakhir dengan gerakan dua tangan, Anda harus mengeluarkan satu mantra. Jika satu tangan tidak dapat melakukan mantra, ini perlu ditunjukkan oleh string yang hanya berisi tanda hubung -
,.
Ini kode golf, jadi jawaban tersingkat (dalam byte) menang.
Contohnya
Setiap contoh terdiri dari tiga baris: urutan tangan kiri, urutan tangan kanan (kedua input; gerakan paling kanan adalah yang terbaru), dan daftar semua kombinasi mantra yang mungkin (output).
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"]]
Jawaban:
CJam,
987 931 925663 bytePerhatikan bahwa ini berisi semua karakter ASCII dari kode ASCII 32 hingga 255 saja. Beberapa karakter mungkin dilewati oleh SE, jadi lebih baik menyalin kode dari tautan di atas
Kode di atas adalah versi dasar yang dikonversi dari solusi 925 byte berikut:
Baris baru hanya untuk pertunjukan.
Ini bisa bermain golf banyak , tapi setidaknya saya mendapatkannya untuk lulus semua test case -_-.Ini membutuhkan waktu lebih lama dari yang diharapkan.
PEMBARUAN 1 - sedikit memutarkan bagian kode. Masih ada ruang untuk lebih. Bagian string juga dapat di-golf / basis dikonversi, tetapi saya akan menahan diri dari itu sekarang karena semua jawaban lain juga tidak melakukannya.
UPDATE 2 - Selesai golf kode, sekarang saatnya untuk mengompresi string itu.
UPDATE 3 - Base mengkonversikan string untuk mengurangi ukuran kode menjadi 663 byte (Ini dapat dikurangi menjadi 640 byte, tetapi kemudian ada 0 hingga 31 karakter kode ASCII juga, yang sangat sulit untuk ditangani dan saya hanya akan berada di sana ketika saya dipukuli lagi).
Cobalah online di sini
sumber
Python 2, 685
Menentukan fungsi yang
f
menerima dua string. Nilai kembali adalah stringSurrender
jika pemain menyerah; jika tidak, satu set terdiri dari string (yang menunjukkan mantra dua tangan), dan panjang-2 tupel string (menunjukkan mantra terpisah untuk masing-masing tangan).Sumber yang disandikan Base64:
Sumbernya dari bentuk
exec "eu352909HE%#NTHQh".decode('zip')
yang mengeksekusi kode berikut:sumber
Jawa,
15651388Panggil dengan
java M %leftString %rightString
. KeluaranSurrender
jika pemain menyerah. Kalau tidak, output string dalam formulir inibothHandSpell;oneHandSpell,oneHandSpell;...
. Catatan, ini adalah solusi satu liner untuk masalah yang agak rumit. :)Bertakuk:
Sunting: Menggunakan saran Peter untuk membuat array String dengan kode lebih sedikit.
Setiap petunjuk untuk meningkatkan ini akan dihargai.
sumber
JavaScript (ES6),
1070941Base64 disandikan:
Anda menjalankannya dengan melakukannya
eval(atob("Zj0obCxyK..."))
di konsol Firefox.Kode golf (mungkin termasuk karakter yang tidak didukung oleh Stack Exchange):
Karena kamus ejaan hanya terdiri dari huruf, kita dapat memperlakukannya sebagai string yang disandikan base64 dan menggunakan angka sebagai pemisah dan spasi. Saya "mendekodekan" string base64 seperti menjadi string biner, yang 3/4 ukuran aslinya.
Tanpa ungolfed:
Salah satu golf yang saya sukai adalah menguji array kosong
array - 1
.[] - 1 => "" - 1 => 0 - 1 => -1 (truthy)
["foo"] - 1 => "foo" - 1 => NaN (falsey)
sumber