দিনের র‌্যান্ডম গল্ফ # 6: একটি ডি 20 রোল


17

সিরিজ সম্পর্কে

প্রথমে, আপনি অন্য কোনও কোড গল্ফ চ্যালেঞ্জের মতো এটি ব্যবহার করতে পারেন এবং সিরিজটি মোটেও চিন্তা না করেই এর উত্তর দিতে পারেন। তবে, সমস্ত চ্যালেঞ্জ জুড়ে একটি লিডারবোর্ড রয়েছে। প্রথম পোস্টে সিরিজ সম্পর্কে আরও কিছু তথ্যের সাথে আপনি লিডারবোর্ডটি সন্ধান করতে পারেন ।

যদিও এই সিরিজের জন্য আমার কাছে অনেকগুলি ধারণাগুলি রয়েছে, ভবিষ্যতের চ্যালেঞ্জগুলি এখনও প্রস্তর হিসাবে স্থাপন করা হয়নি। যদি আপনার কোন পরামর্শ থাকে, তাহলে আমাকে দয়া করে প্রাসঙ্গিক স্যান্ডবক্স পোস্টে

হোল 6: একটি ডি 20 রোল করুন

টেবিল-শীর্ষ আরপিজিতে খুব সাধারণ ডাই হচ্ছে বিশ-পার্শ্বযুক্ত ডাই (একটি আইকোস্যাড্রন , সাধারণত ডি 20 হিসাবে পরিচিত )। এ জাতীয় ডাই রোল করা আপনার কাজ। তবে, আপনি যদি কেবল 1 এবং 20 এর মধ্যে একটি এলোমেলো নম্বর ফিরিয়ে দিচ্ছেন তবে এটি কিছুটা তুচ্ছ। সুতরাং আপনার কাজটি একটি প্রদত্ত ডাইয়ের জন্য একটি এলোমেলো নেট তৈরি করা।

আমরা নিম্নলিখিত নেট ব্যবহার করব:

এখানে চিত্র বর্ণনা লিখুন

এটি একটি ত্রিভুজ স্ট্রিপ, সুতরাং এটি সহজেই পূর্ণসংখ্যার তালিকা হিসাবে উপস্থাপিত হতে পারে। যেমন যদি আপনাকে ইনপুট দেওয়া হয়:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

এটি নিম্নলিখিত ডাইয়ের সাথে সামঞ্জস্য করবে (মজার ঘটনা: এটি ম্যাজিক দ্বারা ব্যবহৃত নেট : জড়ো জীবন কাউন্টারের / স্পিন-ডাউন ডাইস)।

এখানে চিত্র বর্ণনা লিখুন

তবে এটিই এই ডাইয়ের প্রতিনিধিত্বকারী একমাত্র নেট নয়। আমরা কীভাবে মুখগুলি আনরোল করব, তার উপর নির্ভর করে 60 টি আলাদা নেট রয়েছে। এখানে আরও দুটি রয়েছে:

[1, 8, 9, 10, 2, 3, 4, 5, 6, 7, 17, 18, 19, 11, 12, 13, 14, 15, 16, 20]
[10, 9, 18, 19, 11, 12, 3, 2, 1, 8, 7, 17, 16, 20, 13, 14, 4, 5, 6, 15]

বা গ্রাফিকালি (সরলতার জন্য আমি মুখের লেবেলগুলি ঘোরালাম না):

এখানে চিত্র বর্ণনা লিখুন এখানে চিত্র বর্ণনা লিখুন

চ্যালেঞ্জ

একটি ডাই (উপরে বর্ণিত হিসাবে) এবং একটি পূর্ণসংখ্যা N, আউটপুট প্রতিনিধিত্ব করে পূর্ণসংখ্যার একটি তালিকা দেওয়াN দেওয়া হয়েছে, প্রদত্ত ডাইয়ের সাথে সম্পর্কিত একচেটিয়াভাবে এলোমেলোভাবে ডি 20 জাল দেয়(এটি, possible০ টি সম্ভাব্য জালের প্রত্যেকটিরই উত্পন্ন হওয়ার একই সম্ভাবনা থাকা উচিত))

অবশ্যই, পিআরএনজিগুলির প্রযুক্তিগত সীমাবদ্ধতার কারণে নিখুঁত অভিন্নতা অসম্ভব হবে। আপনার জমা দেওয়ার অভিন্নতা মূল্যায়নের উদ্দেশ্যে, নিম্নলিখিত ক্রিয়াকলাপগুলি পুরোপুরি অভিন্ন বিতরণ ফলন হিসাবে বিবেচিত হবে:

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

এই অনুমানগুলি দেওয়া আপনার অ্যালগরিদম অবশ্যই একটি সম্পূর্ণ ইউনিফর্ম বিতরণ ফলন করতে হবে।

