जेली के एन्कोडिंग में जेली , 309 बाइट्स
“Æ÷“¥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-बिट कोडपेज) का उपयोग मुझे ASCII- केवल भाषाओं पर 12.5% का लाभ देता है, और जेली इस चुनौती के लिए सुविधाजनक है क्योंकि छोटे नामों के साथ अंतर्निहित आधार रूपांतरण ऑपरेटर होने के कारण, लेकिन अधिकांश बचत एक बेहतर संपीड़न एल्गोरिथ्म के कारण होता है (यह प्रोग्राम औसतन एक बाइट प्रति राक्षस की तुलना में कम है)।
एल्गोरिथम और स्पष्टीकरण
शब्द-आधारित वर्गीकरण
मैंने तय किया कि एक अच्छा स्कोर प्राप्त करने के लिए, इनपुट की संरचना का अन्य प्रविष्टियों की तुलना में अधिक लाभ लेना आवश्यक था। एक बात जो बहुत ध्यान देने योग्य है, वह यह है कि कई राक्षसों के नाम " विशेषण प्रजाति " के हैं; a red dragon
और a blue dragon
दोनों प्रकार के ड्रैगन हैं, और इस प्रकार दिखाई देते हैं D
। कुछ अन्य राक्षसों के रूप में " प्रजाति की नौकरी " के नाम हैं, जैसे कि orc shaman
; एक प्रकार का orc होने के नाते, यह ऐसा प्रतीत होता है o
। शिकायत करने वाले मामले पूर्ववत हैं; ए kobold zombie
दोनों एक कोबोल्ड और एक ज़ोंबी है, और बाद की स्थिति नेटहैक मॉन्स्टर नामकरण में पूर्वता लेती है, इस प्रकार हम इसे वर्गीकृत करना चाहते हैं Z
।
जैसे, मैंने उन शब्दों को वर्गीकृत किया जो राक्षस नामों में दिखाई देते हैं: एक संकेतक एक शब्द है जो दृढ़ता से उपयुक्त राक्षस वर्ग का sphere
सुझाव देता है (जैसे दृढ़ता से पता चलता है कि राक्षस वर्ग में है e
); एक अस्पष्ट शब्द एक शब्द बहुत एक सुझाव के कम बनाता है ( lord
आप ज्यादा बता नहीं करता है), और अन्य सभी शब्द हैं nonwords है कि हम के बारे में परवाह नहीं है। मूल विचार यह है कि हम दैत्य नाम के शब्द को पीछे से शुरू से देखते हैं, और पहले संकेतक को देखते हैं जो हम देखते हैं। जैसे, यह सुनिश्चित करना आवश्यक था कि प्रत्येक राक्षस का नाम कम से कम एक संकेतक हो, जो पूरी तरह से अस्पष्ट शब्दों द्वारा पीछा किया गया था। अपवाद के रूप में, वे शब्द जो राक्षसों के नामों में दिखाई देते हैं जो एक जैसे दिखते हैं@
(सबसे बड़ा समूह) सभी को अस्पष्ट के रूप में वर्गीकृत किया गया है। एक संकेतक से पहले कुछ भी दिखाई दे सकता है; उदाहरण के लिए, रंग के नाम (जैसे red
) हमेशा एक संकेतक की तुलना में एक नाम में पहले दिखाई देते हैं, और इस तरह उन्हें गैर-पासवर्ड माना जाता है (जैसा कि उन्हें राक्षस की पहचान निर्धारित करते समय कभी भी जांच नहीं की जाती है)।
अंत में, यह प्रोग्राम हैश टेबल पर आ जाता है, जैसे अन्य प्रोग्राम करते हैं। हालाँकि, तालिका में सभी राक्षस नामों के लिए प्रविष्टियाँ नहीं हैं, या उन सभी शब्दों के लिए जो राक्षस नामों में दिखाई देते हैं; बल्कि, इसमें केवल संकेतक होते हैं। अस्पष्ट शब्दों का हैश तालिका में दिखाई नहीं देता है, लेकिन खाली स्लॉट्स को सौंपा जाना चाहिए (हमेशा अस्पष्ट शब्द देखने की कोशिश करना) खाली हो जाएगा। गैर-पासवर्ड के लिए, यह कोई मायने नहीं रखता है कि शब्द तालिका में दिखाई देता है या नहीं, या हैश टकराता है या नहीं, क्योंकि हम कभी भी एक गैर-शब्द को देखने के मूल्य का उपयोग नहीं करते हैं। (तालिका काफी विरल है, इसलिए अधिकांश गैर-कीवर्ड तालिका में दिखाई नहीं देते हैं, लेकिन कुछ, जैसे कि flesh
, तालिका में हैश टकराव के परिणामस्वरूप पाए जाते हैं।)
यहाँ कुछ उदाहरण हैं कि कार्यक्रम का यह भाग कैसे काम करता है:
woodchuck
एक एकल शब्द लंबा है (इस तरह एक संकेतक), और टेबल लुकअप woodchuck
हमें इच्छित उत्तर देता है r
।
abbot
एक एकल शब्द भी लंबा है, लेकिन एक जैसा दिखता है @
। जैसे, abbot
एक अस्पष्ट शब्द माना जाता है; तालिका लुकअप खाली आता है, और हम @
डिफ़ॉल्ट रूप से उत्तर देते हैं ।
vampire lord
एक संकेतक ( vampire
संबंधित V
) और एक अस्पष्ट शब्द ( lord
, जो तालिका में नहीं है) के होते हैं। इसका मतलब है कि हम दोनों शब्दों (रिवर्स ऑर्डर में) की जांच करते हैं, फिर सही उत्तर देते हैं V
।
gelatinous cube
एक नॉनवर्ड ( हैश टकराव के कारण gelatinous
संगत H
) और एक संकेतक ( cube
, इसी b
) के होते हैं। जैसा कि हम केवल तालिका में पाए गए अंतिम शब्द को लेते हैं, यह b
उम्मीद के मुताबिक रिटर्न करता है।
gnome mummy
के gnome
लिए G
और mummy
इसी से संबंधित दो संकेतक होते हैं M
। हम अंतिम संकेतक लेते हैं, और प्राप्त करते हैं M
, जो हम चाहते हैं।
शब्द-आधारित वर्गीकरण को संभालने के लिए कोड जेली कार्यक्रम की अंतिम पंक्ति है। यहां देखिए यह कैसे काम करता है:
ḲÇ€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
तो सही संकेतक के दाईं ओर कुछ भी हटा देगा, और Ṫ
हमें उस संकेतक के लिए संबंधित परिणाम देगा।
टेबल संपीड़न
बेशक, इनपुट को शब्दों में तोड़ना समस्या को स्वयं हल नहीं करता है; हमें अभी भी संकेतक और संबंधित राक्षस वर्गों (और अस्पष्ट शब्दों से पत्राचार की कमी) के बीच पत्राचार को दोहराना है। ऐसा करने के लिए, मैंने 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
आधार विशेष 21 आधार 21 की तरह है, सिवाय इसके कि 21 एक कानूनी अंक है और 0 नहीं है। यह हमारे लिए एक अधिक सुविधाजनक एन्कोडिंग है क्योंकि हम 1 के अंतराल के रूप में दो आसन्न प्रविष्टियों की गणना करते हैं, ताकि हम संचयी योग के माध्यम से मान्य अनुक्रमितों को पा सकें। जब यह मान रखने वाली तालिका के हिस्से में आता है, तो हमारे पास 58 अद्वितीय मूल्य होते हैं, इसलिए हम पहले 58 लगातार पूर्णांक में डिकोड करते हैं, और फिर एक लुकअप तालिका का उपयोग करके फिर से डिकोड करते हैं जो इन्हें उपयोग किए जा रहे वास्तविक वर्णों में मैप करता है। (इनमें से अधिकांश अक्षर हैं, इसलिए हम इस माध्यमिक लुकअप तालिका को गैर-पत्र प्रविष्टियों के साथ शुरू करते हैं &;:'
, और फिर सिर्फ एक जेली स्थिरांक को जोड़ते हैं जो अपरकेस और लोअरकेस वर्णमाला के साथ शुरू होता है; इसमें कुछ अन्य कबाड़ भी हैं लेकिन हम परवाह नहीं करते हैं उसके बारे में।)
जेली का "इंडेक्स नहीं मिला" प्रहरी मूल्य, यदि आप इसे किसी सूची में अनुक्रमित करने के लिए उपयोग करते हैं, तो सूची का अंतिम तत्व लौटाता है; इस प्रकार, मैंने एक लापता प्रविष्टि को इंगित करने के लिए एक अधिक उपयुक्त प्रहरी देने के लिए लुकअप तालिका में एक शून्य (एक पूर्णांक शून्य, भले ही तालिका के अधिकतर पात्रों से बना) को संलग्न किया।
हैश फंकशन
कार्यक्रम का शेष भाग हैश फ़ंक्शन है। यह बस के साथ पर्याप्त शुरू होता हैOḌ
; यह इनपुट स्ट्रिंग को अपने ASCII कोडों में परिवर्तित करता है, और फिर अंतिम कोड की गणना करता है, साथ ही 10 बार दंडात्मक कोड, और कोड के 100 गुना से पहले कोड, और इसी तरह (यह जेली में बहुत कम प्रतिनिधित्व है क्योंकि यह आमतौर पर अधिक उपयोग किया जाता है स्ट्रिंग → पूर्णांक रूपांतरण समारोह)। हालाँकि, यदि हम सीधे मापांक ऑपरेशन के माध्यम से इस हैश को कम कर देते हैं, तो हमें एक बड़ी तालिका की आवश्यकता होगी। इसलिए इसके बजाय, मैं तालिका को कम करने के लिए संचालन की एक श्रृंखला के साथ शुरू करता हूं। वे प्रत्येक इस तरह काम करते हैं: हम वर्तमान हैश मूल्य की पांचवीं शक्ति लेते हैं; तब हम मूल्य मोड्यूल को एक स्थिर (जो कि हम किस ऑपरेशन का उपयोग कर रहे हैं पर निर्भर करता है) को कम करते हैं। यह श्रृंखला लागत (परिणामी तालिका आकार को कम करने के संदर्भ में) की तुलना में अधिक लागत देती है (संचालन की श्रृंखला को स्वयं को एन्कोड करने की आवश्यकता के संदर्भ में), दो तरीकों से: यह तालिका बना सकती हैबहुत छोटा (3566 प्रविष्टियों के बजाय 966), और कई चरणों का उपयोग लाभकारी टक्करों को पेश करने का अधिक अवसर देता है (यह बहुत ज्यादा नहीं हुआ, लेकिन इस तरह की एक टक्कर है: दोनों Death
और Yeenoghu
हैश से 806, इस प्रकार हमें एक को हटाने की अनुमति मिलती है तालिका से प्रवेश, क्योंकि वे दोनों जाते हैं&
)। यहाँ उपयोग किए जाने वाले मोडुली [3529, 2163, 1999, 1739, 1523, 1378, 1246, 1223, 1145, 966] हैं। संयोग से, पांचवीं शक्ति को बढ़ाने का कारण यह है कि यदि आप सीधे मूल्य लेते हैं, तो अंतराल समान आकार के रहते हैं, जबकि घातांक अंतराल को चारों ओर ले जाता है और तालिका के समान वितरण के बाद इसे समान रूप से वितरित करना संभव बनाता है। एक स्थानीय न्यूनतम में फंसने के बजाय श्रृंखला (अधिक समान रूप से वितरित अंतराल अंतराल के आकार के एक टसर एन्कोडिंग के लिए अनुमति देते हैं)। इस तथ्य को रोकने के लिए एक विषम शक्ति होनी चाहिए कि x - = (- x ) worked टकरावों का परिचय दे, और 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).
सत्यापन
यह पर्ल स्क्रिप्ट है जिसका उपयोग मैंने यह सत्यापित करने के लिए किया था कि कार्यक्रम सही ढंग से काम करता है:
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
> _ <