আমাকে আমার দানবকে চিনতে সহায়তা করুন


35

পটভূমি

কম্পিউটার গেমগুলিতে গ্রাফিক্সের ব্যবহার ব্যাপকভাবে প্রতিষ্ঠিত হওয়ার আগে, কম্পিউটার গেম নেট হ্যাকের সূচনা 1987 সাল থেকে। গেমটিতে প্রচুর দানব রয়েছে, এবং সম্ভাব্যত একবারে স্ক্রিনে অনেকগুলি ফিট হওয়ার সম্ভাবনা রয়েছে, তাই দানবগুলি খুব ন্যূনতম উপায়ে আঁকানো হয়: একটি দানব কেবল পর্দায় একটি ASCII চরিত্র হিসাবে টানা হয়।

সেখানে হচ্ছে দানব প্রচুর ছাড়াও, সেখানে প্রচুর আছে ধরনের দানব। কোনটি কোনটি তা জানা গুরুত্বপূর্ণ; একটি বিড়ালছানা দেখে এবং একটি ড্রাগন দেখে আপনাকে আলাদাভাবে প্রতিক্রিয়া জানাতে হবে। যেমন, বেশিরভাগ এএসসিআইআই দানবগুলির প্রতিনিধিত্ব করতে ব্যবহৃত হয়; উদাহরণস্বরূপ, একটি বিড়ালছানা হয় f, এবং একটি লাল ড্রাগন হয় D। এর অর্থ হ'ল প্রদত্ত দানবটি কেমন দেখবে তা জানার জন্য এটি খুব সহায়ক হতে পারে, কারণ পরে যদি আপনি খেলায় এটির মুখোমুখি হন তবে এটি আপনাকে সনাক্ত করতে সহায়তা করবে। (দ্রষ্টব্য যে ASCII অক্ষরগুলির চেয়ে আরও বেশি ধরণের দানব রয়েছে, তাই তাদের মধ্যে কিছু ভাগ করে দেয়; একটি লাল ড্রাগন এবং একটি নীল ড্রাগন উভয়ই D)

কার্য

আপনার প্রোগ্রামটি অবশ্যই নেটহ্যাক দৈত্যের নাম ইনপুট হিসাবে নিতে হবে এবং ASCII অক্ষর তৈরি করবে যা গেমের মধ্যে আউটপুট হিসাবে এটি উপস্থাপন করে। প্রোগ্রামটিকে ধরে নেওয়া যায় যে ইনপুটটি আসলে একটি নেটহ্যাক দানবীর নাম; এটি যদি ক্র্যাশ করতে চায়, অর্থহীন ফলাফল আনতে পারে তবে ইনপুটটি অবৈধ থাকলে may

নিম্নলিখিত স্ট্যাক স্নিপেট একটি JSON অবজেক্ট যা তাদের সম্পর্কিত আউটপুটগুলিতে সম্ভাব্য ইনপুটগুলির সম্পূর্ণ ম্যাপিং দেয়:

সুতরাং মূলত, এখানে টাস্কটি "উপরের JSON অবজেক্ট দ্বারা প্রতিনিধিত্ব করা অভিধানে একটি কী দেওয়া হয়েছে, সংশ্লিষ্ট মানটি ফিরিয়ে দিন"।

নোট করুন যে এই চ্যালেঞ্জটি , একটি বিপরীত ; একটি ছোট / খালি ইনপুট থেকে বড় আউটপুটে যাওয়ার পরিবর্তে, আপনি একটি বড় ইনপুট থেকে একটি ছোট আউটপুটে যাচ্ছেন। (ইনপুটটিতে প্রচুর অপ্রয়োজনীয় তথ্য রয়েছে, যা আপনি উপেক্ষা করতে বা আপনার ইচ্ছামত ব্যবহার করতে পারেন)। এটি রেগেক্স গল্ফের সাথেও মোটামুটি সমান, এগুলি ব্যতীত) যে কোনও ভাষা অনুমোদিত (কেবলমাত্র রেইজেক্স নয়) এবং খ) দুটি সম্ভাব্য আউটপুট রয়েছে। (আমরা এই মত একটি কয়েক কর্ম আগে, যেমন ছিল এই দুই , কিন্তু নিদিষ্ট ইনপুট / আউটপুট আচরণ শক্তিশালী নিদর্শন রয়েছে এই কাজের কিছুটা ভিন্ন)।

ব্যাখ্যা

আপনি যেকোন যুক্তিসঙ্গত ইনপুট এবং আউটপুট ফর্ম্যাট ব্যবহার করতে পারেন (যেমন আপনি একটি অক্ষর হিসাবে আউটপুট উত্পাদন করতে পারেন, বা এর ASCII কোড হিসাবে, বা একটি অক্ষর দীর্ঘ যে স্ট্রিং হিসাবে)। আপনি যদি পছন্দ করেন তবে পুরো প্রোগ্রামের পরিবর্তে একটি ফাংশন জমা দিতে পারেন।

এটি ইতিমধ্যে স্ট্যান্ডার্ড লুফোলগুলিতে উল্লেখ করা হয়েছে, তবে কেবল পুনরাবৃত্তি করার জন্য: আপনি আপনার প্রোগ্রামের উত্স কোড ব্যতীত অন্য কোথাও ইনপুট এবং আউটপুটের মধ্যে চিঠিপত্র সংরক্ষণ করতে পারবেন না । এই চ্যালেঞ্জটি মূলত সম্ভব ক্ষুদ্রতম জায়গায় ইনপুট / আউটপুট আচরণের প্রতিনিধিত্ব করার বিষয়ে, সুতরাং আপনার অবশ্যই ইন্টারনেট থেকে একটি তালিকা ডাউনলোড করা, কোনও বাহ্যিক ফাইলে চিঠিপত্র সংরক্ষণ করা, ডিবাগ মোডে নেট হ্যাক শুরু করা এবং দানবকে প্রশ্নবিদ্ধ করা উচিত নয় things দেখতে কেমন তা দেখতে ইত্যাদি ইত্যাদি ((তদ্ব্যতীত, আমি তোমার জমাগুলি পরীক্ষা করার জন্য দানবদের সাথে লড়াই করতে চাই না))

বিজয় শর্ত

এটি , সুতরাং বিজয়ী এন্ট্রিটি স্বল্পতম, বাইটে গণনা করা এন্ট্রি হবে। শুভকামনা!



1
পরামর্শ: সম্ভবত আপনি দানবগুলির তালিকাটি তাদের দ্বারা উপস্থাপিত ASCII প্রতীক অনুসারেও ব্যবস্থা করতে পারেন
ক্রিটিক্সী লিথোস

2
দীর্ঘশ্বাস - এটি খুব ভাল খেলা ছিল,
সেদিনগুলি

2
@ গ্রীনআসজেড এখনও খুব ভাল খেলা! আসলে কয়েক বছর নিষ্ক্রিয়তার কয়েক মাস আগে একটি নতুন সংস্করণ প্রকাশিত হয়েছিল
nmjcman101

1
একটি বন্য ব্রাউন পুডিং হাজির হয়েছে !!
ম্যাজিক অক্টোপাস উরান

উত্তর:


11

জেলি , জেলি এর এনকোডিংয়ে 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";
}

10

জাভাস্ক্রিপ্ট (ES6), 915 ... 902 890 বাইট

w=>[..."aZM?o@;LWu&P?D@zF@W: @aT&@nCEfvQ&R&Tb'b@&p@:Srn @ahlrdpdT'TRv:HUYG@&fSfYdG&SGHL@Mh@G@gs';@CS@km@OsirA@q@njOZS@O@';HYqHE&DJavq&&aYaBmZMf;bv@EqHg@Z@;dm@M@?@rs@d@@oDAosDT@d@ZeBVrq@jFooD@VV&&BvMEDKiuiPC@&@DYrD&eD@D@@:AwccKZiF:DKLXAwdL@w&@@u'Hc@@q&;D:::WjdN@N@xD&eFh@gh@&Md?&Ye@@&h@hNN'Z&qtKEd@@HtH&@'@&@xd&dZsv@oo@FDyd@@&&@&@HS'Hw?DF@@@MPfDfi'AH&@@pkZkuMyZhFNN'P?d@u@NN&B@uo'fdi@?ke&"].find((_,i)=>!(s-=`GD4~#_@'R<1*~7C7RbZ6F'"Sa&!*1),#''3'.+B6(K$.l%9&!#0@51""~/+!gaW!/.(5'-@0'';!%C.&""!-.$16.2>(#&g!!O,#8A50O!)*(9b|Z4@7V).;*A*HWO(g1$/*-4&SL1I#K$#"3"#=e/'V~4'B(*,.3),$@D3)*76-"\\&kL7(-4#=7!!#+(B/B!-%!"_+!")+)0$1:E84!L191&)(255)!3O<,90NN6&;Q2'"bO=*h7.%1![<o!%M'G5/R.0$-J*%\\~6T?>)16""L&!X94T4"3$!2'^070Y2a"##)#"&n&(+1*&!-M""73R5%'y0~$-6<".MV?+1*ED>!B6b!)%&)8.+$&X0~Q'E%8&#%S/H.1<#>~!sU`.charCodeAt(i)-32),w=w.replace(/\W/g,1),s=parseInt((w+=w+w)[0]+w[2]+w[3]+w[6]+[...w].pop(),36)%8713)