আপনার প্রোগ্রামটি এক সেকেন্ডেরও কম সময়ে 100 জাল উত্পন্ন করতে সক্ষম হওয়া উচিত (সুতরাং উপরে বর্ণিত ডাইয়ের সাথে সামঞ্জস্য না হওয়া পর্যন্ত এলোমেলো নেট তৈরির চেষ্টা করবেন না)।

আপনি STDIN (অথবা নিকটতম বিকল্প), কমান্ড-লাইন আর্গুমেন্ট বা ফাংশন আর্গুমেন্টের মাধ্যমে ইনপুট নিয়ে কোনও প্রোগ্রাম বা ফাংশন লিখতে এবং STDOUT (বা নিকটতম বিকল্প), ফাংশন রিটার্ন মান বা ফাংশন (আউট) প্যারামিটারের মাধ্যমে ফলাফল আউটপুট করতে পারেন।

ইনপুট এবং আউটপুট যে কোনও সুবিধাজনক, দ্ব্যর্থহীন, ফ্ল্যাট তালিকা ফর্ম্যাটে হতে পারে। আপনি ধরে নিতে পারেন যে ডি -20 এর মুখের মানগুলি স্বতন্ত্র, ধনাত্মক পূর্ণসংখ্যার, যা আপনার ভাষার প্রাকৃতিক পূর্ণসংখ্যার প্রকারে ফিট করে।

এটি কোড গল্ফ, তাই সংক্ষিপ্ততম জমা (বাইটে) জিতেছে। এবং অবশ্যই, ব্যবহারকারী প্রতি সংক্ষিপ্ততম জমাটিও সিরিজের সামগ্রিক লিডারবোর্ডে প্রবেশ করবে।

নমুনা আউটপুট

ইনপুট জন্য

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]

সম্ভাব্য 60 টি নেট (কোনও শৃঙ্খলাবদ্ধ না করে শর্ত দেওয়া), কোনও নির্দিষ্ট ক্রমে নয়:

