Jelly , 309 ไบต์ในการเข้ารหัสของ Jelly
“Æ÷“¥s“ɲ“¡µ’;“ịƊ⁴çNṂ‘_\
OḌ;¢*5$%¥/µ“+⁷ż!¤ña¡jIȧƁfvḶg/Ọ=^ƝĠ0Ẇƭ³½N~=.Ɗ°ɗẇ⁵\ɦ*ɠPf⁾?ṾHḣ 2=⁹ƒ!©ƊĠṣƥ®Ƙ0Yƙ>!ȧtƊN0w,$ɠẎ46fẋ⁷(ṣẆm⁾ŻƓṫµsçwṣḂḲd0Ruṛ’ḃ21+\iµØW“&;:' ”;“¡3ȧ%⁾xƑ?{Ñṃ;Ċ70|#%ṭdṃḃ÷ƑĠẏþḢ÷ݳȦṖcẇọqƁe ʠ°oḲVḲ²ụċmvP[ỴẊẋ€kṢ ȯḂ;jɓỴẏeṾ⁴ḳḢ7Ẓ9ġƤṙb€xÇ4ɗ⁻>Ẉm!Ƈ)%Ḃẇ$ġ£7ȧ`ỵẈƘɗ¡Ṃ&|ƙƥ³ẏrṛbḋƙċ⁻ṁƲRṀẹṾ<ñ⁻Ṅ7j^ɓĊ’b58¤ị;0ị@
ḲÇ€t0”@;Ṫ
ลองออนไลน์!
ฉันตัดสินใจว่ามันเกี่ยวกับเวลาที่ฉันได้ไปที่ท้าทายของฉันเอง การใช้เจลลี่ (และเพจรหัส 8 บิต) ทำให้ฉันได้เปรียบ 12.5% จากภาษา ASCII เท่านั้นและเจลลี่ก็สะดวกสำหรับความท้าทายนี้เนื่องจากมีผู้ดำเนินการแปลงฐานในตัวที่มีชื่อสั้น แต่ประหยัดที่สุด มีสาเหตุมาจากอัลกอริธึมการบีบอัดที่ดีกว่า (โปรแกรมนี้เฉลี่ยน้อยกว่าหนึ่งไบต์ต่อประเภทของสัตว์ประหลาด)
อัลกอริทึมและคำอธิบาย
การจำแนกประเภทโดยใช้คำ
ฉันตัดสินใจว่าเพื่อให้ได้คะแนนดีจำเป็นต้องใช้ประโยชน์จากโครงสร้างของอินพุตมากกว่ารายการอื่น ๆ สิ่งหนึ่งที่เห็นได้ชัดเจนมากคือสัตว์ประหลาดหลายตัวมีชื่อของรูปแบบ " คำคุณศัพท์ สายพันธุ์ "; red dragon
และมีทั้งสองประเภทของมังกรและทำให้ปรากฏเป็นblue dragon
D
สัตว์ประหลาดอื่น ๆ บางชื่อมีรูปแบบ " งานสายพันธุ์ " เช่น; เป็นประเภทของผีนี้จะปรากฏเป็น เรื่องที่ซับซ้อนเป็นเรื่องที่ไม่ตาย ทั้งเป็นโกโบลด์และผีดิบและรัฐหลังจะมีความสำคัญในการตั้งชื่อ NetHack มอนสเตอร์ที่ทำให้เราต้องการที่จะจำแนกประเภทนี้เช่นorc shaman
o
kobold zombie
Z
ด้วยเหตุนี้ฉันจึงจำแนกคำที่ปรากฏในชื่อสัตว์ประหลาดดังต่อไปนี้: ตัวบ่งชี้เป็นคำที่บ่งบอกระดับสัตว์ประหลาดที่เหมาะสมsphere
อย่างยิ่ง(เช่นแสดงให้เห็นอย่างชัดเจนว่าสัตว์ประหลาดนั้นอยู่ในชั้นเรียนe
); คำกำกวมเป็นคำที่ทำให้มากน้อยของข้อเสนอแนะ (ที่lord
ไม่ได้บอกคุณมาก) และคำอื่น ๆ ทั้งหมดที่มีnonwordsว่าเราไม่สนใจเกี่ยวกับ แนวคิดพื้นฐานคือเราดูคำในชื่อสัตว์ประหลาดตั้งแต่ต้นจนจบและเริ่มเลือกตัวบ่งชี้แรกที่เราเห็น ดังนั้นจึงจำเป็นที่จะต้องแน่ใจว่าชื่อมอนสเตอร์แต่ละตัวมีตัวบ่งชี้อย่างน้อยหนึ่งตัวซึ่งตามด้วยคำที่คลุมเครือ เป็นข้อยกเว้นคำที่ปรากฏในชื่อของสัตว์ประหลาดที่ดูเหมือน@
(กลุ่มที่ใหญ่ที่สุด) ล้วนจัดว่าคลุมเครือ สิ่งใดสามารถปรากฏขึ้นก่อนที่ตัวบ่งชี้ ตัวอย่างเช่นชื่อสี (เช่นred
) จะปรากฏก่อนหน้านี้เสมอในชื่อที่ไม่ใช่ตัวบ่งชี้และถือเป็น nonwords (เนื่องจากไม่เคยตรวจสอบในขณะที่กำหนดเอกลักษณ์ของสัตว์ประหลาด)
ในท้ายที่สุดโปรแกรมนี้ลงมาที่ตารางแฮชเหมือนกับที่โปรแกรมอื่นทำ อย่างไรก็ตามตารางไม่มีรายการชื่อมอนสเตอร์ทั้งหมดหรือคำทั้งหมดที่ปรากฏในชื่อมอนสเตอร์ ค่อนข้างจะมีเพียงตัวบ่งชี้ ความยุ่งเหยิงของคำที่ไม่ชัดเจนไม่ปรากฏในตาราง แต่ต้องกำหนดให้กับช่องว่าง (การพยายามค้นหาคำที่ไม่ชัดเจนจะปรากฏขึ้นเสมอ) สำหรับ nonwords นั้นไม่สำคัญว่าคำนั้นจะปรากฏในตารางหรือไม่หรือว่า hash collides หรือไม่เพราะเราไม่เคยใช้คุณค่าของการค้นหา nonword (ตารางค่อนข้างเบาบางดังนั้น nonwords ส่วนใหญ่จะไม่ปรากฏในตาราง แต่มีบางอย่างที่flesh
พบในตารางเนื่องจากการชนกันของแฮช)
นี่คือตัวอย่างบางส่วนของการทำงานของโปรแกรมนี้:
woodchuck
มีความยาวคำเดียว (เช่นตัวบ่งชี้) และการค้นหาบนโต๊ะwoodchuck
ให้คำตอบที่r
ต้องการ
abbot
ยังเป็นคำเดียวนาน @
แต่ดูเหมือนว่า เช่นabbot
นี้ถือว่าเป็นคำที่คลุมเครือ การค้นหาตารางจะว่างเปล่าและเรากลับคำตอบ@
ตามค่าเริ่มต้น
vampire lord
ประกอบด้วยตัวบ่งชี้ ( vampire
สอดคล้องกับV
) และคำที่ไม่ชัดเจน ( lord
ซึ่งไม่ได้อยู่ในตาราง) ซึ่งหมายความว่าเราจะตรวจสอบทั้งสองคำ (ย้อนลำดับ) V
แล้วให้คำตอบที่ถูกต้องของ
gelatinous cube
ประกอบด้วย nonword ( gelatinous
ซึ่งสอดคล้องกับH
เนื่องจากการชนกันของข้อมูลแฮช) และตัวบ่งชี้ ( cube
ซึ่งสอดคล้องกับb
) เนื่องจากเราใช้คำสุดท้ายที่พบในตารางเท่านั้นการส่งคืนนี้b
จึงเป็นไปตามที่คาดไว้
gnome mummy
ประกอบด้วยสองตัวชี้วัดgnome
ที่สอดคล้องกับG
และสอดคล้องกับmummy
M
เราใช้ตัวบ่งชี้สุดท้ายและรับM
ซึ่งเป็นสิ่งที่เราต้องการ
รหัสสำหรับการจัดการการจำแนกประเภทคำนั้นเป็นบรรทัดสุดท้ายของโปรแกรม Jelly นี่คือวิธีการทำงาน:
ḲÇ€t0”@;Ṫ
Ḳ Split on spaces
Ç€ Call function 2 (table lookup) on each entry
t0 Remove trailing zeroes (function 2 returns 0 to mean "not found")
”@; Prepend an @ character
Ṫ Take the last result
มีสองกรณีจริง; หากอินพุตประกอบด้วยคำที่ไม่ชัดเจนt0
ทั้งหมดลบเอาต์พุตทั้งหมดของการค้นหาตารางและเราจะได้@
ผลลัพธ์ตามค่าเริ่มต้น หากมีตัวบ่งชี้ในอินพุตt0
จะลบสิ่งใด ๆ ทางด้านขวาของตัวบ่งชี้ขวาสุดและṪ
จะให้ผลลัพธ์ที่สอดคล้องกันสำหรับตัวบ่งชี้นั้น
การบีบอัดตาราง
แน่นอนการป้อนข้อมูลเป็นคำพูดไม่ได้แก้ปัญหาด้วยตัวเอง เรายังต้องเข้ารหัสการติดต่อระหว่างตัวชี้วัดและคลาสสัตว์ประหลาดที่เกี่ยวข้อง (และการขาดการติดต่อจากคำที่ไม่ชัดเจน) เมื่อต้องการทำสิ่งนี้ฉันสร้างตาราง sparse ด้วยรายการ 181 ที่ใช้ (ตรงกับตัวบ่งชี้ 181 นี่เป็นการปรับปรุงที่ยิ่งใหญ่เหนือสัตว์ประหลาด 378!) และรายการทั้งหมด 966 รายการ (สอดคล้องกับค่าเอาต์พุต 966 ของฟังก์ชันแฮช) ตารางถูกเข้ารหัสในโปรแกรมของเขาโดยใช้สองสาย: สตริงแรกระบุขนาดของ "ช่องว่าง" ในตาราง (ซึ่งไม่มีรายการ); และสตริงที่สองระบุคลาสมอนสเตอร์ซึ่งสอดคล้องกับแต่ละรายการ สิ่งเหล่านี้ทั้งสองแสดงออกอย่างกระชับผ่านการแปลงฐาน
ในโปรแกรมเยลลี่รหัสสำหรับการค้นหาตารางพร้อมกับตัวโปรแกรมจะแสดงในบรรทัดที่สองนับจากครั้งแรกµ
เป็นต้นไป นี่คือการทำงานของโปรแกรมในส่วนนี้:
“…’ḃ21+\iµØW“&;:' ”;“…’b58¤ị;0ị@
“…’ Base 250 representation of the gap sizes
ḃ21 Convert to bijective base 21
+\ Cumulative sum (converts gaps to indexes)
i Find the input in this list
µ Set as the new default for missing arguments
ØW Uppercase + lowercase alphabets (+ junk we ignore)
“&;:' ”; Prepend "&;:' "
“…’ Base 250 representation of the table entries
b58 Convert to base 58
¤ Parse the preceding two lines as a unit
i Use the table to index into the alphabets
;0 Append a zero
i@ Use {the value as of µ} to index into the table
Bijective base 21 เป็นเหมือนฐาน 21 ยกเว้นว่า 21 เป็นตัวเลขทางกฎหมายและ 0 ไม่ใช่ นี่เป็นการเข้ารหัสที่สะดวกกว่าสำหรับเราเพราะเรานับรายการที่อยู่ติดกันสองรายการว่ามีช่องว่าง 1 เพื่อให้เราสามารถค้นหาดัชนีที่ถูกต้องผ่านผลรวมสะสม เมื่อมาถึงส่วนของตารางที่เก็บค่าเรามี 58 ค่าที่ไม่ซ้ำกันดังนั้นเราจึงถอดรหัสเป็นจำนวนเต็ม 58 ต่อเนื่องกันแล้วถอดรหัสอีกครั้งโดยใช้ตารางการค้นหาที่แมปเหล่านี้เป็นตัวละครที่ใช้จริง (ส่วนใหญ่เป็นตัวอักษรดังนั้นเราจึงเริ่มต้นตารางการค้นหารองนี้ด้วยรายการที่ไม่ใช่ตัวอักษร&;:'
จากนั้นเพียงผนวกค่าคงที่ของเยลลี่ที่เริ่มต้นด้วยตัวอักษรตัวพิมพ์ใหญ่และตัวพิมพ์เล็กมันยังมีขยะอื่น ๆ แต่เราไม่สนใจ เกี่ยวกับสิ่งนั้น.)
ค่า "ดัชนีไม่พบ" ของวุ้นหากคุณใช้เพื่อจัดทำดัชนีลงในรายการให้ส่งคืนองค์ประกอบสุดท้ายของรายการ ดังนั้นฉันจึงผนวกศูนย์ (ศูนย์จำนวนเต็มแม้ว่าตารางส่วนใหญ่ที่ทำจากตัวละคร) ในตารางการค้นหาเพื่อให้ยามที่เหมาะสมมากขึ้นเพื่อระบุรายการที่ขาดหายไป
ฟังก์ชันแฮช
ส่วนที่เหลือของโปรแกรมคือฟังก์ชั่นแฮช นี้เริ่มพอเพียงกับOḌ
; สิ่งนี้จะแปลงสตริงอินพุตให้เป็นรหัส ASCII ของมันแล้วคำนวณรหัสสุดท้ายบวก 10 เท่าของรหัสสุดท้ายและบวก 100 เท่าของรหัสก่อนหน้าและต่อไปเรื่อย ๆ (นี่เป็นตัวแทนที่สั้นมากในเยลลี่เพราะมันใช้บ่อยกว่า string →ฟังก์ชั่นการแปลงจำนวนเต็ม) อย่างไรก็ตามหากเราลดแฮชเพียงแค่นี้โดยตรงผ่านการทำงานของโมดูลัสเราจะต้องมีโต๊ะที่ค่อนข้างใหญ่ ดังนั้นฉันเริ่มด้วยการปฏิบัติการเพื่อลดตาราง พวกเขาแต่ละคนทำงานเช่นนี้: เรารับพลังที่ห้าของค่าแฮชปัจจุบัน; จากนั้นเราลดค่าโมดูโลค่าคงที่ (ค่าคงที่ใดขึ้นอยู่กับการดำเนินการที่เราใช้) ห่วงโซ่นี้ให้การประหยัดมากขึ้น (ในแง่ของการลดขนาดของตารางผลลัพธ์) กว่าค่าใช้จ่าย (ในแง่ของความจำเป็นในการเข้ารหัสสายโซ่ของการดำเนินงานของตัวเอง) ในสองวิธี: มันสามารถทำให้ตารางมีขนาดเล็กกว่ามาก (966 รายการมากกว่า 3529 รายการ) และการใช้หลายขั้นตอนทำให้มีโอกาสมากขึ้นในการแนะนำการชนที่เป็นประโยชน์ (สิ่งนี้ไม่ได้เกิดขึ้นมากนัก แต่มีการชนกันเช่น: ทั้งสองDeath
และYeenoghu
แฮชถึง 806) รายการจากตารางขณะที่พวกเขาทั้งสองไป&
) ตัวดัดแปลงที่ใช้ที่นี่คือ [3529, 2163, 1999, 1739, 1523, 1378, 1246, 1223, 1145, 966] อนึ่งเหตุผลในการเพิ่มพลังที่ห้าคือถ้าคุณเพิ่งเอาค่าโดยตรงไปช่องว่างก็มักจะมีขนาดเท่าเดิมในขณะที่การยกกำลังจะย้ายช่องว่างรอบ ๆ และทำให้ตารางกระจายได้อย่างเท่าเทียมกันมากขึ้น ห่วงโซ่แทนที่จะติดอยู่ในขั้นต่ำของท้องถิ่น (ช่องว่างกระจายอย่างเท่าเทียมกันมากขึ้นช่วยให้การเข้ารหัส terser ขนาดช่องว่าง) สิ่งนี้จะต้องมีพลังแปลก ๆ เพื่อป้องกันไม่ให้ข้อเท็จจริงที่x ² = (- x ) ²แนะนำการชนและ 5 ทำงานได้ดีกว่า 3
บรรทัดแรกของโปรแกรมเข้ารหัสลำดับของโมเดลโดยใช้การเข้ารหัสเดลต้า:
“…’;“…‘_\
“…’ Compressed integer list encoding, arbitrary sized integers
; Append
“…‘ Compressed integer list encoding, small integers (≤ 249)
_\ Take cumulative differences
ส่วนที่เหลือของโปรแกรมจุดเริ่มต้นของบรรทัดที่สองใช้ฟังก์ชันแฮช:
OḌ;¢*5$%¥/
O Take ASCII codepoints
Ḍ "Convert from decimal", generalized to values outside the range 0-9
;¢ Append the table of moduli from the previous line
/ Then reduce by:
*5$ raising to the power 5 (parsing this as a group)
%¥ and modulusing by the right argument (parsing this as a group, too).
การตรวจสอบ
นี่เป็นสคริปต์ Perl ที่ฉันใช้ในการตรวจสอบว่าโปรแกรมทำงานอย่างถูกต้อง:
use warnings;
use strict;
use utf8;
use IPC::Run qw/run/;
my %monsters = ("Aleax", "A", "Angel", "A", "Arch Priest", "@", "Archon", "A",
"Ashikaga Takauji", "@", "Asmodeus", "&", "Baalzebub", "&", "Chromatic Dragon",
"D", "Croesus", "@", "Cyclops", "H", "Dark One", "@", "Death", "&", "Demogorgon",
"&", "Dispater", "&", "Elvenking", "@", "Famine", "&", "Geryon", "&",
"Grand Master", "@", "Green-elf", "@", "Grey-elf", "@", "Hippocrates", "@",
"Ixoth", "D", "Juiblex", "&", "Keystone Kop", "K", "King Arthur", "@",
"Kop Kaptain", "K", "Kop Lieutenant", "K", "Kop Sergeant", "K", "Lord Carnarvon",
"@", "Lord Sato", "@", "Lord Surtur", "H", "Master Assassin", "@", "Master Kaen",
"@", "Master of Thieves", "@", "Medusa", "@", "Minion of Huhetotl", "&",
"Mordor orc", "o", "Nalzok", "&", "Nazgul", "W", "Neferet the Green", "@", "Norn",
"@", "Olog-hai", "T", "Oracle", "@", "Orcus", "&", "Orion", "@", "Pelias", "@",
"Pestilence", "&", "Scorpius", "s", "Shaman Karnov", "@", "Thoth Amon", "@",
"Twoflower", "@", "Uruk-hai", "o", "Vlad the Impaler", "V", "Wizard of Yendor",
"@", "Woodland-elf", "@", "Yeenoghu", "&", "abbot", "@", "acid blob", "b",
"acolyte", "@", "air elemental", "E", "aligned priest", "@", "ape", "Y",
"apprentice", "@", "arch-lich", "L", "archeologist", "@", "attendant", "@",
"baby black dragon", "D", "baby blue dragon", "D", "baby crocodile", ":",
"baby gray dragon", "D", "baby green dragon", "D", "baby long worm", "w",
"baby orange dragon", "D", "baby purple worm", "w", "baby red dragon", "D",
"baby silver dragon", "D", "baby white dragon", "D", "baby yellow dragon", "D",
"balrog", "&", "baluchitherium", "q", "barbarian", "@", "barbed devil", "&",
"barrow wight", "W", "bat", "B", "black dragon", "D", "black light", "y",
"black naga hatchling", "N", "black naga", "N", "black pudding", "P",
"black unicorn", "u", "blue dragon", "D", "blue jelly", "j", "bone devil", "&",
"brown mold", "F", "brown pudding", "P", "bugbear", "h", "captain", "@",
"carnivorous ape", "Y", "cave spider", "s", "caveman", "@", "cavewoman", "@",
"centipede", "s", "chameleon", ":", "chickatrice", "c", "chieftain", "@",
"clay golem", "'", "cobra", "S", "cockatrice", "c", "couatl", "A", "coyote", "d",
"crocodile", ":", "demilich", "L", "dingo", "d", "disenchanter", "R", "djinni",
"&", "dog", "d", "doppelganger", "@", "dust vortex", "v", "dwarf king", "h",
"dwarf lord", "h", "dwarf mummy", "M", "dwarf zombie", "Z", "dwarf", "h",
"earth elemental", "E", "electric eel", ";", "elf mummy", "M", "elf zombie", "Z",
"elf", "@", "elf-lord", "@", "energy vortex", "v", "erinys", "&", "ettin mummy",
"M", "ettin zombie", "Z", "ettin", "H", "fire ant", "a", "fire elemental", "E",
"fire giant", "H", "fire vortex", "v", "flaming sphere", "e", "flesh golem", "'",
"floating eye", "e", "fog cloud", "v", "forest centaur", "C", "fox", "d",
"freezing sphere", "e", "frost giant", "H", "gargoyle", "g", "garter snake", "S",
"gas spore", "e", "gecko", ":", "gelatinous cube", "b", "ghost", " ", "ghoul",
"Z", "giant ant", "a", "giant bat", "B", "giant beetle", "a", "giant eel", ";",
"giant mimic", "m", "giant mummy", "M", "giant rat", "r", "giant spider", "s",
"giant zombie", "Z", "giant", "H", "glass golem", "'", "glass piercer", "p",
"gnome king", "G", "gnome lord", "G", "gnome mummy", "M", "gnome zombie", "Z",
"gnome", "G", "gnomish wizard", "G", "goblin", "o", "gold golem", "'",
"golden naga hatchling", "N", "golden naga", "N", "gray dragon", "D", "gray ooze",
"P", "gray unicorn", "u", "green dragon", "D", "green mold", "F", "green slime",
"P", "gremlin", "g", "grid bug", "x", "guard", "@", "guardian naga hatchling",
"N", "guardian naga", "N", "guide", "@", "healer", "@", "hell hound pup", "d",
"hell hound", "d", "hezrou", "&", "high priest", "@", "hill giant", "H",
"hill orc", "o", "hobbit", "h", "hobgoblin", "o", "homunculus", "i",
"horned devil", "&", "horse", "u", "housecat", "f", "human mummy", "M",
"human zombie", "Z", "human", "@", "hunter", "@", "ice devil", "&", "ice troll",
"T", "ice vortex", "v", "iguana", ":", "imp", "i", "incubus", "&", "iron golem",
"'", "iron piercer", "p", "jabberwock", "J", "jackal", "d", "jaguar", "f",
"jellyfish", ";", "ki-rin", "A", "killer bee", "a", "kitten", "f", "knight", "@",
"kobold lord", "k", "kobold mummy", "M", "kobold shaman", "k", "kobold zombie",
"Z", "kobold", "k", "kraken", ";", "large cat", "f", "large dog", "d",
"large kobold", "k", "large mimic", "m", "leather golem", "'", "lemure", "i",
"leocrotta", "q", "leprechaun", "l", "lich", "L", "lichen", "F", "lieutenant",
"@", "little dog", "d", "lizard", ":", "long worm", "w", "lurker above", "t",
"lynx", "f", "mail daemon", "&", "manes", "i", "marilith", "&", "master lich",
"L", "master mind flayer", "h", "mastodon", "q", "mind flayer", "h", "minotaur",
"H", "monk", "@", "monkey", "Y", "mountain centaur", "C", "mountain nymph", "n",
"mumak", "q", "nalfeshnee", "&", "neanderthal", "@", "newt", ":", "ninja", "@",
"nurse", "@", "ochre jelly", "j", "ogre king", "O", "ogre lord", "O", "ogre", "O",
"orange dragon", "D", "orc mummy", "M", "orc shaman", "o", "orc zombie", "Z",
"orc", "o", "orc-captain", "o", "owlbear", "Y", "page", "@", "panther", "f",
"paper golem", "'", "piranha", ";", "pit fiend", "&", "pit viper", "S",
"plains centaur", "C", "pony", "u", "priest", "@", "priestess", "@", "prisoner",
"@", "purple worm", "w", "pyrolisk", "c", "python", "S", "quantum mechanic", "Q",
"quasit", "i", "queen bee", "a", "quivering blob", "b", "rabid rat", "r",
"ranger", "@", "raven", "B", "red dragon", "D", "red mold", "F",
"red naga hatchling", "N", "red naga", "N", "rock mole", "r", "rock piercer", "p",
"rock troll", "T", "rogue", "@", "rope golem", "'", "roshi", "@", "rothe", "q",
"rust monster", "R", "salamander", ":", "samurai", "@", "sandestin", "&",
"sasquatch", "Y", "scorpion", "s", "sergeant", "@", "sewer rat", "r", "shade", " ",
"shark", ";", "shocking sphere", "e", "shopkeeper", "@", "shrieker", "F",
"silver dragon", "D", "skeleton", "Z", "small mimic", "m", "snake", "S",
"soldier ant", "a", "soldier", "@", "spotted jelly", "j", "stalker", "E",
"steam vortex", "v", "stone giant", "H", "stone golem", "'", "storm giant", "H",
"straw golem", "'", "student", "@", "succubus", "&", "tengu", "i", "thug", "@",
"tiger", "f", "titan", "H", "titanothere", "q", "tourist", "@", "trapper", "t",
"troll", "T", "umber hulk", "U", "valkyrie", "@", "vampire bat", "B",
"vampire lord", "V", "vampire", "V", "violet fungus", "F", "vrock", "&", "warg",
"d", "warhorse", "u", "warrior", "@", "watch captain", "@", "watchman", "@",
"water demon", "&", "water elemental", "E", "water moccasin", "S", "water nymph",
"n", "water troll", "T", "werejackal", "d", "wererat", "r", "werewolf", "d",
"white dragon", "D", "white unicorn", "u", "winged gargoyle", "g",
"winter wolf cub", "d", "winter wolf", "d", "wizard", "@", "wolf", "d",
"wood golem", "'", "wood nymph", "n", "woodchuck", "r", "wraith", "W", "wumpus",
"q", "xan", "x", "xorn", "X", "yellow dragon", "D", "yellow light", "y",
"yellow mold", "F", "yeti", "Y", "zruty", "z");
for my $monster (sort keys %monsters) {
run ["./jelly", "fu", "monsters.j", $monster], \ "", \my $out;
print "$monster -> \"$out\" (",
($out ne $monsters{$monster} ? "in" : ""), "correct)\n";
}
mail daemon
> _ <