বিন্যাসকৃত

নীচে কাটা পেডলোড ডেটা সহ কোডটির একটি ফর্ম্যাট সংস্করণ রয়েছে।

w => [..."aZM(…)"].find(
  (_, i) =>
    !(s -= `GD4(…)`.charCodeAt(i) - 32),
    w = w.replace(/\W/g, 1),
    s = parseInt((w += w + w)[0] + w[2] + w[3] + w[6] + [...w].pop(), 36) % 8713
)

কিভাবে এটা কাজ করে

ধাপ 1

আমরা প্রথমে দানবটির নামটি হ্রাস করি:

  1. অ-অক্ষরীয় অক্ষর (স্পেস এবং ড্যাশগুলি) এর সাথে প্রতিস্থাপন করা হচ্ছে 1
  2. পরবর্তী ধাপে কাজ করার মতো পর্যাপ্ত অক্ষর রয়েছে তা নিশ্চিত করার জন্য এই স্ট্রিংটি 3 বার পুনরাবৃত্তি করা।
  3. শুধুমাত্র 1 ম, তৃতীয়, চতুর্থ, 7 ম এবং শেষ অক্ষর রাখা।

উদাহরণ:

1.34..7..L
Demogorgon -> Dmorn
^ ^^  ^  ^

             1.34..7.L
orc mummy -> orc1mummy -> oc1my
             ^ ^^  ^ ^

        1.34..7....L
xorn -> xornxornxorn -> xrnrn
        ^ ^^  ^    ^

এটি কয়েকটি সংঘর্ষে বাড়ে। উদাহরণস্বরূপ, "Master Assassin"এবং "Master Kaen"উভয় হ্রাস করা হয় "Mst1n"। ভাগ্যক্রমে, সমস্ত সংঘর্ষকারী দৈত্যের নাম একই প্রতীকটি ভাগ করে ( @এই ক্ষেত্রে)।

ধাপ ২

এর পরে, আমরা একটি বেস 36 এটা দশমিক রূপান্তর পরিমাণ (এই অপারেশন ক্ষেত্রে অসংবেদী) নামে এই 5-অক্ষর স্ট্রিং ব্যাখ্যা এবং আমরা একে মডিউল প্রয়োগ 8713, যা প্রায়োগিক কি একটি সংঘর্ষের মুক্ত তালিকা উত্পাদন করতে মনোনীত হন।

উদাহরণ:

Dmorn --[from base 36]--> 22893539 --[MOD 8713]--> 4488
oc1my --[from base 36]--> 40872778 --[MOD 8713]--> 95
xrnrn --[from base 36]--> 56717843 --[MOD 8713]--> 4926

ধাপ 3

সমস্ত কী আরোহী ক্রম অনুসারে বাছাই করা হয়েছে:

[ 39, 75, 95, 192, 255, 287, 294, 344, 372, 389, 399, 516, 551, 574, 624, ..., 8635, 8688 ]

ডেল্টা মানগুলিতে রূপান্তরিত:

[ 39, 36, 20, 97, 63, 32, 7, 50, 28, 17, 10, 117, 35, 23, 50, ..., 83, 53 ]

এবং পরিসীমাটিতে ASCII অক্ষর হিসাবে এনকোড হয়েছে [ 32, 126 ]। দুটি পরপর কীগুলির মধ্যে পার্থক্য সর্বোচ্চ এনকোডেবল পরিমাণের চেয়ে বেশি হলে কিছু মধ্যবর্তী ডামি মান সন্নিবেশ করা হয়।

পরিশেষে, কীগুলির তালিকাকে একই ক্রমে সাজানো চিহ্নগুলির তালিকায় ম্যাপ করা হয়।

পরীক্ষা


আপনার নিজস্ব টেস্টুয়েট অনুসারে, এটি 5 টি এন্ট্রিকে ভুল সংকলন করে। এগুলি কী কারণে ঘটছে তা দেখার জন্য আমি তদন্ত করে দেখিনি, তবে সম্ভবত এটির সমাধানের দরকার রয়েছে।

@ ais523 এটি কেবলমাত্র ফায়ারফক্সে পরীক্ষা করার জন্য পাচ্ছি। আমি Chrome এর (কমপক্ষে) জন্য এটি ঠিক করার চেষ্টা করব।
আর্নল্ড

2
@ ais523 এফএফ, ক্রোম এবং এজ এ এখন ঠিকঠাক কাজ করা উচিত। এর জন্যে দুঃখিত.
আর্নল্ড

নামগুলিতে রূপান্তরিত নামগুলি থেকে বিট উত্তোলনের ধারণাটি আমি পেয়েছিলাম, তবে আমি স্পষ্টতই খুব ছোট ভাবছিলাম। অভিনন্দন!
জোনাস শোফার

8

জাভা, 1130 বাইট

import java.util.*;class G{public static void main(String[]u){BitSet s=BitSet.valueOf(Base64.getDecoder().decode("D94FuoCWYEIhCTEgLWwRNU/CMB1cE7XBhxBsBCusihaASRg14IJpQMOIDJdFx3BOdDcmThdhILVkCgGsEmhII8UE+SB4kDYEEJzw7Tw54oUEQZe0AUHCACH6nAdqgiZgJhASCIPAEAzJBmuMIrBCHE8IiFjgKQwrN4/90B4QFaLBQBEwTArRBMLCLHQOUQs7ZXZ8B8uGC1EbeAMJBdihUDgCIwGUEKgEAu4W2SJkIAhzB1IQSHgNiEAwABQECV5BvAB7eizABXxFLEg5iMA3whhAFXOKHXEURB7UA7PQjgUK7sji8CmIC0FJsTB4tAMFgiARB3hOJATDsBkgGKnGmWIiIWBRwkMgToQJ49G8gTR4IqcB4vJwDBHSVBLQhpwHsUFipqBcWWaEsCBoGBF0AlNAE305HAfdU1AEbELBO0EERAfkmMkgZcEXDIa4MAp4HcENmYAMBB7UBbTwBqQPSMS9kVkEBMhCudAqBAKaR1CzZggDRw8WMAh0FQPEyKAsRAxzBwn0grwDMQMyQMdADRtFUBAsBQetRRBwcUgrlsQ1IkosBc9B6iBcjAkSDDKgEAQ1wgLIMEEwMkYB42ERBCdiEJMAt1wYSIAQkdIEI0UPNhALsDnRQ1AT/HQi1AyCEwiICOICpiAPlB8MwxnBPIk6JYaIgDy8NJHDsiAqzK0JAXpQPXgPLwJuEEbMTAGBYlQbDESvAXJAAQ=="));int i,j,k,c,d,h=u[0].hashCode(),a=(h&4092)>>2|(h>>5)&1024|(h>>7)&2048|(h>>9)&4096;char r='@';for(i=k=0;i<4297;i+=14){for(c=0,j=7;j>=0;j--)c+=c+(s.get(i+j)?1:0);if((k+=c)==a){for(d=0,j=13;j>=8;j--)d+=d+(s.get(i+j)?1:0);r=d<5?" &':;".charAt(d):(char)((d<31?60:66)+d);}}System.out.println(r);}}

Ungolfed:

import java.util.*;

class G {
    public static void main(String[] u) {
        BitSet s = BitSet.valueOf(Base64.getDecoder().decode(
                "D94FuoCWYEIhCTEgLWwRNU/CMB1cE7XBhxBsBCusihaASRg14IJpQMOIDJdFx3BOdDcmThdhILVkCgGsEmhII8UE+SB4kDYEEJzw7Tw54oUEQZe0AUHCACH6nAdqgiZgJhASCIPAEAzJBmuMIrBCHE8IiFjgKQwrN4/90B4QFaLBQBEwTArRBMLCLHQOUQs7ZXZ8B8uGC1EbeAMJBdihUDgCIwGUEKgEAu4W2SJkIAhzB1IQSHgNiEAwABQECV5BvAB7eizABXxFLEg5iMA3whhAFXOKHXEURB7UA7PQjgUK7sji8CmIC0FJsTB4tAMFgiARB3hOJATDsBkgGKnGmWIiIWBRwkMgToQJ49G8gTR4IqcB4vJwDBHSVBLQhpwHsUFipqBcWWaEsCBoGBF0AlNAE305HAfdU1AEbELBO0EERAfkmMkgZcEXDIa4MAp4HcENmYAMBB7UBbTwBqQPSMS9kVkEBMhCudAqBAKaR1CzZggDRw8WMAh0FQPEyKAsRAxzBwn0grwDMQMyQMdADRtFUBAsBQetRRBwcUgrlsQ1IkosBc9B6iBcjAkSDDKgEAQ1wgLIMEEwMkYB42ERBCdiEJMAt1wYSIAQkdIEI0UPNhALsDnRQ1AT/HQi1AyCEwiICOICpiAPlB8MwxnBPIk6JYaIgDy8NJHDsiAqzK0JAXpQPXgPLwJuEEbMTAGBYlQbDESvAXJAAQ=="));

        int i, j, k, c, d, h = u[0].hashCode(), 
            a = (h & 4092) >> 2 | (h >> 5) & 1024 | (h >> 7) & 2048 | (h >> 9) & 4096;
        char r = '@';
        for (i = 0, k = 0; i < 4297; i += 14) {
            for (c = 0, j = 7; j >= 0; j--)
                c += c + (s.get(i + j) ? 1 : 0);
            if ((k += c) == a) {
                for (d = 0, j = 13; j >= 8; j--)
                    d += d + (s.get(i + j) ? 1 : 0);
                r = d < 5 ? " &':;".charAt(d) : (char) ((d < 31 ? 60 : 66) + d);
            }
        }
        System.out.println(r);
    }
}