[11, 10, 9, 18, 19, 20, 13, 12, 3, 2, 1, 8, 7, 17, 16, 15, 14, 4, 5, 6]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
[8, 7, 17, 18, 9, 10, 2, 1, 5, 6, 15, 16, 20, 19, 11, 12, 3, 4, 14, 13]
[3, 12, 13, 14, 4, 5, 1, 2, 10, 11, 19, 20, 16, 15, 6, 7, 8, 9, 18, 17]
[3, 4, 5, 1, 2, 10, 11, 12, 13, 14, 15, 6, 7, 8, 9, 18, 19, 20, 16, 17]
[11, 19, 20, 13, 12, 3, 2, 10, 9, 18, 17, 16, 15, 14, 4, 5, 1, 8, 7, 6]
[4, 14, 15, 6, 5, 1, 2, 3, 12, 13, 20, 16, 17, 7, 8, 9, 10, 11, 19, 18]
[2, 10, 11, 12, 3, 4, 5, 1, 8, 9, 18, 19, 20, 13, 14, 15, 6, 7, 17, 16]
[4, 5, 1, 2, 3, 12, 13, 14, 15, 6, 7, 8, 9, 10, 11, 19, 20, 16, 17, 18]
[10, 2, 1, 8, 9, 18, 19, 11, 12, 3, 4, 5, 6, 7, 17, 16, 20, 13, 14, 15]
[3, 2, 10, 11, 12, 13, 14, 4, 5, 1, 8, 9, 18, 19, 20, 16, 15, 6, 7, 17]
[7, 8, 1, 5, 6, 15, 16, 17, 18, 9, 10, 2, 3, 4, 14, 13, 20, 19, 11, 12]
[13, 12, 11, 19, 20, 16, 15, 14, 4, 3, 2, 10, 9, 18, 17, 7, 6, 5, 1, 8]
[16, 15, 14, 13, 20, 19, 18, 17, 7, 6, 5, 4, 3, 12, 11, 10, 9, 8, 1, 2]
[15, 16, 17, 7, 6, 5, 4, 14, 13, 20, 19, 18, 9, 8, 1, 2, 3, 12, 11, 10]
[20, 13, 12, 11, 19, 18, 17, 16, 15, 14, 4, 3, 2, 10, 9, 8, 7, 6, 5, 1]
[5, 4, 14, 15, 6, 7, 8, 1, 2, 3, 12, 13, 20, 16, 17, 18, 9, 10, 11, 19]
[10, 11, 12, 3, 2, 1, 8, 9, 18, 19, 20, 13, 14, 4, 5, 6, 7, 17, 16, 15]
[4, 3, 12, 13, 14, 15, 6, 5, 1, 2, 10, 11, 19, 20, 16, 17, 7, 8, 9, 18]
[19, 20, 13, 12, 11, 10, 9, 18, 17, 16, 15, 14, 4, 3, 2, 1, 8, 7, 6, 5]
[1, 8, 9, 10, 2, 3, 4, 5, 6, 7, 17, 18, 19, 11, 12, 13, 14, 15, 16, 20]
[8, 1, 5, 6, 7, 17, 18, 9, 10, 2, 3, 4, 14, 15, 16, 20, 19, 11, 12, 13]
[18, 9, 8, 7, 17, 16, 20, 19, 11, 10, 2, 1, 5, 6, 15, 14, 13, 12, 3, 4]
[12, 3, 2, 10, 11, 19, 20, 13, 14, 4, 5, 1, 8, 9, 18, 17, 16, 15, 6, 7]
[2, 3, 4, 5, 1, 8, 9, 10, 11, 12, 13, 14, 15, 6, 7, 17, 18, 19, 20, 16]
[10, 9, 18, 19, 11, 12, 3, 2, 1, 8, 7, 17, 16, 20, 13, 14, 4, 5, 6, 15]
[9, 8, 7, 17, 18, 19, 11, 10, 2, 1, 5, 6, 15, 16, 20, 13, 12, 3, 4, 14]
[16, 17, 7, 6, 15, 14, 13, 20, 19, 18, 9, 8, 1, 5, 4, 3, 12, 11, 10, 2]
[17, 7, 6, 15, 16, 20, 19, 18, 9, 8, 1, 5, 4, 14, 13, 12, 11, 10, 2, 3]
[1, 5, 6, 7, 8, 9, 10, 2, 3, 4, 14, 15, 16, 17, 18, 19, 11, 12, 13, 20]
[9, 18, 19, 11, 10, 2, 1, 8, 7, 17, 16, 20, 13, 12, 3, 4, 5, 6, 15, 14]
[16, 20, 19, 18, 17, 7, 6, 15, 14, 13, 12, 11, 10, 9, 8, 1, 5, 4, 3, 2]
[5, 1, 2, 3, 4, 14, 15, 6, 7, 8, 9, 10, 11, 12, 13, 20, 16, 17, 18, 19]
[8, 9, 10, 2, 1, 5, 6, 7, 17, 18, 19, 11, 12, 3, 4, 14, 15, 16, 20, 13]
[13, 20, 16, 15, 14, 4, 3, 12, 11, 19, 18, 17, 7, 6, 5, 1, 2, 10, 9, 8]
[6, 15, 16, 17, 7, 8, 1, 5, 4, 14, 13, 20, 19, 18, 9, 10, 2, 3, 12, 11]
[6, 5, 4, 14, 15, 16, 17, 7, 8, 1, 2, 3, 12, 13, 20, 19, 18, 9, 10, 11]
[7, 6, 15, 16, 17, 18, 9, 8, 1, 5, 4, 14, 13, 20, 19, 11, 10, 2, 3, 12]
[19, 18, 17, 16, 20, 13, 12, 11, 10, 9, 8, 7, 6, 15, 14, 4, 3, 2, 1, 5]
[14, 15, 6, 5, 4, 3, 12, 13, 20, 16, 17, 7, 8, 1, 2, 10, 11, 19, 18, 9]
[17, 18, 9, 8, 7, 6, 15, 16, 20, 19, 11, 10, 2, 1, 5, 4, 14, 13, 12, 3]
[6, 7, 8, 1, 5, 4, 14, 15, 16, 17, 18, 9, 10, 2, 3, 12, 13, 20, 19, 11]
[14, 13, 20, 16, 15, 6, 5, 4, 3, 12, 11, 19, 18, 17, 7, 8, 1, 2, 10, 9]
[20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[7, 17, 18, 9, 8, 1, 5, 6, 15, 16, 20, 19, 11, 10, 2, 3, 4, 14, 13, 12]
[15, 6, 5, 4, 14, 13, 20, 16, 17, 7, 8, 1, 2, 3, 12, 11, 19, 18, 9, 10]
[9, 10, 2, 1, 8, 7, 17, 18, 19, 11, 12, 3, 4, 5, 6, 15, 16, 20, 13, 14]
[2, 1, 8, 9, 10, 11, 12, 3, 4, 5, 6, 7, 17, 18, 19, 20, 13, 14, 15, 16]
[12, 13, 14, 4, 3, 2, 10, 11, 19, 20, 16, 15, 6, 5, 1, 8, 9, 18, 17, 7]
[17, 16, 20, 19, 18, 9, 8, 7, 6, 15, 14, 13, 12, 11, 10, 2, 1, 5, 4, 3]
[18, 17, 16, 20, 19, 11, 10, 9, 8, 7, 6, 15, 14, 13, 12, 3, 2, 1, 5, 4]
[18, 19, 11, 10, 9, 8, 7, 17, 16, 20, 13, 12, 3, 2, 1, 5, 6, 15, 14, 4]
[11, 12, 3, 2, 10, 9, 18, 19, 20, 13, 14, 4, 5, 1, 8, 7, 17, 16, 15, 6]
[15, 14, 13, 20, 16, 17, 7, 6, 5, 4, 3, 12, 11, 19, 18, 9, 8, 1, 2, 10]
[19, 11, 10, 9, 18, 17, 16, 20, 13, 12, 3, 2, 1, 8, 7, 6, 15, 14, 4, 5]
[12, 11, 19, 20, 13, 14, 4, 3, 2, 10, 9, 18, 17, 16, 15, 6, 5, 1, 8, 7]
[20, 16, 15, 14, 13, 12, 11, 19, 18, 17, 7, 6, 5, 4, 3, 2, 10, 9, 8, 1]
[13, 14, 4, 3, 12, 11, 19, 20, 16, 15, 6, 5, 1, 2, 10, 9, 18, 17, 7, 8]
[5, 6, 7, 8, 1, 2, 3, 4, 14, 15, 16, 17, 18, 9, 10, 11, 12, 13, 20, 19]
[14, 4, 3, 12, 13, 20, 16, 15, 6, 5, 1, 2, 10, 11, 19, 18, 17, 7, 8, 9]

অন্য কোনও নেট এর জন্য কেবল প্রতিটি ঘটনাকে ইনপুটে (যেখানে রয়েছে) তম সংখ্যা iদিয়ে প্রতিস্থাপন iকরুনi হয় 1 ভিত্তিক)।

