জেলি , জেলি এর এনকোডিংয়ে 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
।
এর মতো, আমি দানবের নামগুলিতে প্রদর্শিত শব্দগুলিকে নিম্নরূপে শ্রেণিবদ্ধ করেছিলাম: একটি সূচক এমন একটি শব্দ যা দৃ mons়ভাবে উপযুক্ত দৈত্য শ্রেণিকে sphere
প্রস্তাব দেয় (উদাহরণস্বরূপ দৃ strongly়ভাবে প্রস্তাব দেয় যে দানবটি শ্রেণিতে রয়েছে e
); একটি দ্ব্যর্থহীন শব্দটি এমন একটি শব্দ যা কোনও পরামর্শকে অনেক কম lord
করে দেয় ( আপনাকে খুব বেশি কিছু বলে না), এবং অন্যান্য সমস্ত শব্দ এমন ননওয়ার্ড যা আমরা যত্ন করি না। মূল ধারণাটি হ'ল আমরা দৈত্যের নামের শব্দগুলি প্রান্ত থেকে শুরু পর্যন্ত শুরু করে দেখি এবং প্রথম সূচকটি যা আমরা দেখি তা চয়ন করি। এই হিসাবে, এটি নিশ্চিত করা প্রয়োজন যে প্রতিটি দানবীর নামটিতে কমপক্ষে একটি সূচক রয়েছে যা পুরোপুরি অস্পষ্ট শব্দ দ্বারা অনুসরণ করা হয়েছিল। একটি ব্যতিক্রম হিসাবে, দানবদের নামের মতো শব্দগুলি যা দেখতে দেখতে একটি শব্দ@
(বৃহত্তম গ্রুপ) সমস্ত অস্পষ্ট হিসাবে শ্রেণিবদ্ধ করা হয়। কোনও সূচকের সামনে উপস্থিত হতে পারে; উদাহরণস্বরূপ, বর্ণের নামগুলি (যেমন 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 টি পূর্ণসংখ্যার মধ্যে ডিকোড করি এবং তারপরে একটি লুকিং টেবিল ব্যবহার করে আবার ডিকোড করি যা ব্যবহার করা হচ্ছে প্রকৃত অক্ষরগুলির মধ্যে এটি ম্যাপ করে। (এগুলির বেশিরভাগটি হ'ল অক্ষর, সুতরাং আমরা নন-লেটার এন্ট্রি দিয়ে এই দ্বিতীয় সন্ধানের টেবিলটি শুরু করি &;:'
এবং তারপরে কেবল জেলি ধ্রুবকটি সংযোজন করি যা বড় হাতের এবং ছোট হাতের বর্ণমালা দিয়ে শুরু হয়; এটিতে অন্য কিছু আবর্জনা রয়েছে তবে আমাদের যত্ন নেই don't যে সম্পর্কে।)
জেলির "সূচকটি পাওয়া যায় নি" সেন্ডিনেল মানটি, আপনি যদি এটি তালিকায় সূচক হিসাবে ব্যবহার করেন তবে তালিকার শেষ উপাদানটি প্রদান করে; এইভাবে, আমি একটি শূন্য (একটি পূর্ণসংখ্যার শূন্য, যদিও টেবিলটি বেশিরভাগ অক্ষর দ্বারা তৈরি) ততক্ষণে অনুসন্ধানের টেবিলটিতে একটি অনুপস্থিত এন্ট্রি সূচিত করার জন্য আরও উপযুক্ত প্রেরণেলকে দেওয়ার জন্য যুক্ত করেছিলাম।
হ্যাশ ফাংশন
প্রোগ্রামটির বাকি অংশ হ্যাশ ফাংশন। এটি সহজভাবে শুরু হয়, দিয়েOḌ
; এটি ইনপুট স্ট্রিংটিকে তার এএসসিআইআই কোডগুলিতে রূপান্তর করে এবং তারপরে শেষ কোডটি গণনা করে 10 বার পেনালিটমেট কোড, আরও 100 বার আগে কোড এবং আরও কিছু (এটি জেলিতে খুব সংক্ষিপ্ত প্রতিনিধিত্ব করে কারণ এটি সাধারণত হিসাবে ব্যবহৃত হয় স্ট্রিং → পূর্ণসংখ্যার রূপান্তর ফাংশন)। তবে, আমরা যদি কেবল একটি মডুলাস অপারেশনের মাধ্যমে এই হ্যাশটিকে সরাসরি হ্রাস করে থাকি তবে আমরা বরং একটি বড় টেবিলের প্রয়োজন শেষ করব। সুতরাং পরিবর্তে, আমি টেবিল হ্রাস করতে অপারেশন একটি শৃঙ্খলা দিয়ে শুরু। তারা প্রত্যেকে এটির মতো কাজ করে: আমরা বর্তমান হ্যাশ মানের পঞ্চম শক্তি গ্রহণ করি; তারপরে আমরা একটি ধ্রুবককে মডুলো হ্রাস করি (আমরা কোন অপারেশনটি ব্যবহার করছি তার উপর নির্ভর করে) এই চেইনটি ব্যয়ের চেয়ে বেশি পরিমাণে (ফলাফলের টেবিলের আকার হ্রাস করার ক্ষেত্রে) দেয় (অপারেশনের চেইনটি নিজেই এনকোড করার প্রয়োজনের শর্তে), দুটি উপায়ে: এটি টেবিলটি তৈরি করতে পারেঅনেক ছোট (3566 টির পরিবর্তে 966), এবং একাধিক পর্যায়ের ব্যবহার উপকারী সংঘর্ষগুলি প্রবর্তনের আরও সুযোগ দেয় (এটি খুব বেশি ঘটেনি, তবে এর মধ্যে একটির সংঘর্ষ রয়েছে: উভয় Death
এবং Yeenoghu
হ্যাশ 806, সুতরাং আমাদের একটি অপসারণের অনুমতি দেয় টেবিল থেকে প্রবেশ যেমন তারা উভয় যেতে&
)। এখানে যে মডুলি ব্যবহৃত হয় তা হ'ল [3529, 2163, 1999, 1739, 1523, 1378, 1246, 1223, 1145, 966]। ঘটনাক্রমে, পঞ্চম শক্তিতে উত্থাপিত হওয়ার কারণ হ'ল আপনি যদি সরাসরি মূল্যটি গ্রহণ করেন তবে ফাঁকগুলি একই আকারের দিকে ঝোঁক দেয়, তবে ক্ষয়ক্ষতি ফাঁকগুলি চারপাশে সরিয়ে দেয় এবং টেবিলটির পক্ষে আরও সমানভাবে বিতরণ করা সম্ভব করে দেয় স্থানীয় সর্বনিম্নে আটকে যাওয়ার পরিবর্তে শৃঙ্খলা (আরও সমানভাবে বিতরিত ফাঁক ফাঁক মাপগুলির একটি টার্সার এনকোডিংয়ের অনুমতি দেয়)। X ² = (- x ) coll সংঘর্ষের সূচনা করে এবং 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
> _ <