মনস্টার নামগুলি হল:

  • জাভা hashcodeপদ্ধতি => 32 বিট ব্যবহার করে হ্যাশ করেছে
  • মাস্ক 100100100011111111110000 => 13 বিট সহ অ্যান্ডড
  • ছোট থেকে বড় পর্যন্ত বাছাই করা
  • তারপরে আমরা সাজানো তালিকার ডেল্টা মানগুলি => 8 বিট ব্যবহার করি

প্রদর্শন অক্ষরটি 6 টি বিটকে এনকোড করা হয়েছে।

সুতরাং প্রতিটি টিপল (দৈত্য নাম, চরিত্র) 14 বিট ব্যবহার করে। সমস্ত টিপলস একটি বিটসেট এবং বেস 64 এনকোডে সংরক্ষিত হয়েছে।

আমি বেস 64 এনকোডিং এবং বিটসেট অপারেশন সহ প্রচুর বাইট হারিয়েছি :-)


আপনি এটা ল্যামডা অভিব্যক্তি করে আকার হ্রাস করুন: ()->{...}। প্রশ্নটি এর "স্পষ্টতা" বিভাগে তাই বলে।
অলিভিয়ার গ্রাগোয়ার 21

5

গণিত, 1067 বাইট (ম্যাক ওএস রোমান চরিত্রের এনকোডিং)