সম্পর্কিত চ্যালেঞ্জ

লিডারবোর্ড

সিরিজের প্রথম পোস্টটি লিডারবোর্ড উত্পন্ন করে।

আপনার উত্তরগুলি প্রদর্শিত হবে তা নিশ্চিত করার জন্য, দয়া করে নিম্নলিখিত মার্কডাউন টেমপ্লেটটি ব্যবহার করে প্রতিটি উত্তর শিরোনাম দিয়ে শুরু করুন:

## Language Name, N bytes

Nআপনার জমা দেওয়ার আকারটি কোথায় ? আপনি যদি নিজের স্কোরটি উন্নত করেন তবে আপনি পুরানো স্কোরগুলি শিরোনামে রেখে দিতে পারেন । এই ক্ষেত্রে:

## Ruby, <s>104</s> <s>101</s> 96 bytes

(ভাষাটি বর্তমানে দেখানো হয়নি, তবে স্নিপেটের প্রয়োজন এবং এটি বিশ্লেষণ করতে পারে এবং ভবিষ্যতে আমি একটি উপ-ভাষা লিডারবোর্ড যুক্ত করতে পারি))


আমাদের আলোচনা সম্পর্কে, আমি এটি পরিষ্কার করার জন্য "মাস্ট" শব্দটি যুক্ত করেছি। আমি মনে করি যে লুফোলটি আমি গ্রহণ করছি তা বন্ধ করে দেয়। তবুও, আমি মনে করি আমি ব্যবহার করা পদ্ধতিটি (অবৈধ হলেও) আকর্ষণীয়।
স্তর নদী সেন্ট

এটি প্রায় আমার স্যান্ডবক্স পোস্টের মতো!
Rɪᴋᴇʀ

@ রিকারডাব্লু আপনি যখন স্যান্ডবক্সটি ব্যবহার করেছিলেন তখন এটিই আমি ভেবেছিলাম। ;) (সেই সময়ে আমার সরাসরি আপনার নীচে ছিল।
মার্টিন ইন্ডার

কখনও আপনার দেখেনি। এটি অদ্ভুত, আমি ভেবেছিলাম প্রথম পৃষ্ঠাতে এই সমস্তগুলি পড়েছি। তবে না, আমি স্বাধীনভাবে আমার তৈরি করেছি।
Rɪᴋᴇʀ

"বর্ধিত একটি ডি 20" শিরোনাম করা উচিত নয়?
তিতাস

উত্তর:


7

রুবি, 160 বাইট (রেভ বি)

মার্টিন বাটনারের পরামর্শের জন্য 17 বাইট সংরক্ষণ করা হয়েছে।

->a,n{n.times{k=rand 60
%w{ABCD@GHIJKLMNEFPQRSO PFENOSRQHG@DCMLKJIAB GFPQHIA@DENOSRJKBCML}.map{|b|k.times{a=b.chars.map{|i|a[i.ord-64]}}}
k>29&&a.reverse!
p a}}

রুবি, 177 বাইট (রেভ এ)

->n,a{n.times{k=rand(60)
h=->b{k.times{|j|a=(0..19).map{|i|a[b[i].ord-64]}}}
h['ABCD@GHIJKLMNEFPQRSO']
h['PFENOSRQHG@DCMLKJIAB']
h['GFPQHIA@DENOSRJKBCML']
k>29&&a.reverse!
p a}}

ব্যাখ্যা

প্রায় এক মুখ (3-ভাঁজ), একটি ভার্টেক্স (5-ভাঁজ) এবং দুটি প্রান্ত (2-ভাঁজ) দ্বারা আবর্তনের মাধ্যমে সমস্ত সম্ভাব্য ওরিয়েন্টেশন তৈরি করা সম্ভব। তবে কেবল কোনও মুখ এবং প্রান্ত নয়। অক্ষগুলির অবশ্যই সঠিক সম্পর্ক থাকতে হবে এবং আবর্তনগুলি অবশ্যই সঠিক ক্রমে করা উচিত, বা অদ্ভুত কিছু ঘটতে পারে।

এটি আমি এভাবেই করেছি (যদিও আমি বুঝতে পেরেছি যে মার্টিন এটি অন্যরকমভাবে করেছিলেন।)

নিম্নলিখিত তিনটি প্রতিসাম্য ক্রিয়াকলাপের সংমিশ্রণে একটি টেট্রহেড্রনের সমস্ত দিকনির্দেশ তৈরি করা যেতে পারে:

ক) প্রান্তের মিডপয়েন্টগুলির মাধ্যমে ডানদিকে প্রায় দুটি 2-ভাঁজ অক্ষটি ঘোরানো (এটি একে অপরের ডান কোণে রয়েছে we যদি আমরা তাদের একসাথে গুণ করি তবে আমরা বাকি জোড় প্রান্তের মাধ্যমে একটি তৃতীয় 2-ভাঁজ অক্ষ আবিষ্কার করি))

খ) একটি ভার্টেক্স এবং একটি মুখের মধ্য দিয়ে 2 গুন অক্ষের 3 গুন অক্ষের তির্যক প্রায় আবর্তন R

আইকোসহেড্রনের প্রতিসাম্যতা টিট্রাহেড্রনের একটি সুপারসেট। Https://en.wikedia.org/wiki/Icosahedron থেকে নীচের চিত্রটিতে , হলুদ মুখগুলি এবং লাল মুখগুলি দুটি পৃথক তেত্রহেদ্রাকে (বা বিকল্পভাবে একটি একক অষ্টাদশ্রয়ী) সংজ্ঞায়িত করেছে, যখন দুটি নীল মুখের সাধারণ প্রান্তগুলি তিনটি জোড়ায় রয়েছে ডান কোণ (এবং একটি ঘনক্ষেতের মুখের উপর থাকা।)

উপরে উল্লিখিত সেই প্রতিসাম্য ক্রিয়াকলাপ এবং অতিরিক্ত 5-ভাঁজ অপারেশন দ্বারা আইকোস্যাড্রনটির সমস্ত দিকনির্দেশ তৈরি করা যেতে পারে।

এখানে চিত্র বর্ণনা লিখুন

উপরে বর্ণিত চারটি অক্ষের মধ্যে প্রায় তিনটি আবর্তন ''চিহ্নগুলির মধ্যে ম্যাজিক স্ট্রিং দ্বারা প্রতিনিধিত্ব করা হয় । দ্বিতীয় 2-ভাঁজ অক্ষগুলি সম্পর্কে আবর্তন আলাদা, এবং কেবল অ্যারেটি উল্টিয়েই করা যায়a[]

পরীক্ষা প্রোগ্রামে অসম্পূর্ণ:

f=->a,n{
  n.times{                     #Iterate n times, using the result from the previous iteration to generate the next
    k=rand(60)                 #pick a random number

    h=->b{                     #helper function taking a string representing a transformation
      k.times{|j|              #which is performed on a using the number of times according to k
        a=(0..19).map{|i|a[b[i].ord-64]}
      }
    }

    #Rotate about axes k times (one 5-fold, one 3-fold, two 2-fold)
    #The first three axes have coprime rotation orders
    #And the rotations themselves take care of the modulus operation so no need to add it.
    #The second 2-fold rotation is equivalent to reversing the order
    #And is applied to the last 30 numbers as it is not coprime with the first 2-fold rotation.

    h['ABCD@GHIJKLMNEFPQRSO']  #rotate k times about 5-fold axis
    h['PFENOSRQHG@DCMLKJIAB']  #rotate k times about 3-fold axis
    h['GFPQHIA@DENOSRJKBCML']  #rotate k times about 2-fold axis
    k>29&&a.reverse!
    p a
  }
}

z=(1..20).map{|i|i} 
f[z,50]