FromCharacterCode[Mod[Tr/@{c=ToCharacterCode@#,c^2},216,32],"MacintoshRoman"]/.Inner[Rule,";¤7«´3πœ(ú-UU=6z±'¥ÿ†tƒ|\¢KÛd§≤jSóKWÊ8‰Ñwiøì¡ÛhÓ\‡¨:–*~‚¬æº¢»‘¤Á^∫„·nLÒ¤b|$|ÇòCóÌÈS_Ñä.Ëí 5y«KΔË\Ãò™_E`J’ëΔñTV–N„'„Ÿà¥xpîH#-PP)ÈÊVQ©LrBt}∑WÉ∏dÿå„•Tz∑Âao¿rÃ^bbP¨}ëÖ◇1èÇ&d¢¤ái√,B}±BˆÍdA´íBtæÅ/m√yQ6,uãÊ≤/Î!ïøuΩÒÉ)ë“∕C$RY•ÍÍu£oÉÓå‚Ïl.·1‚40ÃÚ¨ÇÆÅccflÓ8Ï Gáç3EÑ¥fXñ¨Àìz~j÷–ñÓz0~ôWtñ}μÎ◇f||Dd\ ÙH﷿É∑Ì´|¿Ö_»RT8Ûª|Äqü‘&6Ãác›Yˆ¿ô5≈ënÚqΩåVä>∫æ∂p ¨jtöåoÌfløÏÏò§¤flÈ;À∑Ѥ·›9né∕<·ì∕ÿmŸ«Ì»j√üà‰÷“5ïä^Ûe◇kd‡“(Ïö71›iΟÁm„ÈïÒß„kÕπ°ÊÓÒçÓfˆ¨flÁ9k|¶ä∕l~Òød‹jZÏ2[kÎ√3ÛâìÓΔE]ıIÚ>{#ÁÖ‚Üâ;·?l^vàß‹‘jîÙÇÅÉú¥äärÆæ™∏Üi≈mØÂ’-%USÌâ’ı Ê›·Ëÿb‡ıÖ31nh™Δ$~%À0n-À´sflk∑p.o5vz}mè]ÎÅç©lt;Îu„ŸW„›ˆˆÍ﷿Ä*7m8‰πór,„Õш/”Ë∕ªß9±‡¶çÁ•âg˜fló)ÖÔ¡'wúæ0ñ„Kûr"~(a=StringPartition)~2,"AAA&&DH&&&&&D&KKKKH&o&WT&&soV&bEYLDD:DDwDwDDDD&q&WBDyNNPuDj&FPhYss:c'ScAd:LdR&dvhhMZhE;MZv&MZHaEHve'evCdeHgSe:b ZaBa;mMrsZH'pGGMZGGo'NNDPuDFPgxNNdd&Hohoi&ufMZ&Tv:i&'pJdf;AafkMkZk;fdkm'iqlLFd:wtf&i&LhqhHYCnq&:jOODMoZooYf';&SCuwcSQiabrBDFNNrpT'qR:&Ysr eFDZmSajEvH'H'&ifHqtTUBVVF&du&ESnTdrdDugddd'nrWqXDyFYz"~a~1,List]/.x_/;StringLength@x>1->"@"&

নামহীন ফাংশন ইনপুট হিসাবে একটি স্ট্রিং গ্রহণ এবং একটি অক্ষর ফিরে। ফাংশনটির নিম্নলিখিত রূপ রয়েছে:

1  FromCharacterCode[
2    Mod[Tr/@{c=ToCharacterCode@#,c^2},216,32]
3    ,"MacintoshRoman"] /.
4  Inner[Rule,
5    GIANT_STRING_1 ~(a=StringPartition)~2,
6    GIANT_STRING_2 ~a~1,
7    List]
8  /. x_/;StringLength@x>1 -> "@" &

এখানে GIANT_STRING_1 হ'ল একটি স্ট্রিং যা ম্যাক ওএস রোমান চরিত্রের এনকোডিংয়ে 608 ওয়ান-বাইট অক্ষর (যার মধ্যে কোনওটি 00-1F সীমার মধ্যে নেই) রয়েছে, যখন GIANT_STRING_2 একটি স্ট্রিং যেখানে 304 ASCII অক্ষর রয়েছে।

লাইন 2 হ্যাশ ফাংশনটি শুরু করে: এটি ইনপুট স্ট্রিংকে অক্ষর কোডের তালিকায় রূপান্তর করে (এনকোডিং অপ্রাসঙ্গিক যেহেতু তারা সমস্ত মুদ্রণযোগ্য ASCII), তারপরে সেই অক্ষর কোডগুলির যোগফল এবং তাদের স্কোয়ারের যোগফলগুলি উভয়ই মডিউল 216 এবং জোর করে গণনা করে উত্তরটি 32 এবং 255 এর মধ্যে থাকা।

লাইন 5 GIANT_STRING_1 কে 304 দ্বি-চরিত্রের স্ট্রিংয়ের তালিকায় পরিণত করে; 6 লাইনটি GIANT_STRING_2 কে 304 এক-বর্ণের স্ট্রিংয়ের তালিকায় পরিণত করে। তারপরে 4 এবং 5 লাইনগুলি এই দুটি তালিকাকে 304 প্রতিস্থাপনের নিয়মে একটি সংকেতে রূপান্তরিত করে: আপনি যদি এইরকম এবং এই জাতীয় দ্বি-চরিত্রের স্ট্রিংটি দেখতে পান তবে এটিকে এ জাতীয় এবং এই জাতীয় এক-চরিত্রের স্ট্রিংয়ে পরিণত করুন। অবশেষে, লাইন 8 অন্য যে কোনও দুটি অক্ষরের স্ট্রিংকে রূপান্তরিত করে "@"

তালিকায় 71 টি দানব রয়েছে যার প্রতীক "@", এবং সেগুলি হ্যাশ না করে পরিচালিত করা হয়েছে (আমি এই উত্তরটি আইস 523 এর অন্য একটি উত্তরের মন্তব্য থেকে চুরি করেছি)। এটি ঠিক তাই ঘটে যে অন্যান্য 304 হ্যাশ মানগুলি সমস্ত অনন্য! এবং তাই অ্যালগরিদমে অন্য কোনও পরিবর্তন প্রয়োজন হয় না। (এটি একটি ভাগ্যবান বিরতি যা "human"ম্যাপ করা দরকার "@", যেহেতু অক্ষরগুলির অক্ষর কোডগুলির "human"পরিমান এবং "shark"এর মধ্যে থাকা অক্ষরগুলি অভিন্ন, যেমন codes কোডগুলির স্কোয়ারের যোগফল inte পূর্ণসংখ্যার হিসাবে, এমনকি মডিউলও 216 নয়!)


3

পাইথন, 2055 বাইট

def f(s):import re;m=re.search(s[-3:-1]+s[:2]+str(len(s))+"(.)","omgn5Gteen13vligr7glero10'akga12Sanso11aragi9rgoDe10&tiet5HleVl16Vanst11Hmpmo14nubge15brsho5uingo21Nbuin7&gobl11Dgobl12Duaja6faule10lkest7Eolic9Ttawa15EanKo14KanKo12Kviba12&gore10Dimim3iutzr5zingn10Ganhi10Herfr15emmel9Mlele13'guNa6Wkaja6dotco6docvr5&petr7tmaor10oarli6:nhpi7;moma11&icli4Linbl20Nolwa11Titwr6Wtlgi12ateru12Rbign12Zozgr9Plepa11'oufo9vingu23Norhi8onena10&tati5Hiosc8sinre18Nligo6obeki10aeaow7Yeyfl12elewo10'adsh5 anfr11Hapap3Ygrog4Obequ9ahopy6Steki6fgogr11Dgogr12Dpepi9Sngdi5dindw10hlegl11'imgr11Pbava11Bcero12phaOl8Tdoli10dcuwi15dargn14GotIx5Dinbl13Parwa4dpuhe14dtisa9&ilba14:liho9onyer6&euAs8&aupl14Cttle9qmmdw11Molbr10Fmism11mncPe10&mpwa11noror3oispy8caumo16Clest11'haUr8okekr6;bigi12ZbuBa9&gowh12Dbiko13Zbiet12Zmmgn11Molwe8dmowa11&icde8Lbiho6hdola9dleJu7&otMi18&ulum10Uenpi9&luho10ighye12ymamu5qorwh13ughbl11yylga8gKoKe12Knndj6&mmet11Magbl10Narsh5;osgh5 orxo4Xoltr5Tdoma8qopCy7Hceir12pgoba18Dorlo9wgoba16Dbidw12ZinFa6&goor13DeaAl5Aiuba14qloac9bkemo6Yniqu16QteDi8&aufo14Ckesh8Fetye4Yolro9ryema18hersh15eaggo11Nrase9ranig6:ghba12Winbr13Polwi11dgeti5fzoNa6&orga9emmko12Manfi8aorgn10Gatco6Alecl10'goye13Deabu7hinog9Oheli6Feoch9:ynly4fngte5ieeel12;rawe7ricch11caior11ocala9fguvi13Fangi9aangi5Hhepa7fdesa10:cuOr5&rswa8ubrco5Sorva12Vxaxa3xovlu12tbaba3Bilcr9:geAn5Aolwo4dviic9&tafi14Ecegl13pbugr8xorpu11wgoCh16Dicar9Laggu13Ndegi12shoAr6Aolla12kedce9sitma8&erti11qicma11Lbior10Zviho12&test12vbusu8&fofo3ddeca11srara9rolko6kmpwo10ntaea15Ellbl10jgosi13Daksn5Svibo10&tosk8Zicco10cvera5Bgoba15DatDe5&goba17Dpuwu6qkawe10dmmhu11Mdodo3dunhe10dtcsa9Yckge5:tefi11vsiqu6iloqu14bewne4:yoGe6&caho8fucwo9rorMo10oisje9;taai13Eardw5holye11Fordw10hlloc11jough5Zerfl14emila11mtedu11vthro5qteic10vtuLo11Hmmor9Mirva7Vbagi9Bolro10Tmako13kleir10'biel10Zmmgi11Mnema5ilego10'olre8Forbl13usiwa14Sroba6&agre8Nrohe6&orgr12ulefl11'ocja10JghYe8&aumi8HiuSc8sbihu12Zriki6Ayemi11horko11kolgr10Furle6ianfi10Hmigi11monpo4ullsp13jaiKo11Ktedi12Rapca15Yorog9Oylwi15geegi9;orba14worba16w");return m.group(1)if m else'@'

এটি আমার পরীক্ষার জোতা এখানে, যদি এটি অন্য কাউকে সহায়তা করে।

MAPPING = {
    # as given in the original question
}
def validate_solution(f):
    for k, v in MAPPING.iteritems():
        vv = f(k)
        if vv != v:
            print 'FAIL: f(%s) = %s instead of %s' % (k, vv, v)
    print 'SUCCESS!'

আমি 4 টি অক্ষর এবং স্ট্রিংয়ের দৈর্ঘ্য নিষ্কাশনের সমস্ত বিভিন্ন উপায় গণনার জন্য একটি ছোট প্রোগ্রাম লিখেছি। আমার আসল পরিকল্পনাটি তখন ord()এই চরিত্রগুলির ছিল, সেগুলি নিয়ে কিছু গণিত করুন এবং এটিকে একটি নিখুঁত হ্যাশ ফাংশনে সিদ্ধ করুন যা সূচকগুলি আউটপুটগুলির টেবিলের মধ্যে তৈরি করে। সুতরাং আমি এই 4 টি চরিত্রকে এক সাথে সংমিশ্রণ / গুণন / মডুলো'আং করার বিভিন্ন উপায়ের জন্য আরও একটি ছোট প্রোগ্রাম লিখেছি; কিন্তু এর ফলে হ্যাশ ফাংশন থাকার রাখা পথ অনেকগুলি দুর্ঘটনায়। সুতরাং অবশেষে আমি হাল ছেড়ে দিয়েছি এবং আপনি এখানে যা দেখেছেন ঠিক তা পেরেছি, যা প্রতিটি দানবীর নামের ছোট-স্ট্রিং প্রতিনিধিত্ব থেকে উপযুক্ত প্রতীক হিসাবে কেবল একটি মানচিত্র।

তা হ'ল: আমি যা পেতে চাইছিলাম তা ছিল

def f(monster_name):
    small_string = f1(monster_name)
    integer_index = f2(small_string)
    symbol = "relatively_short_table"[integer_index]
    return symbol

তবে আমি কেবল যতদূর যেতে পেরেছি

def f(monster_name):
    small_string = f1(monster_name)
    symbol = {relatively_large_dict}[small_string]
    return symbol

যেখানে আমার ডিক খোঁজাকে গল্ফতা {relatively_large_dict}[small_string]হিসাবে প্রকাশ করা হয় re.match(small_string+"(.)", "relatively_large_string")


2

জাভাস্ক্রিপ্ট (ES6), 1178

n=>'@0uy1c8@@@@@@2cb7sj0sb5rhcm626435y6js6u651b1nj5jg85g2xj02l4wh31u2py2xl96h5fz6ys46tc7821p2e9c1o1td1cy834@2sq2c055iabn91f82vahc6ytagh5d363i@@@@@@@@@@@@@@@@@@@7hh2wf2nd1bu2d93cm0gu862@144819a6v2h44o41d4@@@@@@0c404806f3fa0z8@04c82o1vfac3@c10a3g08g@82e0lr7bf26p2dibcb11t9y19q6bbh4db7tr3592u2bof4913edawy84p1cr@bap1qzb1o033bt6@8d93v230t4240w9ahh8cy@09u0a60sd1qd@1n23ak1bt614bax0ro7sd57xagg22s1gj@@be0@74l01c28qcdi@1so83t0c068s@2jh7as7ddalq0vxag68pn6b9@0gabu71zp54m6997imb2047h@10s0zo0mv@aww6ixbqgag7@944@bza76b@1a053c2yn6101eh8en@4je6fq97t1py9f0@6co@b3k5my44p@4edb737t9@0tl@00rau75y369z5hk0ot@23d2wicb90uwb54a9l3gw9lv3z51nv@@@@@@@amy81e3kh9yc90e59d@6528z42ic@7uv6bm58t@3av0w004t05aavs3oq3040irawj0ov1n90213h89yn0vs@0mcc284fv6uyaxp@3242ok39h0jd06905v1ia@7zc9659bk@ax30ua0um0652sa65daqd@00z03d2ra1f95751xu@9x10676yz@72w33r24b63d@2d7@ats6f678u@bcg9uf6h6@1b60us2d17ygbxn72106t02g@adublf05q@8xu5wobqb1tc1c73cs7pj@87k3cj2xq6258l379y@0q42qy3vs3y70r9@06v2a9@ast4su12w0ko4y77dn@7oubr07ju1ct5qe81v@0d52kb66t4zj@93508c@af30kj@299'.replace(/@\w*/g,v=>~-v.search((100+h.toString(36)).slice(-3))%3?++i:r=String.fromCharCode(i),i=32,r='@',n.replace(/\w/g,c=>h=parseInt(c,36)^(h*3)&16383,h=0))&&r

কম গল্ফড

n=>(
'@0uy1c8@@@@@@2cb7sj0sb5rhcm626435y6js6u651b1nj5jg85g2xj02l4wh31u2py2xl96h5fz6ys46tc7821p2e9c1o1td1cy834@2sq2c055iabn91f82vahc6ytagh5d363i@@@@@@@@@@@@@@@@@@@7hh2wf2nd1bu2d93cm0gu862@144819a6v2h44o41d4@@@@@@0c404806f3fa0z8@04c82o1vfac3@c10a3g08g@82e0lr7bf26p2dibcb11t9y19q6bbh4db7tr3592u2bof4913edawy84p1cr@bap1qzb1o033bt6@8d93v230t4240w9ahh8cy@09u0a60sd1qd@1n23ak1bt614bax0ro7sd57xagg22s1gj@@be0@74l01c28qcdi@1so83t0c068s@2jh7as7ddalq0vxag68pn6b9@0gabu71zp54m6997imb2047h@10s0zo0mv@aww6ixbqgag7@944@bza76b@1a053c2yn6101eh8en@4je6fq97t1py9f0@6co@b3k5my44p@4edb737t9@0tl@00rau75y369z5hk0ot@23d2wicb90uwb54a9l3gw9lv3z51nv@@@@@@@amy81e3kh9yc90e59d@6528z42ic@7uv6bm58t@3av0w004t05aavs3oq3040irawj0ov1n90213h89yn0vs@0mcc284fv6uyaxp@3242ok39h0jd06905v1ia@7zc9659bk@ax30ua0um0652sa65daqd@00z03d2ra1f95751xu@9x10676yz@72w33r24b63d@2d7@ats6f678u@bcg9uf6h6@1b60us2d17ygbxn72106t02g@adublf05q@8xu5wobqb1tc1c73cs7pj@87k3cj2xq6258l379y@0q42qy3vs3y70r9@06v2a9@ast4su12w0ko4y77dn@7oubr07ju1ct5qe81v@0d52kb66t4zj@93508c@af30kj@299'
.replace(/@\w*/g, v= > 
   (v.search((100 + h.toString(36)).slice(-3))-1) % 3  
     ? ++i : r = String.fromCharCode(i),
   i=32,
   r='@',
   n.replace(/\w/g,c => h=parseInt(c,36) ^ (h*3) & 16383,h=0)
)
&& r

পরীক্ষা

F=
n=>'@0uy1c8@@@@@@2cb7sj0sb5rhcm626435y6js6u651b1nj5jg85g2xj02l4wh31u2py2xl96h5fz6ys46tc7821p2e9c1o1td1cy834@2sq2c055iabn91f82vahc6ytagh5d363i@@@@@@@@@@@@@@@@@@@7hh2wf2nd1bu2d93cm0gu862@144819a6v2h44o41d4@@@@@@0c404806f3fa0z8@04c82o1vfac3@c10a3g08g@82e0lr7bf26p2dibcb11t9y19q6bbh4db7tr3592u2bof4913edawy84p1cr@bap1qzb1o033bt6@8d93v230t4240w9ahh8cy@09u0a60sd1qd@1n23ak1bt614bax0ro7sd57xagg22s1gj@@be0@74l01c28qcdi@1so83t0c068s@2jh7as7ddalq0vxag68pn6b9@0gabu71zp54m6997imb2047h@10s0zo0mv@aww6ixbqgag7@944@bza76b@1a053c2yn6101eh8en@4je6fq97t1py9f0@6co@b3k5my44p@4edb737t9@0tl@00rau75y369z5hk0ot@23d2wicb90uwb54a9l3gw9lv3z51nv@@@@@@@amy81e3kh9yc90e59d@6528z42ic@7uv6bm58t@3av0w004t05aavs3oq3040irawj0ov1n90213h89yn0vs@0mcc284fv6uyaxp@3242ok39h0jd06905v1ia@7zc9659bk@ax30ua0um0652sa65daqd@00z03d2ra1f95751xu@9x10676yz@72w33r24b63d@2d7@ats6f678u@bcg9uf6h6@1b60us2d17ygbxn72106t02g@adublf05q@8xu5wobqb1tc1c73cs7pj@87k3cj2xq6258l379y@0q42qy3vs3y70r9@06v2a9@ast4su12w0ko4y77dn@7oubr07ju1ct5qe81v@0d52kb66t4zj@93508c@af30kj@299'.replace(/@\w*/g,v=>~-v.search((100+h.toString(36)).slice(-3))%3?++i:r=String.fromCharCode(i),i=32,r='@',n.replace(/\w/g,c=>h=parseInt(c,36)^(h*3)&16383,h=0))&&r


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"
}
err = ok = 0

for(name in monsters) {
  code = monsters[name]
  result = F(name)
  if (result != code)
    console.log('ERROR',++err, name, result, code)
  else
    ++ok
}
console.log('Errors',err,'OK', ok)


2

জাভাস্ক্রিপ্ট, 1185 বাইট

s=>{h=0;for(i of s)h=(h<<5)-h+i.charCodeAt()|0;for(v of "Aqgh201etxitsxy0_&ctpzfekt09j36uafamqw46mz1qcxvnnoego4212nxfivutt09qyac4td1ayiotfh3dvub5fggzjqa58h37bnva3dzy_D9wlywkgkifldlp6t46v97basg905f8wadwt0w49q0gk9c8edz9e33uj6esjl_Hkkt54kr0qdlxs6hxdxxyegrdzcmz8ymvg_Ki0enu0ct1shv_o193ve2y3tpa71xu3pud405o7_We09jfsayx_Tw2gk0spoqab5c9k_s7timco3yh674rp1_Vppq2k9t1q_b3mo3tac13_E0r50a7vi5a0kgim_Y2omnjbkq59mw5njf5t_Lu9z2bj6w2128_:n0gngsocqeuh5czhyiedwd3a_w9lf1hv1rra7r_qmckg7rbhlldbvros4f44h_B32t12yzdci83_yjkb3va_Nt2cbaqd46toc29anic1qq3es_P3mkmtv2l4j8r_ukjb44lwm5vkaz5hwkh_j3oo7uj9ip_Fzuk8mh1rpfw7obl6s9fsq_hzmwz3f7kdhiaj4enlxha1_c0q0yu8tnf_'nf7c1sks8rzgxhw83vjq0s76xhrvppbgn_Slr90h5su3zokncwi2m_doi5t2p4vw6dryycyhtl6eujb1ta26752ta7hr19d9vceq_Rqk8tsy_vuxwglitt4u25zfhj5q_M4j7tjk9cryvqn8101u5h646p_Ztzwr09t8ckxx3hbsl6r7dqv7qxmnwt_;u7r3e9trqqkmdj5tlx_apoj0ngpcqy6r7t8gw9_e2wtyw9oyve8uxlf_C8tpo3hlb3_gxji2n2nl4_ kwft9p_maxcdzat5e_rcy28c360mmndp8ksxh_pegqkkuur3_Gh6f8pheo0nn2_xu6yjdx_iz538jwkbwuh4ge7ymj_f3eytt6khltgxj13itedbz_Jlgk_knskybpe8n69a_llnv_tuxgkxc_nod5ob3cft_Oij0a222q3_Q6af_Uc5x_Xzjn_z6iq".split`_`)if(~v.slice(1).match(/.../g).indexOf(h.toString(36).slice(-3)))return v[0];return"@"}

এখানে পাওয়া জাভাস্ক্রিপ্ট স্ট্রিং হ্যাশের একটি গল্ফযুক্ত সংস্করণ ব্যবহার করে সারণীতে সংরক্ষিত আসল হ্যাশ (সেই দীর্ঘ স্ট্রিং) সেই পদ্ধতি দ্বারা উত্পাদিত হ্যাশের পরম মান নেয়, এটিকে বেস -৩ 36 এ রূপান্তর করে এবং তিনটি উল্লেখযোগ্য সংখ্যা বাদে সমস্ত ড্রপ করে।


1
যতদূর আমি বলতে পারি, আপনি {প্রথম অক্ষর, শেষ অক্ষর, দৈর্ঘ্য by, তারপরে একটি বড় লক লক টেবিলটি ব্যবহার করছেন? এটি বোধগম্য হয়, তবে আমি মনে করি যে আপনি কিছু উন্নতি করতে পারেন: টেবিলের মধ্যে কিছু সদৃশ প্রবেশ রয়েছে, এবং আপনি @টেবিল থেকে প্রবেশকারীগুলি সরিয়ে এবং @ইনপুটটি ডিফল্ট করে ডিফল্ট করে যথেষ্ট পরিমাণ জায়গা সাশ্রয় করতে পারেন খুঁজে পাওয়া যায় নি।

2
cavewomanএবং chameleonএকই প্রথম চর, শেষ চর এবং দৈর্ঘ্য রয়েছে, এটি কোনও সমস্যা হতে পারে?
আর্নৌদ

1
split("_")split ব্যাকটিক _ ব্যাকটিক
user2428118

পছন্দ করুন
সুপারজেডি ২২৪

1
@ সুপারজেডি ২২৪ অন্যান্য রয়েছেন: Cyclopsএবং Croesus, baluchitheriumএবং baby long worm, crocodileএবং centipedeআরও 24 জন
আরনৌদ

1

পাইথন 3, 1915 1900 বাইট

পরিবর্তণের:

  • অক্ষর নিজেই পরিবর্তে ASCII কোড দিয়ে কাজ করুন এবং আউটপুট করুন (15 বাইট সংরক্ষিত)

প্রথম কমান্ড লাইন আর্গুমেন্ট হিসাবে দানবটির নামটি পাস করুন, স্ট্যাডআউটে চরিত্রটি গ্রহণ করুন।

import sys
D=b'`"\x08\x04\x02&@Yx\xf6\x90a\x00Z\x00\x00c\x00X\x00\x00f\x00z\x00\x00hS\x12\x06\t@PSTft?z\x0fnK\nH\x87\xa2ig\t\t\x12 &;@FZkoq\x05\xfc~?\x1b\x80\xc2,z\r\xf3Y\x141\x9cS\x10\x80jU\x06\x08\t&;@BKpqr\x9f\xbe\xbb\xf9O\xcde\x03!kK\x11\x07\x07&:@WYsu\x1boDv\xc9i\x90lS$\x06\r@Sdirw\x1f\x1d\x198\xb3\xb2\x91\x0fm\xa5\x03A@mB#\x07\x07@GPWdiv\x7f;n\xb3Bk\xa5ng\x07\x0c\x16&@EHSVcdfqru\x01\xfen\x83q\xd8\xf3\x1c.\xe5\xac^\x87\t\xaaT\xd4D\x9c\xe1*Io;\x03\x05\x06@desu\x01\xf7\x95R0\x88pc \x08\n:@KMNknq\xfd\xfe\ru\xb2z\xea\\\x9b\x05qC\x08\x07\x06&@AGOfhy\xe2\xbbA\xf2ArS\x1e\x08\x08&@JVYdfi_\x1c\xd8/k\x89\xa8\xe0sw\x08\x0b\x1c&;@Kdfhijou\t\xe0[# \\\x9a\xd3F(L\xfapM\tp\xa8t\xccp\x8d\x11e+\x05\x0c\x8a\x08t+)\x04\x02@PQT\xf2\x94uG\x1c\x06\t&@Uilq\x0f\ryl\xc4`\xa5\x10\x90v\x85\r\x0e$&:@FKLNORSWYry\x9f\x97\xf8\xae\xb8\xdf\xdd\xc1\xcdl\xb2\xc9L|\xbb;\x92\xb8j\xb0\xa99\xdd\x9c\xb8\xd0\x8bh\x95\x88T\xb3;1\xb6\x0bwb\x06\x0c\x11&:;@DGHOVhkm\x02\xfe\x8fO{\xd9u\xac&\xd7\x90\x9fe\xc0\xf44GxW\x07\x07\x0bADHScdv?>\xdd<:\xb7s.\x8cI\x07yR\x07\x07\t&:@bcht;Zx\x16sO\x8d\xab\xc3ze\x0b\x08\x14&@ABCaqs\x01}\xbe=\x15\xc6\xcdL\xa1\xc8\x9e.\xf7\x02\xc1Xq4\x99\t{G\x16\x06\t@Faefg\x1f\x9bU$2P`\xa8\x80|G\x15\x06\x07&\';@Go\x1c1\\\xa7*\x0bS}s\x06\n" &@AHLYZdh\xf6\x1e\t\xb93N2\xc27\xd6\xd8\xd8*\xe5L\xa3\xa4f\x860A\xfa:7.\xdd\x9b)\xb80\x85\xc4\xb4\x83~W\x0e\x07\r&:@ERbd>\x1b\xda\x15\xd4\x92\x0eM\xacJH\x04c\x7fG\x00\x06\x08:@dghx\x1f\xbc\xf4Z\xa1%\xd3C'
R=range
N=sys.argv[1].lower()
B=0
for c in N:B|=ord(c)&0x7f;B<<=7
B%=2**62-1
P=N.split()
F=ord(P[-1][0])^(ord(P[-1][1])>>2)
while D:
 f=D[0];ik,j,h,n=D[1:5];i=ik>>4;k=ik&15;D=D[5:];c=D[:h];m=D[h:h+n];m=int.from_bytes(m,"big");s=1;C=j;b=(h-1).bit_length()
 for x in R(i-1):s<<=k;s|=1
 s<<=j;z=(B&s)>>j;x=0;u=1
 for y in R(i):x<<=1;x|=bool(z&u);u<<=k
 if f!=F:D=D[h+n:];continue
 while m:
  if m&(2**i-1)==x:m>>=i;C=c[m&(2**b-1)];break
  m>>=b+i
 break
print(C)

আমি যখন প্রশ্নটি পড়ি তখন আমি ভেবেছিলাম "আমার এটি সংকোচিত করা দরকার"। প্রথম পদক্ষেপটি ছিল সমস্ত নাম ছোট করা।

তথ্যটি দেখে, আমি অনুভব করেছি যে কোনওভাবে শেষ শব্দের প্রথম অক্ষরটি ব্যবহার করে দানবটির কোন অক্ষর থাকতে পারে তার মোটামুটি প্রথম অনুমান হিসাবে কৌশলটি করা উচিত। দেখা যাচ্ছে, এটি ছিল শক্তিশালী প্রাথমিক অনুমান। নিম্নলিখিত টেবিলটি "শেষ শব্দের প্রথম চরিত্র", "হিটগুলির সংখ্যা", "দৈত্য অক্ষর":

 'd' (37) => & @ D L R d h
 'g' (31) =>   & ' : @ G H Z g o
 's' (30) =>   & : ; @ E F H K P S Y Z e k o s
 'm' (28) => & @ F H M Q R S Y i m q r
 'c' (24) => : @ A C H S b c d f s v
 'p' (20) => & ; @ P S c d f p u
 'w' (20) => @ G W d q r u w
 'a' (19) => & @ A L Y a t
 'h' (17) => & @ N U d f h i o u
 'l' (17) => : @ F G K L O V f h i k l q y
 'n' (15) => & : @ N W n
 't' (14) => @ H T f i q t
 'b' (14) => & @ B a b h q x
 'k' (13) => ; @ A G K O f h k
 'e' (12) => & ; @ E H e
 'o' (12) => & @ O P T Y o
 'z' ( 9) => Z z
 'v' ( 9) => & @ S V v
 'r' ( 8) => @ B q r
 'j' ( 8) => & ; J d f j
 'f' ( 6) => & F d h
 'i' ( 5) => & : D V i
 'u' ( 4) => o u
 'y' ( 3) => & @ Y
 'x' ( 2) => X x
 'q' ( 1) => i

স্প্রেডআউটটিকে আরও উন্নত করতে, আমি শেষ শব্দের দ্বিতীয় অক্ষর XOR-ing দ্বারা কীটি কিছুটা সংশোধন করে ডানদিকে বিটকে প্রথম অক্ষরে স্থানান্তরিত করে আসুন (আসুন আমরা এই নির্মাণকে ডাকি first_key):

 '}' (29) =>   & @ A H L Y Z d h
 'v' (25) => & : @ F K L N O R S W Y r y
 'x' (25) => A D H S c d v
 's' (21) => & ; @ K d f h i j o u
 'p' (21) => : @ K M N k n q
 'z' (19) => & @ A B C a q s
 'n' (19) => & @ E H S V c d f q r u
 '|' (18) => & ' ; @ G o
 'l' (17) => @ S d i r w
 '~' (16) => & : @ E R b d
 '{' (15) => @ F a e f g
 'w' (14) => & : ; @ D G H O V h k m
 'i' (14) =>   & ; @ F Z k o q
 'j' (13) => & ; @ B K p q r
 'u' (12) => & @ U i l q
 'm' (12) => @ G P W d i v
 '\x7f' (11) => : @ d g h x
 'o' (11) => @ d e s u
 'h' (11) => @ P S T f t
 'y' (10) => & : @ b c h t
 'r' ( 9) => & @ J V Y d f i
 'k' ( 9) => & : @ W Y s u
 'a' ( 8) => Z
 'q' ( 7) => & @ A G O f h
 't' ( 6) => @ P Q T
 '`' ( 4) => & @ Y x
 'c' ( 1) => X
 'f' ( 1) => z

আপনি দেখতে পাচ্ছেন, এটি আমাদের নয়টি নাম দেয় যা কেবলমাত্র সেই তথ্যের সাথে অনন্যভাবে ম্যাপ করতে পারে। নিস!

এখন আমার বাকি ম্যাপিংটি সন্ধান করা দরকার। এর জন্য আমি পূর্ণ (লোয়ার-কেসড) নামটি পূর্ণসংখ্যায় রূপান্তর করে শুরু করেছি:

def name_to_int(name):
    bits = 0
    for c in name:
        bits |= ord(c) & 0x7f
        bits <<= 7
    return bits

এটি কেবল একটি বিশাল পূর্ণসংখ্যার মধ্যে নামের 7 বিট ASCII মানগুলি একত্রিত করে। 4611686018427387903পরবর্তী পদক্ষেপের জন্য আমরা এই মডুলো (2⁶²-1) নিই।

এখন আমি একটি বিটমাস্ক সন্ধান করার চেষ্টা করব যা একটি পূর্ণসংখ্যার ফল দেয় যা ফলস্বরূপ বিভিন্ন দৈত্য চরিত্রকে আলাদা করে দেয়। বিট মাস্কগুলি সমানভাবে ছড়িয়ে থাকা (যেমন 101010101বা 1000100010001) এর সমন্বয়ে থাকে এবং বিট ( i>=1) এবং স্প্রেড ( k>=1) দ্বারা সংখ্যায়িত হয় । তদ্ব্যতীত, মুখোশগুলি 32*iবিট পর্যন্ত বাম-স্থানান্তরিত হয় । এগুলি পূর্ণসংখ্যার নামের সাথে এডি-এড হয় এবং ফলস্বরূপ পূর্ণসংখ্যাকে ম্যাপিংয়ে কী হিসাবে ব্যবহৃত হয়। i*number_of_mapping_entriesসংঘাত-মুক্ত ম্যাপিংটি সেরা (দ্বারা তৈরি ) ব্যবহৃত হয়।

পূর্ণসংখ্যার মাস্ক এবং integerised নাম এবং-ing থেকে প্রাপ্ত ফিরে স্থানান্তরিত হয় jবিট এবং (আমরা সংরক্ষণ তাদের শূন্যর ছিনতাই i, kএবং jম্যাপিং সহ যে পুনর্গঠন পাবে), স্থান অনেক সংরক্ষণ।

সুতরাং এখন আমাদের কাছে একটি দ্বি-স্তরের ম্যাপিং রয়েছে: first_keyহ্যাশম্যাপ থেকে শুরু করে হ্যাশম্যাপটি পুরো নামটিকে দানব চরটিতে অনন্যভাবে ম্যাপ করে। আমাদের এটি কোনওভাবে সংরক্ষণ করা উচিত। শীর্ষ-স্তরের ম্যাপিংয়ের প্রতিটি প্রবেশ এইরকম দেখায়:

Row = struct.Struct(
    ">"
    "B"  # first word char
    "B"  # number of bits (i) and bit spacing (k)
    "B"  # shift (j) or character to map to if i = 0
    "B"  # number of monster characters
    "B"  # map entry bytes
)

এর পরে দানব অক্ষর এবং দ্বিতীয় স্তরের ম্যাপিং।

দ্বিতীয় স্তরের ম্যাপিংটি একটি বড় পূর্ণসংখ্যায় প্যাক করে এটিকে বাইটে রূপান্তরিত করে সিরিয়ালাইজ করা হয়। প্রতিটি মান এবং কী ক্রমাগত পূর্ণসংখ্যায় স্থানান্তরিত হয়, যা ম্যাপিংটিকে পুনর্গঠনযোগ্য করে তোলে (প্রতিটি কী / মানের বিটের সংখ্যা অক্ষরের সংখ্যা থেকে দুর্বল এবং iউভয় সারি এন্ট্রিতে সঞ্চিত থাকে)।

যদি কোনও এন্ট্রিতে মানচিত্রের জন্য কেবলমাত্র একমাত্র সম্ভাব্য দৈত্য চরিত্র থাকে iতবে শূন্য হয়, অক্ষরের সংখ্যা এবং ম্যাপিংটিও শূন্য বাইট। অক্ষরটি সংরক্ষণ করা হয় যেখানে jসাধারণত সংরক্ষণ করা হত।

পূর্ণ তথ্যটি আকারে 651 বাইট, পাইথন বাইট এর 1426 বাইট স্ট্রিং হিসাবে সিরিয়ালযুক্ত।

ডিকোডিং প্রোগ্রামটি মূলত এটি অন্যভাবে করে: প্রথমে এটি first_keyঅনুসন্ধান করে এবং সংশ্লিষ্ট প্রবেশের জন্য ডেটা অনুসন্ধান করে। তারপরে এটি নামের হ্যাশ গণনা করে এবং সংশ্লিষ্ট প্রবেশের জন্য হ্যাশম্যাপের মাধ্যমে অনুসন্ধান করে।

আনবফসকেটেড ডিকোডার

#!/usr/bin/python3
import sys
import math

data = b'`"\x08\x04\x02&@Yx\xf6\x90a\x00Z\x00\x00c\x00X\x00\x00f\x00z\x00\x00hS\x12\x06\t@PSTft?z\x0fnK\nH\x87\xa2ig\t\t\x12 &;@FZkoq\x05\xfc~?\x1b\x80\xc2,z\r\xf3Y\x141\x9cS\x10\x80jU\x06\x08\t&;@BKpqr\x9f\xbe\xbb\xf9O\xcde\x03!kK\x11\x07\x07&:@WYsu\x1boDv\xc9i\x90lS$\x06\r@Sdirw\x1f\x1d\x198\xb3\xb2\x91\x0fm\xa5\x03A@mB#\x07\x07@GPWdiv\x7f;n\xb3Bk\xa5ng\x07\x0c\x16&@EHSVcdfqru\x01\xfen\x83q\xd8\xf3\x1c.\xe5\xac^\x87\t\xaaT\xd4D\x9c\xe1*Io;\x03\x05\x06@desu\x01\xf7\x95R0\x88pc \x08\n:@KMNknq\xfd\xfe\ru\xb2z\xea\\\x9b\x05qC\x08\x07\x06&@AGOfhy\xe2\xbbA\xf2ArS\x1e\x08\x08&@JVYdfi_\x1c\xd8/k\x89\xa8\xe0sw\x08\x0b\x1c&;@Kdfhijou\t\xe0[# \\\x9a\xd3F(L\xfapM\tp\xa8t\xccp\x8d\x11e+\x05\x0c\x8a\x08t+)\x04\x02@PQT\xf2\x94uG\x1c\x06\t&@Uilq\x0f\ryl\xc4`\xa5\x10\x90v\x85\r\x0e$&:@FKLNORSWYry\x9f\x97\xf8\xae\xb8\xdf\xdd\xc1\xcdl\xb2\xc9L|\xbb;\x92\xb8j\xb0\xa99\xdd\x9c\xb8\xd0\x8bh\x95\x88T\xb3;1\xb6\x0bwb\x06\x0c\x11&:;@DGHOVhkm\x02\xfe\x8fO{\xd9u\xac&\xd7\x90\x9fe\xc0\xf44GxW\x07\x07\x0bADHScdv?>\xdd<:\xb7s.\x8cI\x07yR\x07\x07\t&:@bcht;Zx\x16sO\x8d\xab\xc3ze\x0b\x08\x14&@ABCaqs\x01}\xbe=\x15\xc6\xcdL\xa1\xc8\x9e.\xf7\x02\xc1Xq4\x99\t{G\x16\x06\t@Faefg\x1f\x9bU$2P`\xa8\x80|G\x15\x06\x07&\';@Go\x1c1\\\xa7*\x0bS}s\x06\n" &@AHLYZdh\xf6\x1e\t\xb93N2\xc27\xd6\xd8\xd8*\xe5L\xa3\xa4f\x860A\xfa:7.\xdd\x9b)\xb80\x85\xc4\xb4\x83~W\x0e\x07\r&:@ERbd>\x1b\xda\x15\xd4\x92\x0eM\xacJH\x04c\x7fG\x00\x06\x08:@dghx\x1f\xbc\xf4Z\xa1%\xd3C'


def name_to_int(name):
    bits = 0
    for c in name:
        bits |= ord(c) & 0x7f
        bits <<= 7
    return bits


def make_mask(nbits, k):
    mask = 1
    for i in range(nbits-1):
        mask <<= k
        mask |= 1
    return mask


def collapse_mask(value, nbits, k):
    bits = 0
    shift = 0
    for i in range(nbits):
        bits <<= 1
        bits |= bool(value & (1<<shift))
        shift += k
    return bits


name = sys.argv[1].casefold()
last_word = name.split()[-1]
last_word_char = chr(ord(last_word[0]) ^ (ord(last_word[1]) >> 2))
while data:
    first_char = chr(data[0])
    ik, j, nchars, nbytes = data[1:5]

    i = ik >> 4
    k = ik & 15

    data = data[5:]
    if first_char != last_word_char:
        # skip this entry
        data = data[nchars+nbytes:]
        continue

    chars, mapping = data[:nchars], data[nchars:nchars+nbytes]
    result = j
    if i == 0:
        break

    mapping = int.from_bytes(mapping, "big")

    name_bits = name_to_int(name) % (2**62-1)
    mask = make_mask(i, k) << j
    key = collapse_mask((name_bits & mask) >> j, i, k)
    bits_per_key = i
    key_mask = 2**(bits_per_key)-1
    bits_per_value = math.ceil(math.log(len(chars), 2))
    value_mask = 2**(bits_per_value)-1
    while mapping:
        if mapping & key_mask == key:
            mapping >>= bits_per_key
            result = chars[mapping & value_mask]
            break
        mapping >>= bits_per_value+bits_per_key

    break
print(chr(result))

বিশ্লেষণের সরঞ্জাম

আমি তৈরি করেছি এবং ডেটা তৈরি করতে ব্যবহৃত এটি হল - নিজের ঝুঁকিতে পড়ুন:

#!/usr/bin/python3
import base64
import collections
import math
import json
import struct
import zlib

data = json.load(open("data.json"))

reverse_pseudomap = {}
forward_pseudomap = {}
forward_info = {}
reverse_fullmap = {}
hits = collections.Counter()
monster_char_hitmap = collections.Counter()

for name, char in data.items():
    name = name.casefold()
    parts = name.split()
    monster_char_hitmap[char] += 1

    # if len(parts) > 1:
    #     key = first_char + parts[0][0]
    # else:
    #     key = first_char + last_part[1]

    key = chr(ord(parts[-1][0]) ^ (ord(parts[-1][1]) >> 2))
    # key = parts[-1][0]

    hits[key] += 1
    reverse_pseudomap.setdefault(char, set()).add(key)
    forward_pseudomap.setdefault(key, set()).add(char)
    forward_info.setdefault(key, {})[name] = char
    reverse_fullmap.setdefault(char, set()).add(name)


for char, hit_count in sorted(hits.items(), key=lambda x: x[1], reverse=True):
    monsters = forward_pseudomap[char]
    print(" {!r} ({:2d}) => {}".format(
        char,
        hit_count,
        " ".join(sorted(monsters))
    ))


def make_mask(nbits, k):
    mask = 1
    for i in range(nbits-1):
        mask <<= k
        mask |= 1
    return mask


def collapse_mask(value, nbits, k):
    bits = 0
    shift = 0
    for i in range(nbits):
        bits <<= 1
        bits |= bool(value & (1<<shift))
        shift += k
    return bits


def expand_mask(value, nbits, k):
    bits = 0
    for i in range(nbits):
        bits <<= k
        bits |= value & 1
        value >>= 1
    return bits


assert collapse_mask(expand_mask(0b110110, 6, 3), 6, 3)
assert expand_mask(collapse_mask(0b1010101, 7, 3), 7, 3)


def name_to_int(name):
    # mapped_name = "".join({"-": "3", " ": "4"}.get(c, c) for c in name)
    # if len(mapped_name) % 8 != 0:
    #     if len(mapped_name) % 2 == 0:
    #         mapped_name += "7"
    #     mapped_name = mapped_name + "="*(8 - (len(mapped_name) % 8))
    # print(mapped_name)
    # return base64.b32decode(
    #     mapped_name,
    #     casefold=True,
    # )

    bits = 0
    for c in name:
        bits |= ord(c) & 0x7f
        bits <<= 7
    return bits


compressed_maps = {}
max_bit_size = 0
nmapentries = 0


for first_char, monsters in sorted(forward_info.items()):
    monster_chars = forward_pseudomap[first_char]
    print("trying to find classifier for {!r}".format(first_char))
    print("  {} monsters with {} symbols".format(
        len(monsters),
        len(monster_chars))
    )
    bits = math.log(len(monster_chars), 2)
    print("  {:.2f} bits of clever entropy needed".format(
        bits
    ))

    bits = math.ceil(bits)

    int_monsters = {
        name_to_int(name): char
        for name, char in monsters.items()
    }

    reverse_map = {}
    for name, char in int_monsters.items():
        reverse_map.setdefault(char, set()).add(name)

    solution = None
    solution_score = float("inf")

    if bits == 0:
        char = ord(list(int_monsters.values())[0][0])
        solution = 0, 0, char, {}

    for i in range(bits, 3*bits+1):
        print("  trying to find solution with {} bits".format(i))
        for k in [2, 3, 5, 7, 11]:
            mask = make_mask(i, k)
            for j in range(0, 32*bits):
                bucketed = {}
                for int_name, char in int_monsters.items():
                    bucket = (int_name % (2**62-1)) & mask
                    try:
                        if bucketed[bucket] != char:
                            break
                    except KeyError:
                        bucketed[bucket] = char
                else:
                    new_solution_score = i*len(bucketed)
                    if new_solution_score < solution_score:
                        print("   found mapping: i={}, k={}, j={}, mapping={}".format(
                            i, k, j, bucketed
                        ))
                        solution = i, k, j, bucketed
                        solution_score = new_solution_score
                mask <<= 1

    if solution is not None:
        print("  solution found!")

    chars = "".join(sorted(set(int_monsters.values())))
    i, k, j, mapping = solution

    # sanity check 1
    if i > 0:
        mask = make_mask(i, k) << j
        for int_name, char in int_monsters.items():
            key = (int_name % (2**62-1)) & mask
            assert mapping[key] == char

    compressed_mapping = {}
    for hash_key, char in mapping.items():
        hash_key = collapse_mask(hash_key >> j, i, k)
        max_bit_size = max(hash_key.bit_length(), max_bit_size)
        compressed_mapping[hash_key] = chars.index(char)

    nmapentries += len(compressed_mapping)
    compressed_maps[first_char] = i, k, j, chars, compressed_mapping

    print(" ", compressed_maps[first_char])

    print()

print("max_bit_size =", max_bit_size)
print("nmapentries =", nmapentries)

print("approx size =", (1+math.ceil(max_bit_size/8))*nmapentries)


# first we need to map first word chars to compressed mappings
Row = struct.Struct(
    ">"
    "B"  # first word char
    "B"  # number of bits (i) and bit spacing (k)
    "B"  # shift (j) or character to map to if i = 0
    "B"  # number of characters
    "B"  # map entry bytes
)


def map_to_bytes(i, nchars, mapping):
    bits_per_value = math.ceil(math.log(nchars, 2))
    bits_per_key = i

    bits = 0
    # ensure that the smallest value is encoded last
    for key, value in sorted(mapping.items(), reverse=True):
        assert key.bit_length() <= bits_per_key
        assert value.bit_length() <= bits_per_value

        bits <<= bits_per_value
        bits |= value
        bits <<= bits_per_key
        bits |= key

    return bits.to_bytes(math.ceil(bits.bit_length() / 8), "big")


def bytes_to_map(i, nchars, data):
    data = int.from_bytes(data, "big")

    bits_per_value = math.ceil(math.log(nchars, 2))
    bits_per_key = i
    key_mask = 2**(bits_per_key)-1
    value_mask = 2**(bits_per_value)-1

    mapping = {}
    while data:
        key = data & key_mask
        data >>= bits_per_key
        value = data & value_mask
        data >>= bits_per_value
        assert key not in mapping
        mapping[key] = value

    return mapping


parts = bytearray()
for first_char, (i, k, j, chars, mapping) in sorted(compressed_maps.items()):
    raw_data = map_to_bytes(i, len(chars), mapping)
    recovered_mapping = bytes_to_map(i, len(chars), raw_data)
    assert recovered_mapping == mapping, "{}\n{}\n{}\n{} {}".format(
        mapping,
        recovered_mapping,
        raw_data,
        i, len(chars),
    )
    assert len(raw_data) <= 255

    print(" {!r} => {} {} {} {} {}".format(
        first_char,
        i, k, j,
        len(chars),
        raw_data
    ))

    assert k <= 15
    assert i <= 15

    if i == 0:
        chars = ""

    row = Row.pack(
        ord(first_char),
        (i << 4) | k, j,
        len(chars),
        len(raw_data),
    )
    row += chars.encode("ascii")
    row += raw_data
    parts.extend(row)

parts = bytes(parts)
print(parts)
print(len(parts))
print(len(str(parts)))
print(len(str(zlib.compress(parts, 9))))

পরীক্ষামূলক চালক

#!/usr/bin/python3
import json
import subprocess
import sys

with open("data.json") as f:
    data = json.load(f)

for name, char in data.items():
    stdout = subprocess.check_output(["python3", sys.argv[1], name])
    stdout = stdout.decode().rstrip("\n")
    if char != stdout:
        print("mismatch for {!r}: {!r} != {!r}".format(
            name, char, stdout
        ))

0

awk 73 + 2060 বাইট

s{while(!(i=index(s,$0)))sub(/.$/,"");print substr(s,i+length(),1)}{s=$0}

তথ্য এই প্রস্তুত করা হয়েছিল:

  "Aleax": "A",            Al A     # first of alphabet truncate to len=1
  "Angel": "A",            An A
  "Arch Priest": "@",      Arch @   # this needs to come
  "Archon": "A",           Archo A  # before this
  "Ashikaga Takauji": "@", Ash @
  "Asmodeus": "&",         Asm &    

(2060 চর) অর্থ্যাৎ। নামটিতে এবং সংক্ষেপে এই রূপটিতে সংযুক্ত দানব চরিত্রটির সাথে সংক্ষিপ্ততম অনন্য স্ট্রিং:

AlAAnAArch@ArchoAAsh@Asm&

(কোনও ম্যাচ না-পাওয়া চিহ্নিত করার জন্য স্ট্রিংয়ের শুরুতে একটি পিছনে ফিরে আসা দরকার) কোনও ম্যাচ সন্ধানের সময় কোনও ম্যাচ না হওয়া অবধি নামটি চর দ্বারা সংক্ষিপ্ত করে চারটি করা হয় এবং ম্যাচের পরে পরবর্তী চরটি ফিরে আসে :

$ cat monster
Aleax
$ awk -f program.awk monsters_string monster
A

আমি এখনও কিছু আয়োজনের সাথে দানব স্ট্রিং থেকে কয়েকটি বাইট ছাঁটাই করতে পারি:

AAnArch@ArchoAsh@Asm&

দানবীদের নাম দিয়ে শুরু করে ডেটার আকার বিবেচনা করলে A38 বাইট থেকে 22 টি কমে আসবে যার অর্থ ডেটা আকার 2060 থেকে 1193 এ নেমে যাওয়া হবে।

এটি এখনও কাজ চলছে এবং দানব স্ট্রিংটি আরও পরে প্রকাশিত হবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.