বিকল্প সমাধান 131 বাইট (বাইনারি এলোমেলো পদক্ষেপের কারণে অবৈধ, কেবলমাত্র একটি প্রায় সঠিক বিতরণ দেয়))

->a,n{(n*99).times{|i|s=['@DEFGHIABCMNOPQRJKLS','ABCD@GHIJKLMNEFPQRSO'][rand(2)] 
a=(0..19).map{|i|a[s[i].ord-64]}
i%99==98&&p(a)}}

এটি একটি স্ক্যাম্বল (অনেকটা রুবিকের কিউবকে স্ক্র্যাম্ব করার জন্য ব্যবহৃত প্রোগ্রামগুলির মতো))

আমি যে নির্দিষ্ট ঘূর্ণনগুলি ব্যবহার করি তা হ'ল দুটি স্পষ্টত:

-এ 120 ডিগ্রি ঘূর্ণন (প্রথম চিত্র প্রতি 1 এবং 20 প্রায়)

-A degree২ ডিগ্রি ঘূর্ণন (প্রথম চিত্রের জন্য শীর্ষগুলি প্রায় 1,2,3,4,5 এবং 16,17,18,19,20 পর্যন্ত সাধারণ

আমরা 99 বার একটি কয়েন ফ্লিপ করি এবং প্রতিবার আমরা মাথা বা লেজগুলি হয় কিনা তার উপর নির্ভর করে এই দুটি ঘূর্ণনের একটি সঞ্চালন করি।

নোট করুন যে এগুলি নির্বিচারে পরিবর্তিত করার ফলে মোটামুটি সংক্ষিপ্ত ক্রম হয়। উদাহরণস্বরূপ, সঠিক ঘূর্ণন সংবেদন সহ, 180 ডিগ্রি ঘূর্ণনটি কেবল 2 পিরিয়ড সহ উত্পাদিত হতে পারে।


দেখে মনে হচ্ছে কোনও অপারেশন বাছাইয়ের জন্য মুদ্রা উল্টানো একটি অভিন্ন বিতরণের চেয়ে দ্বিপদী বিতরণের কাছাকাছি কিছু অর্জন করতে চলেছে।
স্পার

@ স্পার যদি রাষ্ট্রের স্থানটি এলোমেলো হাঁটার চেয়ে বড় হয় তবে কেস হবে। তবে এক্ষেত্রে মাত্র steps টি ধাপের এলোমেলো পদক্ষেপের ফলে 2 ^ 6 = 64 সম্ভাবনা (আমি সেগুলি গণনা করি না) খুলতে পারে এবং আমাদের রাষ্ট্রীয় স্থানটি কেবলমাত্র 60 টি। 99 টি পদক্ষেপের পরে (2 ^ 99 বিভিন্ন পথ) নম্বর উত্পন্ন করতে ব্যবহৃত পিআরএনজির একক নমুনা হিসাবে সবকিছু কমপক্ষে সমানভাবে বিতরণ করা উচিত।
স্তর নদী সেন্ট

@ মার্টিনবাটনার টিপসের জন্য ধন্যবাদ, আমি যেগুলি কাজ করে সেগুলি প্রয়োগ করেছি। b.mapসরাসরি কাজ করে না, আমার b.chars.mapএটি কাজ করতে হবে (আমার কাছে রুবি ১.৯.৩ রয়েছে বলে আমার মেশিনে বিটিডাব্লু কাজ করে না তবে এটি আইডিয়নে কাজ করে।) এটি ন্যায্য সাশ্রয়ী। আমি মনে করি না যে মুদ্রণযোগ্য অক্ষরের জন্য যাদু স্ট্রিংগুলি পরিবর্তন করে -64কাজটি সাশ্রয় করবে: উত্পন্ন অ্যারেতে স্ট্রিংয়ের মধ্যে বিভাজক হিসাবে %w{}ব্যাখ্যা \n(পাশাপাশি স্থান)। এটি অন্য মুদ্রণযোগ্য এএসসিআইআই অক্ষরগুলির সাথে কী করবে তা আমার কোনও ধারণা নেই।
স্তর নদী সেন্ট

@ মার্টিন এটি আমার প্রত্যাশার চেয়ে শক্ত ছিল - প্রথমে যখন আমার কোডটি সঠিকভাবে কাজ না করে তখন আমি হতবাক হয়ে যাই, তখন আমি বিরতি নিয়ে হঠাৎ বুঝতে পারি যে 2-ভাঁজ এবং 3-ভাণ্ডার প্রতিসাম্যগুলির একই পারস্পরিক সম্পর্ক থাকতে হবে একটি টিট্রাহেড্রোনে (আমাকে ত্রিভুজাকার মুখটি পরিবর্তন করতে হয়েছিল যা আমি অন্য ত্রিভুজাকার মুখের জন্য ঘুরছিলাম))
স্তর নদী সেন্ট

1
সদ্য আনলক করা জ্যামিতি ব্যাজ সহ প্রথম ব্যবহারকারী হিসাবে অভিনন্দন । :)
মার্টিন এন্ডার

2

আইএ -32 মেশিন কোড, 118 বাইট

Hexdump:

60 33 c0 51 8b 74 24 28 8b fa 6a 05 59 f3 a5 e8
21 00 00 00 20 c4 61 cd 6a 33 00 84 80 ad a8 33
32 00 46 20 44 8e 48 61 2d 2c 33 32 4a 00 21 20
a7 a2 90 8c 00 5b b1 04 51 0f c7 f1 83 e1 1f 49
7e f7 51 8b f2 56 8d 7c 24 e0 b1 14 f3 a4 5f 8b
f3 ac 8b ee d4 20 86 cc e3 0a 56 8d 74 04 e0 f3
a4 5e eb ed 59 e2 db 8b dd 59 e2 cc 59 83 c2 14
e2 91 61 c2 04 00

এটি বেশ দীর্ঘ, তাই কিছু ব্যাখ্যা প্রথমে যায়। আমি বিদ্যমান হিসাবে প্রায় একই অ্যালগরিদম ব্যবহার লেভেল রিভার সেন্ট দ্বারা উত্তর । আমার উত্তরটি আলাদা করার জন্য, আমি অন্যান্য মৌলিক ক্রমশক্তি নিয়েছিলাম, যা অগত্যা স্বজ্ঞাত জ্যামিতিক অর্থ হয় না, তবে এটি কোনওভাবে আরও সুবিধাজনক।

কোডটি মূলত একটি ক্রম উত্পাদন করতে হয় যা নিম্নলিখিতগুলির অনুক্রমিক প্রয়োগ:

  1. অর্ডার 3 এর ক্রমবিন্যাস, যা আমি কল করি p3, 0 ... 2 বার প্রয়োগ করা হয়েছে
  2. অর্ডার 2 এর ক্রমবিন্যাস, যা আমি কল করি q20 বা 1 বার প্রয়োগ করে
  3. অর্ডার 5 এর ক্রমবিন্যাস, যা আমি কল করি p5, 0 ... 4 বার প্রয়োগ হয়েছিল
  4. অর্ডার 2 এর আরেকটি ক্রমচারণ, যা আমি কল করি p2, 0 বা 1 বার প্রয়োগ হয়েছিল

এই অনুমোদনের জন্য অনেকগুলি সম্ভাব্য পছন্দ রয়েছে। এর মধ্যে একটি নিম্নরূপ:

p3 = [0   4   5   6   7   8   9   1   2   3  13  14  15  16  17  18  10  11  12  19]
q2 = [4   5   6   7   0   1   2   3  13  14  15  16  17   8   9  10  11  12  19  18]
p5 = [6   7   0   4   5  14  15  16  17   8   9   1   2   3  13  12  19  18  10  11]
p2 = [1   0   7   8   9  10  11   2   3   4   5   6  16  17  18  19  12  13  14  15]

এই পছন্দটি অন্যদের চেয়ে ভাল কারণ এখানকার ক্রিয়াকলাপগুলিতে ক্রমিক সূচকগুলির দীর্ঘ রান রয়েছে, যা রান-দৈর্ঘ্যের এনকোডিং দ্বারা সংকুচিত করা যায় - 4 ক্রমের জন্য কেবল 29 বাইট।

এলোমেলো সংখ্যার প্রজন্মকে সহজ করার জন্য, আমি তাদের সকলের জন্য 1 ... 30 সীমাতে শক্তিগুলি (প্রতিটি ক্রমান্বয়ে প্রয়োগ করা হয় কতবার) তা বেছে নিয়েছি। এটি কোডে অতিরিক্ত অতিরিক্ত কাজের দিকে পরিচালিত করে, কারণ উদাহরণস্বরূপ p3প্রতিটি সময় এটি নিজের দ্বারা 3 বার গুণিত করে একটি পরিচয় অনুমান হয়ে যায়। যাইহোক, কোডটি সেভাবেই ছোট, এবং যতক্ষণ না এই সীমাটি 30 দ্বারা বিভাজ্য হবে, আউটপুটটিতে অভিন্ন বিতরণ থাকবে।

এছাড়াও, ক্ষমতাগুলি ইতিবাচক হওয়া উচিত যাতে রান-দৈর্ঘ্যের ডিকোডিং অপারেশন কমপক্ষে একবার সঞ্চালিত হয়।

কোডটিতে 4 নেস্টেড লুপ রয়েছে; রূপরেখাটি এরকম:

void doit(int n, uint8_t* output, const uint8_t input[20])
{    
    uint8_t temp[20];

    n_loop: for i_n = 0 ... n
    {
        memcpy(output, input, 20);
        expr_loop: for i_expr = 0 ... 3
        {
            power = rand(1 ... 30);
            power_loop: for i_power = 0 ... power
            {
                memcpy(temp, output, 20);
                output_index = 0;
                perm_loop: do while length > 0
                {
                    index = ...; // decode it
                    length = ...; // decode it
                    memcpy(output + output_index, temp + index, length);
                    output_index += length;
                }
            }
        }
        output += 20;
    }
}

আমি আশা করি যে এই সিডো কোডটি নীচের ইনলাইন-এসেম্বলি কোডের চেয়ে পরিষ্কার cle

_declspec(naked) void __fastcall doit(int n, uint8_t* output, const uint8_t* input)
{
    _asm {
        pushad
        xor eax, eax

        n_loop:
            push ecx

            ; copy from input to output
            mov esi, [esp + 0x28]
            mov edi, edx
            push 5
            pop ecx
            rep movsd

            call end_of_data
#define rl(index, length) _emit(length * 32 + index)
            rl(0, 1)
            rl(4, 6)
            rl(1, 3)
            rl(13, 6)
            rl(10, 3)
            rl(19, 1)
            _emit(0)

            rl(4, 4)
            rl(0, 4)
            rl(13, 5)
            rl(8, 5)
            rl(19, 1)
            rl(18, 1)
            _emit(0)

            rl(6, 2)
            rl(0, 1)
            rl(4, 2)
            rl(14, 4)
            rl(8, 2)
            rl(1, 3)
            rl(13, 1)
            rl(12, 1)
            rl(19, 1)
            rl(18, 1)
            rl(10, 2)
            _emit(0)

            rl(1, 1)
            rl(0, 1)
            rl(7, 5)
            rl(2, 5)
            rl(16, 4)
            rl(12, 4)
            _emit(0)

            end_of_data:
            pop ebx ; load the address of the encoded data
            mov cl, 4

            expr_loop:
                push ecx

                make_rand:
                rdrand ecx
                and ecx, 31
                dec ecx
                jle make_rand

                ; input: ebx => encoding of permutation
                ; output: ebp => encoding of next permutation
                power_loop:
                    push ecx

                    ; copy from output to temp
                    mov esi, edx
                    push esi
                    lea edi, [esp - 0x20]
                    mov cl, 20
                    rep movsb
                    pop edi

                    ; ebx => encoding of permutation
                    ; edi => output
                    mov esi, ebx
                    perm_loop:
                        ; read a run-length
                        lodsb
                        mov ebp, esi

                        _emit(0xd4)             ; divide by 32, that is, split into
                        _emit(32)               ; index (al) and length (ah)
                        xchg cl, ah             ; set ecx = length; also makes eax = al
                        jecxz perm_loop_done    ; zero length => done decoding
                        push esi
                        lea esi, [esp + eax - 0x20]
                        rep movsb
                        pop esi
                        jmp perm_loop

                    perm_loop_done:
                    pop ecx
                    loop power_loop

                mov ebx, ebp
                pop ecx
                loop expr_loop

            pop ecx
            add edx, 20
            loop n_loop

        popad
        ret 4
    }
}

কিছু মজাদার প্রয়োগের বিশদ:

  • আমি উচ্চ স্তরের ভাষাগুলির মতো ইন্ডেন্টড অ্যাসেম্বলি ব্যবহার করেছি; অন্যথায় কোডটি একটি বোধগম্য গোলমাল হবে
  • আমি কোডে সঞ্চিত ডেটা (এনকোডড ক্রিয়েটিশন) অ্যাক্সেস করতে callএবং তারপরে ব্যবহার করিpop
  • jecxzনির্দেশ সুবিধামত আমাকে রান দৈর্ঘ্য পাঠোদ্ধারতা প্রক্রিয়ার জন্য পরিসমাপ্তি হিসাবে একটি শূন্য বাইট ব্যবহার করতে দেয়
  • ভাগ্যক্রমে, সংখ্যা 30 (2 * 3 * 5) প্রায় ২ এর শক্তি This

            and ecx, 31
            dec ecx
            jle make_rand
    
  • আমি aamএকটি বাইটকে বিট ক্ষেত্রে (3-বিট দৈর্ঘ্য এবং 5-বিট সূচক) আলাদা করতে "সাধারণ-উদ্দেশ্য বিভাগ" নির্দেশনা ব্যবহার করি ; ভাগ্যক্রমে, কোডে সেই অবস্থানে cl = 0, সুতরাং আমি উভয় "পক্ষ" থেকে উপকৃত হইxchg

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