প্রোগ্রামার ধাঁধা: একটি গেম জুড়ে দাবা বোর্ডের রাজ্যের এনকোডিং


95

কঠোরভাবে প্রশ্ন নয়, আরও ধাঁধা ...

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

প্রায়শই ফলাফলগুলি বেশ আকর্ষণীয় - ভুল, তবে আকর্ষণীয় হয়ে উঠত still এবং ব্যক্তি এখনও আমার সুপারিশটি পাবে যদি তারা ব্যাখ্যা করতে পারে যে তারা কেন কোনও নির্দিষ্ট পদ্ধতি গ্রহণ করেছে।

সুতরাং আমি ভেবেছিলাম স্ট্যাক ওভারফ্লো দর্শকদের জন্য আমি আমার একটি প্রশ্ন বাইরে ফেলে দেব।

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

উত্তরের জন্য কোনও কোডের প্রয়োজন নেই, কেবলমাত্র আপনি যে অ্যালগরিদম ব্যবহার করবেন তার একটি বিবরণ।

সম্পাদনা: পোস্টারগুলির মধ্যে একটি উল্লেখ করেছে যে, আমি চলার মধ্যে সময়ের ব্যবধানটিকে বিবেচনা করি নি। এটির জন্য নিখরচায় একটি alচ্ছিক অতিরিক্ত হিসাবে :)

সম্পাদনা 2: কেবলমাত্র অতিরিক্ত স্পষ্টতার জন্য ... মনে রাখবেন, এনকোডার / ডিকোডার বিধি-সচেতন। কেবলমাত্র জিনিসগুলি যা সত্যই সংরক্ষণ করা দরকার তা হ'ল প্লেয়ারের পছন্দ - অন্য কোনও কিছুই এনকোডার / ডিকোডার দ্বারা পরিচিত বলে ধরে নেওয়া যেতে পারে।

সম্পাদনা 3: এখানে বিজয়ী বাছাই করা কঠিন হতে চলেছে :) প্রচুর দুর্দান্ত উত্তর!


4
দাবা খেলার প্রাথমিক অবস্থা কি সংজ্ঞায়িত নয়? কেন এটি এনকোড করতে হবে? আমি মনে করি কেবল প্রতিটি টার্নের (= চলমান) মধ্যে পার্থক্যগুলি এনকোড করার জন্য যথেষ্ট হওয়া উচিত।
টানাসিউস

4
তিনি ধরে নেন যে গেমটি কোনও আইনি প্রাথমিক সেটআপ দিয়ে শুরু করতে পারে (ঠিক তেমন দাবা গেমস ধাঁধা যেমন আপনি সংবাদপত্রগুলিতে পেতে পারেন)।
হারুন ডিগুল্লা

6
কঠোর হতে, এছাড়াও আপনি কারণ এটি একটি ড্র এর একই অবস্থান উপস্থাপিত হলে তিনবার অতীতের সমস্ত অবস্থানের সঙ্কেতাক্ষরে লিখা, থাকবে en.wikipedia.org/wiki/Threefold_repetition
flybywire

4
পরামর্শ: এটিকে আসল প্রতিযোগিতায় পরিণত করুন যেখানে লোকেরা প্রোগ্রাম হিসাবে তাদের এন্ট্রি জমা দেয়। একটি প্রোগ্রাম দাবা খেলাটিকে তার ইনপুট হিসাবে গ্রহণ করবে (আপনি এর জন্য কিছু মৌলিক, মানব-পাঠযোগ্য, অ-অনুকূলিতকরণ বিন্যাসটি সংজ্ঞায়িত করতে পারেন) এবং সংকুচিত গেমটিকে আউটপুট দেবে। তারপরে, একটি প্যারামিটারের সাহায্যে এটি সংকুচিত গেমটি গ্রহণ করবে এবং মূল ইনপুটটি যা পুনরায় মেলে তা পুনরায় জেনারেট করবে।
ভিলক্স-

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

উত্তর:


132

আপডেট: আমি এই বিষয়টিকে অনেক পছন্দ করেছি আমি প্রোগ্রামিং ধাঁধা, দাবা অবস্থান এবং হাফম্যান কোডিং লিখেছি । আপনি যদি এটির মাধ্যমে পড়ে থাকেন তবে আমি নির্ধারণ করেছি যে সম্পূর্ণ গেমের স্টেট সংরক্ষণের একমাত্র উপায় হ'ল পুরো পদক্ষেপের একটি তালিকা সংরক্ষণ করে। কেন পড়ুন। সুতরাং আমি টুকরা বিন্যাসের জন্য সমস্যার কিছুটা সরলিকৃত সংস্করণ ব্যবহার করব।

সমস্যাটি

এই চিত্রটি প্রারম্ভিক দাবা অবস্থান চিত্রিত করে। দাবা একটি 8x8 বোর্ডে ঘটে যেখানে প্রতিটি প্লেয়ারের 16 টি টুকরাটির 8 টি পাঁজর, 2 রুকস, 2 নাইট, 2 বিশপ, 1 রানী এবং 1 রাজা সমন্বিত একটি সমান সেট দিয়ে শুরু হয়:

দাবা অবস্থান শুরু

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

  1. e4 ই 5
  2. এনএফ 3 এনসি 6

যা অনুবাদ করে:

  1. হোয়াইট বাদশাহের प्याদকে ই 2 থেকে ই 4 এ নিয়ে যায় (এটি কেবলমাত্র টুকরো যা ই 4 এ পেতে পারে তাই "ই 4");
  2. কালো রাজার জেদকে e7 থেকে e5 এ নিয়ে যায়;
  3. সাদা নাইটকে (এন) এফ 3 এ স্থানান্তরিত করে;
  4. কালো নাইটকে সি -6 এ সরিয়ে দেয়।

বোর্ডটি এর মতো দেখাচ্ছে:

প্রারম্ভিক খোলার

যে কোনও প্রোগ্রামারের জন্য একটি গুরুত্বপূর্ণ ক্ষমতাটি সঠিকভাবে এবং দ্ব্যর্থহীনভাবে সমস্যাটি নির্দিষ্ট করতে সক্ষম হওয়া ।

তাহলে কি অনুপস্থিত বা অস্পষ্ট? এটি পরিণত হিসাবে অনেক।

বোর্ড স্টেট বনাম গেম রাজ্য

আপনার প্রথম যে জিনিসটি নির্ধারণ করা দরকার তা হ'ল আপনি কোনও গেমের অবস্থা বা বোর্ডে টুকরো টুকরো অবস্থান সংরক্ষণ করছেন। টুকরোগুলির অবস্থানগুলিকে কেবল এনকোডিং করা একটি জিনিস তবে সমস্যাটি "পরবর্তী সমস্ত আইনী পদক্ষেপ" বলে। সমস্যাটি এই বিন্দু পর্যন্ত পদক্ষেপগুলি জানার বিষয়ে কিছুই বলে না। আমি ব্যাখ্যা হিসাবে এটি আসলে একটি সমস্যা।

কাস্টিং

খেলাটি নিম্নরূপে এগিয়ে গেছে:

  1. e4 ই 5
  2. এনএফ 3 এনসি 6
  3. বিবি 5 এ 6
  4. বা 4 বিসি 5

বোর্ডটি নিম্নরূপ দেখায়:

পরে খোলার

সাদা রঙের কাস্টিংয়ের বিকল্প রয়েছে । এর প্রয়োজনীয়তার অংশটি হ'ল রাজা এবং প্রাসঙ্গিক রুক কখনই স্থানান্তর করতে পারবেন না, তাই রাজা বা উভয় পক্ষের নাগরিক স্থানান্তরিত হয়েছে কিনা তা সংরক্ষণ করা দরকার। স্পষ্টতই যদি তারা তাদের প্রথম অবস্থানে না থাকে তবে তারা স্থানান্তরিত হয়েছে অন্যথায় এটি নির্দিষ্ট করা দরকার be

এই সমস্যাটি মোকাবেলায় বেশ কয়েকটি কৌশল ব্যবহার করা যেতে পারে।

প্রথমত, আমরা অতিরিক্ত 6 বিট তথ্য সংরক্ষণ করতে পারি (প্রতিটি রোক এবং রাজার জন্য 1) যাতে টুকরাটি স্থানান্তরিত হয়েছিল কিনা তা নির্দেশ করতে। আমরা যদি এই ছয়টি স্কোয়ারের মধ্যে একটির জন্য কিছুটা স্টোর করে প্রবাহিত করতে পারি যদি ডান টুকরোটি এর মধ্যে থাকে। বিকল্পভাবে আমরা প্রতিটি অনাবৃত টুকরোটিকে অন্য টুকরো টাইপের হিসাবে বিবেচনা করতে পারি সুতরাং প্রতিটি পক্ষের 6 টি টুকরো টাইপের পরিবর্তে (প্যাঁচা, নড়বড়, নাইট, বিশপ, রানী এবং রাজা) সেখানে 8 (অবরুদ্ধ রুক এবং অবরুদ্ধ রাজা যুক্ত করে) রয়েছে।

এন পাসেন্ট

দাবাতে আর একটি অদ্ভুত এবং প্রায়শই অবহেলিত নিয়ম হ'ল এন পাসেন্ট

en উত্তীর্ণ

গেমটি এগিয়েছে।

  1. e4 ই 5
  2. এনএফ 3 এনসি 6
  3. বিবি 5 এ 6
  4. বা 4 বিসি 5
  5. ওও বি 5
  6. বিবি 3 বি 4
  7. সি 4

ব্ল্যাকের প্যাকেটটি বি 4 এ এখন সিটি 4-এ হোয়াইট প্যাড নেওয়ার জন্য বি 4 এ তার প্যাডকে সি -3 এ সরানোর বিকল্প রয়েছে। এটি কেবল প্রথম সুযোগে ঘটে যখন কৃষ্ণ যদি এখন বিকল্পটি পাস করে তবে সে এটি পরবর্তী পদক্ষেপ নিতে পারে না। সুতরাং আমাদের এটি সংরক্ষণ করা উচিত।

আমরা যদি পূর্ববর্তী পদক্ষেপটি জানি তবে আমরা অবশ্যই উত্তর দিতে পারি যদি এন পাসেন্ট সম্ভব হয়। বিকল্পভাবে আমরা স্টোর করতে পারি যে এর চতুর্থ র‌্যাঙ্কের প্রতিটি মোহর সবেমাত্র সেখানে ডাবল সরানো নিয়ে সরে গেছে। অথবা আমরা বোর্ডে প্রতিটি সম্ভাব্য এন পাসেন্ট অবস্থান দেখতে পারি এবং এটি সম্ভব কিনা তা চিহ্নিত করার জন্য একটি পতাকা থাকতে পারে।

পদোন্নতি

আশ্রয় নেওয়া প্রচার

এটি হোয়াইটের পদক্ষেপ। হোয়াইট যদি তার উদোমাকে h7 এ h8 এ সরিয়ে দেয় তবে এটি অন্য কোনও টুকরোতে প্রচার করা যেতে পারে (তবে রাজা নয়)। এটির রানীতে উন্নীত হওয়ার সময় 99% হয় তবে কখনও কখনও তা হয় না, কারণ এটি অচলাবস্থার জন্য বাধ্য হতে পারে যখন অন্যথায় আপনি জিতেন। এটি এই হিসাবে লেখা হয়:

  1. h8 = প্রশ্ন

এটি আমাদের সমস্যায় গুরুত্বপূর্ণ কারণ এর অর্থ আমরা প্রতিটি পক্ষের নির্দিষ্ট সংখ্যক টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো আছে। একপাশে 9 কুইন, 10 রুকস, 10 বিশপ বা 10 নাইটের সাথে শেষ পর্যন্ত সমস্ত 8 জনের উন্নীত করা সম্পূর্ণভাবে সম্ভব (তবে অবিশ্বাস্যভাবে অসম্ভব)।

অচলাবস্থা

আপনি যখন নিজের সেরা কৌশলটি জিততে পারবেন না এমন অবস্থাতেই অচলাবস্থার চেষ্টা করা । সর্বাধিক সম্ভাব্য বৈকল্পিকটি হল যেখানে আপনি আইনী পদক্ষেপ নিতে পারবেন না (সাধারণত কারণ আপনার রাজাটিকে পরীক্ষা করার সময় কোনও পদক্ষেপ)। এই ক্ষেত্রে আপনি একটি ড্র দাবি করতে পারেন। এই এক যত্ন নেওয়া সহজ।

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

সর্বশেষে, পঞ্চাশটি সরানোর নিয়ম রয়েছে । কোনও খেলোয়াড় ড্র করার দাবি করতে পারে যদি কোনও পদ্মা না সরানো হয় এবং পূর্ববর্তী পঞ্চাশটি পর্বে কোনও টুকরো না নেওয়া হয় তাই আমাদের কোনও পদ্মার স্থানান্তরিত হওয়া বা একটি টুকরো নেওয়া হওয়ার পরে কতটা চাল চলবে তা সংরক্ষণ করতে হবে (দুটিটির সর্বশেষতম। এটির প্রয়োজন 6 বিট (0-63)।

কার পালা?

অবশ্যই আমাদের এটিও জানতে হবে কার পালা এবং এটি একক তথ্য।

দুটি সমস্যা

অচলাবস্থার কারণে, গেমের স্টেট সংরক্ষণের একমাত্র সম্ভাব্য বা বুদ্ধিমান উপায় হ'ল এই অবস্থানের দিকে পরিচালিত সমস্ত পদক্ষেপগুলি সংরক্ষণ করা। আমি যে একটি সমস্যা মোকাবেলা করব। বোর্ড স্টেটের সমস্যাটি এটিকে সহজতর করা হবে: কাস্টিং, ইন পাসেন্ট, অচলাবস্থার পরিস্থিতি এবং যার পালা তা অবহেলা করে বোর্ডে সমস্ত টুকরোয়ের বর্তমান অবস্থান সংরক্ষণ করুন

পিস লেআউট দুটি উপায়ের একটিতে বিস্তৃতভাবে পরিচালনা করা যায়: প্রতিটি বর্গক্ষেত্রের সামগ্রী সংরক্ষণ করে বা প্রতিটি টুকরো অবস্থান সংরক্ষণ করে।

সাধারণ বিষয়বস্তু

ছয়টি পিসের ধরণ রয়েছে (প্যাঁচা, রোক, নাইট, বিশপ, কুইন এবং কিং)। প্রতিটি টুকরা সাদা বা কালো হতে পারে তাই স্কোয়ারে 12 টি সম্ভাব্য টুকরো থাকতে পারে বা এটি খালি থাকতে পারে তাই 13 টি সম্ভাবনা রয়েছে। 13 টি 4 বিটে সংরক্ষণ করা যায় (0-15) সুতরাং সহজ সমাধান হ'ল প্রতিটি বর্গ বারের জন্য 4 বিট বা 646 স্কোয়ার বা 256 বিটের তথ্য সংরক্ষণ করা।

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

কিন্তু আমরা আরো ভালো করতে পারে।

বেস 13 এনকোডিং

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

প্রথম সমাধানটি অবস্থানটিকে digit৪ সংখ্যার বেস ১ 16 সংখ্যা হিসাবে বিবেচনা করে তবে প্রমাণিত হয়েছে যে এই তথ্যটিতে অপ্রয়োজনীয়তা রয়েছে (প্রতি "সংখ্যা" অনুসারে 3 অব্যবহৃত সম্ভাবনা হওয়া) তাই আমরা সংখ্যার স্থানটি 64 বেস 13 অঙ্কে হ্রাস করতে পারি। অবশ্যই এটি বেস 16 এর মতো দক্ষতার সাথে করা যায় না তবে এটি স্টোরেজ প্রয়োজনীয়তাগুলি সাশ্রয় করবে (এবং স্টোরেজ স্পেস হ্রাস করা আমাদের লক্ষ্য)।

বেস 10 তে 234 সংখ্যাটি 2 x 10 2 + 3 x 10 1 + 4 x 10 0 এর সমান ।

বেস 16 এ 0xA50 সংখ্যাটি 10 ​​x 16 2 + 5 x 16 1 + 0 x 16 0 = 2640 (দশমিক) এর সমান ।

সুতরাং আমরা p 0 x 13 63 + p 1 x 13 62 + ... + p 63 x 13 0 হিসাবে আমাদের অবস্থানটি এনকোড করতে পারি যেখানে আমি i বর্গক্ষেত্রের বিষয়বস্তু উপস্থাপন করি

2 256 সমান প্রায় 1.16e77। 13 64 সমান প্রায় 1.96e71, যার জন্য 237 বিট স্টোরেজ স্পেস প্রয়োজন। এই মাত্র 7.5% সাশ্রয় হ'ল উল্লেখযোগ্য পরিমাণে ম্যানিপুলেশন ব্যয় করে।

ভেরিয়েবল বেস এনকোডিং

আইনী বোর্ডগুলিতে কিছু নির্দিষ্ট টুকরো নির্দিষ্ট স্কোয়ারে উপস্থিত হতে পারে না। উদাহরণস্বরূপ, বন্ধকগুলি প্রথম বা অষ্টম র‌্যাঙ্কে ঘটতে পারে না, সেই স্কোয়ারগুলির সম্ভাবনাগুলি 11 এ কমিয়ে দেয় That এটি সম্ভাব্য বোর্ডগুলিকে 11 16 x 13 48 = 1.35e70 (আনুমানিক) এ কমিয়ে দেয় , 233 বিট স্টোরেজ স্পেসের প্রয়োজন হয়।

আসলে ডেসিমাল (বা বাইনারি) থেকে এবং এর থেকে এই জাতীয় মানগুলি এনকোডিং এবং ডিকোড করা কিছুটা আরও সংশ্লেষিত তবে এটি নির্ভরযোগ্যভাবে করা যায় এবং এটি পাঠকের অনুশীলন হিসাবে ছেড়ে যায়।

পরিবর্তনশীল প্রস্থ বর্ণমালা

পূর্ববর্তী দুটি পদ্ধতি উভয়ই স্থির-প্রস্থের বর্ণমালা সংক্রান্ত এনকোডিং হিসাবে বর্ণনা করা যেতে পারে । বর্ণমালার 11, 13 বা 16 সদস্যের প্রত্যেককেই অন্য একটি মানের জন্য প্রতিস্থাপন করা হয়। প্রতিটি "চরিত্র" একই প্রস্থ হয় তবে দক্ষতার উন্নতি করা যেতে পারে যখন আপনি বিবেচনা করেন যে প্রতিটি চরিত্রের সমান সম্ভাবনা নেই।

মোর্স কোড

মোর্স কোডটি বিবেচনা করুন (উপরে চিত্রিত)। একটি বার্তায় অক্ষরগুলি ড্যাশ এবং বিন্দুর ক্রম হিসাবে এনকোড করা হয়। এই ড্যাশগুলি এবং বিন্দুগুলি রেডিমে স্থানান্তরিত করা হয় (সাধারণত) তাদের মধ্যে সীমিত রাখার জন্য বিরতি দিয়ে typically

E অক্ষরটি ( ইংরেজির সর্বাধিক প্রচলিত অক্ষর ) কীভাবে একটি একক বিন্দু, সংক্ষিপ্ততম অনুক্রম, সেখানে জেড (সর্বনিম্ন ঘন ঘন) দুটি ড্যাশ এবং দুটি বিপ রয়েছে তা লক্ষ্য করুন।

এই জাতীয় স্কিমটি প্রত্যাশিত বার্তার আকারকে উল্লেখযোগ্যভাবে হ্রাস করতে পারে তবে এলোমেলো চরিত্রের ক্রমের আকার বাড়ানোর জন্য আসে।

এটি লক্ষ করা উচিত যে মোর্স কোডে আরও একটি অন্তর্নির্মিত বৈশিষ্ট্য রয়েছে: ড্যাশগুলি তিনটি বিন্দুর মতো দীর্ঘ হয় তাই ড্যাশগুলির ব্যবহারকে হ্রাস করার জন্য উপরের কোডটি এটিকে ધ્યાનમાં রেখে তৈরি করা হয়। যেহেতু 1s এবং 0s (আমাদের বিল্ডিং ব্লকগুলি) এ সমস্যা নেই, এটি আমাদের প্রতিলিপি তৈরি করার কোনও বৈশিষ্ট্য নয়।

শেষ অবধি, মোর্স কোডে দুটি ধরণের বিশ্রাম রয়েছে। সংক্ষিপ্ত বিশ্রাম (একটি বিন্দুর দৈর্ঘ্য) বিন্দু এবং ড্যাশগুলির মধ্যে পার্থক্য করতে ব্যবহৃত হয়। লম্বা ব্যবধান (ড্যাশের দৈর্ঘ্য) অক্ষরগুলি সীমিত করতে ব্যবহৃত হয়।

সুতরাং এটি কীভাবে আমাদের সমস্যার সাথে প্রয়োগ হয়?

হাফম্যান কোডিং

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

হাফম্যান কোড ট্রি

উপরের গাছটিতে E অক্ষরটি 000 (বা বাম-বাম-বাম) হিসাবে এনকোড করা হয়েছে এবং এস 1011। এটি স্পষ্ট হওয়া উচিত যে এই এনকোডিং স্কিমটি দ্ব্যর্থহীন

এটি মোর্স কোড থেকে একটি গুরুত্বপূর্ণ পার্থক্য। মোর্স কোডের অক্ষর বিভাজক রয়েছে যাতে এটি অন্যথায় দ্ব্যর্থহীন প্রতিস্থাপন করতে পারে (উদাহরণস্বরূপ 4 টি বিন্দু H বা 2 হয়) তবে আমাদের কেবল 1s এবং 0 গুলি রয়েছে সুতরাং আমরা পরিবর্তে একটি অস্পষ্ট বিকল্পটি বেছে নিই।

নীচে একটি সাধারণ বাস্তবায়ন:

private static class Node {
  private final Node left;
  private final Node right;
  private final String label;
  private final int weight;

  private Node(String label, int weight) {
    this.left = null;
    this.right = null;
    this.label = label;
    this.weight = weight;
  }

  public Node(Node left, Node right) {
    this.left = left;
    this.right = right;
    label = "";
    weight = left.weight + right.weight;
  }

  public boolean isLeaf() { return left == null && right == null; }

  public Node getLeft() { return left; }

  public Node getRight() { return right; }

  public String getLabel() { return label; }

  public int getWeight() { return weight; }
}

স্থির ডেটা সহ:

private final static List<string> COLOURS;
private final static Map<string, integer> WEIGHTS;

static {
  List<string> list = new ArrayList<string>();
  list.add("White");
  list.add("Black");
  COLOURS = Collections.unmodifiableList(list);
  Map<string, integer> map = new HashMap<string, integer>();
  for (String colour : COLOURS) {
    map.put(colour + " " + "King", 1);
    map.put(colour + " " + "Queen";, 1);
    map.put(colour + " " + "Rook", 2);
    map.put(colour + " " + "Knight", 2);
    map.put(colour + " " + "Bishop";, 2);
    map.put(colour + " " + "Pawn", 8);
  }
  map.put("Empty", 32);
  WEIGHTS = Collections.unmodifiableMap(map);
}

এবং:

private static class WeightComparator implements Comparator<node> {
  @Override
  public int compare(Node o1, Node o2) {
    if (o1.getWeight() == o2.getWeight()) {
      return 0;
    } else {
      return o1.getWeight() < o2.getWeight() ? -1 : 1;
    }
  }
}

private static class PathComparator implements Comparator<string> {
  @Override
  public int compare(String o1, String o2) {
    if (o1 == null) {
      return o2 == null ? 0 : -1;
    } else if (o2 == null) {
      return 1;
    } else {
      int length1 = o1.length();
      int length2 = o2.length();
      if (length1 == length2) {
        return o1.compareTo(o2);
      } else {
        return length1 < length2 ? -1 : 1;
      }
    }
  }
}

public static void main(String args[]) {
  PriorityQueue<node> queue = new PriorityQueue<node>(WEIGHTS.size(),
      new WeightComparator());
  for (Map.Entry<string, integer> entry : WEIGHTS.entrySet()) {
    queue.add(new Node(entry.getKey(), entry.getValue()));
  }
  while (queue.size() > 1) {
    Node first = queue.poll();
    Node second = queue.poll();
    queue.add(new Node(first, second));
  }
  Map<string, node> nodes = new TreeMap<string, node>(new PathComparator());
  addLeaves(nodes, queue.peek(), &quot;&quot;);
  for (Map.Entry<string, node> entry : nodes.entrySet()) {
    System.out.printf("%s %s%n", entry.getKey(), entry.getValue().getLabel());
  }
}

public static void addLeaves(Map<string, node> nodes, Node node, String prefix) {
  if (node != null) {
    addLeaves(nodes, node.getLeft(), prefix + "0");
    addLeaves(nodes, node.getRight(), prefix + "1");
    if (node.isLeaf()) {
      nodes.put(prefix, node);
    }
  }
}

একটি সম্ভাব্য আউটপুট হল:

         White    Black
Empty          0 
Pawn       110      100
Rook     11111    11110
Knight   10110    10101
Bishop   10100    11100
Queen   111010   111011
King    101110   101111

একটি শুরুর অবস্থানের জন্য এটি 32 x 1 + 16 x 3 + 12 x 5 + 4 x 6 = 164 বিটের সমান।

রাষ্ট্রীয় পার্থক্য

আরেকটি সম্ভাব্য পন্থা হফম্যান কোডিংয়ের সাথে প্রথম পদ্ধতির একত্রিত করা। এটি এই ধারণার উপর ভিত্তি করে যে সর্বাধিক প্রত্যাশিত দাবা বোর্ডগুলি (এলোমেলোভাবে উত্পন্ন উত্সগুলির পরিবর্তে) কমপক্ষে অংশে কোনও শুরুর অবস্থানের মতো হওয়ার সম্ভাবনা বেশি।

সুতরাং আপনি যা করছেন তা হ'ল 256 বিট প্রারম্ভিক অবস্থানের সাথে 256 বিট বর্তমান বোর্ড অবস্থান এবং তারপরে এনকোড করুন (হাফম্যান কোডিং ব্যবহার করে বা বলুন, দৈর্ঘ্যের এনকোডিংয়ের কিছু পদ্ধতি) )। স্পষ্টতই এটি শুরু করতে খুব দক্ষ হবে (64 0s সম্ভবত 64৪ বিটের সাথে সামঞ্জস্যপূর্ণ) তবে গেমের অগ্রগতির সাথে প্রয়োজনীয় স্টোরেজ বৃদ্ধি পাবে।

পিস পজিশন

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

প্রতিটি পক্ষের একটি রাজা এবং 0-15 অন্যান্য টুকরা থাকবে। প্রচারের কারণে এই টুকরোগুলির সঠিক মেক আপ যথেষ্ট পরিমাণে পরিবর্তিত হতে পারে যে আপনি সূচনা পজিশনের উপর ভিত্তি করে সংখ্যাটি ম্যাক্সিমামা ধরে নিতে পারবেন না।

এটিকে ভাগ করার যৌক্তিক উপায় হ'ল দুটি পাশ (হোয়াইট এবং ব্ল্যাক) সমন্বিত একটি পজিশন। প্রতিটি পক্ষের রয়েছে:

  • একজন রাজা: অবস্থানের জন্য 6 বিট;
  • পদ্মপত্র রয়েছে: 1 (হ্যাঁ), 0 (না);
  • যদি হ্যাঁ, प्याদ সংখ্যা: 3 বিট (0-7 + 1 = 1-8);
  • যদি হ্যাঁ, প্রতিটি মহিমাটির অবস্থানটি এনকোড করা হয়েছে: 45 বিট (নীচে দেখুন);
  • অ-পাউন্ডগুলির সংখ্যা: 4 বিট (0-15);
  • প্রতিটি টুকরো জন্য: টাইপ করুন (রানী জন্য 2 বিট, রোক, নাইট, বিশপ) এবং অবস্থান (6 বিট)

অদ্ভুত স্থান হিসাবে, प्याদাগুলি কেবল 48 সম্ভাব্য স্কোয়ারে থাকতে পারে (অন্যদের মতো 64 নয়)। সেই হিসাবে, অতিরিক্ত 16 টি মানকে নষ্ট না করাই ভাল যা প্রতিশব্দে 6 বিট ব্যবহার করে। তাই আপনি যদি 8 দাবার গুটির আছে 48 আছে 8 সম্ভাবনা 28.179.280.429.056 equaling। সেই মানগুলি এনকোড করতে আপনার 45 বিট দরকার।

এটি প্রতি পাশের 105 বিট বা মোট 210 বিট। প্রারম্ভিক অবস্থানটি এই পদ্ধতির জন্য সবচেয়ে খারাপ পরিস্থিতি এবং আপনি টুকরো অপসারণ করার সাথে এটি যথেষ্ট ভাল হয়ে উঠবে।

এটি চিহ্নিত করা উচিত যে 48 8 এরও কম সম্ভাবনা রয়েছে কারণ পণ্ডিতরা সবাই একই স্কোয়ারে থাকতে পারে না প্রথমটিতে 48 টি সম্ভাবনা রয়েছে, দ্বিতীয় 47 টি এবং আরও। 48 x 47 x… x 41 = 1.52e13 = 44 বিটের সঞ্চয়স্থান।

অন্যান্য টুকরা (অন্য দিক সহ) দ্বারা দখল করা স্কোয়ারগুলি বাদ দিয়ে আপনি আরও উন্নতি করতে পারেন যাতে আপনি প্রথমে সাদা নন-পাউন্ডগুলি পরে কালো অ-পাউন্ডগুলি পরে সাদা প্যাঁচাগুলি এবং শেষ অবধি কালো প্যাঁকো রাখতে পারেন। শুরুর অবস্থানে এটি স্টোরেজ প্রয়োজনীয়তাগুলিকে হোয়াইটের জন্য 44 বিট এবং কালো জন্য 42 বিট করে কমায়।

সম্মিলিত পন্থা

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

ওভারহেড যে ছোট, এটি এখন পর্যন্ত সেরা পন্থা হবে।

গেম স্টেট

আমি পজিশন না দিয়ে গেম স্টোর করার সমস্যায় ফিরে আসি । ত্রিগুণ পুনরাবৃত্তির কারণে আমাদের এখন পর্যন্ত এই পদক্ষেপগুলির তালিকা সংরক্ষণ করতে হবে to

টিকা

একটি জিনিস যা আপনাকে নির্ধারণ করতে হবে তা হল আপনি কেবল চালের একটি তালিকা সংরক্ষণ করছেন বা আপনি গেমটি টিকিয়ে দিচ্ছেন? দাবা গেমগুলি প্রায়শই টিকা দেওয়া হয়, উদাহরণস্বরূপ:

  1. বিবি 5 !! এনসি 4?

হোয়াইটের এই পদক্ষেপটি দুটি বিস্ময়বোধক পয়েন্ট দ্বারা উজ্জ্বল হিসাবে চিহ্নিত হয়েছে যেখানে কৃষ্ণচূড়া একটি ভুল হিসাবে দেখা হয়। দাবা বিরামচিহ্ন দেখুন ।

মুভগুলি বর্ণিত হওয়ার সাথে সাথে আপনার নিখরচায় পাঠ্যও সঞ্চয় করতে হবে।

আমি ধরে নিচ্ছি যে পদক্ষেপগুলি যথেষ্ট তাই কোনও টিকা নেই।

বীজগণিত স্বরলিপি

আমরা সরানোর পাঠ্যটি এখানে সহজেই সঞ্চয় করতে পারি ("e4", "বিএক্সবি 5" ইত্যাদি)। একটি টার্মিনেটিং বাইট সহ আপনি প্রতি পদে পদে প্রায় 6 বাইট (48 বিট) খুঁজছেন (সবচেয়ে খারাপ ক্ষেত্রে)। এটি বিশেষভাবে দক্ষ নয়।

দ্বিতীয় জিনিসটি চেষ্টা করে হ'ল শুরুর অবস্থান (b বিট) এবং শেষের অবস্থান (b বিট) যাতে চাল প্রতি 12 বিট সংরক্ষণ করা হয়। এটি উল্লেখযোগ্যভাবে ভাল।

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

উপসংহার

এই প্রশ্নের কোন সঠিক উত্তর নেই। অনেকগুলি সম্ভাব্য পন্থা রয়েছে যার উপরেরটি কয়েকটি মাত্র।

আমি এই এবং অনুরূপ সমস্যাগুলি সম্পর্কে যা পছন্দ করি তা হ'ল এটি ব্যবহারের ধরণটি বিবেচনা করা, সঠিকভাবে প্রয়োজনীয়তা নির্ধারণ করা এবং কোণার কেসগুলি সম্পর্কে চিন্তাভাবনা করার মতো কোনও প্রোগ্রামারের কাছে গুরুত্বপূর্ণ দক্ষতার দাবি করে।

দাবা পজিশন ট্রেনারের স্ক্রিনশট হিসাবে দাবারের অবস্থানগুলি


4
এবং ফলাফলটি gzip এর পরে (যদি শিরোনামগুলি ফলাফলটি বাড়ায় না); ^)
টড

কালো বা হোয়াইট ইঙ্গিত করার জন্য আপনার কি স্থান দ্বিগুণ করার দরকার নেই?
ড্যানিয়েল ইলিয়ট

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

9
একটি নাইট প্রচার করার জন্য, আমি একবার এটি সম্পন্ন করেছি। সত্যিই বন্য পরিস্থিতি - তিনি আমাকে সঙ্গম করা থেকে শুরু করেছিলেন, আমি এটি থামাতে পারিনি। তিনি আমার উদ্যানকে এড়িয়ে গেছেন কারণ এটি প্রচার করার সময় এটি এক দেরি হয়ে যাবে। আমি যদি তার পরিবর্তে কোনও নাইটে প্রচার করি এবং তাকে সহবাস করি তখন আমার ক্যামেরা থাকত!
লরেন পেচটেল

4
আমি আপনার নিবন্ধ বিস্মিত [fen] [1], যা castling হ্যান্ডলগুলি পাসান্ত প্রাপ্যতা স্বীকারোক্তি, ইত্যাদি [1] উল্লেখ না en.wikipedia.org/wiki/FEN
রস

48

একটি মানব-পঠনযোগ্য, স্ট্যান্ডার্ড ফর্ম্যাটে দাবা গেমগুলি সংরক্ষণ করা ভাল।

পোর্টেবল খেলা স্বরলিপি একটি প্রমিত শুরুর অবস্থান অনুমান (যদিও এটা করতে হবে না ) এবং মাত্র প্যাচসমূহ তালিকাবদ্ধ করে পরতে পরতে। একটি কমপ্যাক্ট, মানব-পঠনযোগ্য, মানক ফর্ম্যাট।

যেমন

[Event "F/S Return Match"]
[Site "Belgrade, Serbia Yugoslavia|JUG"]
[Date "1992.11.04"]
[Round "29"]
[White "Fischer, Robert J."]
[Black "Spassky, Boris V."]
[Result "1/2-1/2"]

1. e4 e5 2. Nf3 Nc6 3. Bb5 {This opening is called the Ruy Lopez.} 3... a6
4. Ba4 Nf6 5. O-O Be7 6. Re1 b5 7. Bb3 d6 8. c3 O-O 9. h3 Nb8  10. d4 Nbd7
11. c4 c6 12. cxb5 axb5 13. Nc3 Bb7 14. Bg5 b4 15. Nb1 h6 16. Bh4 c5 17. dxe5
Nxe4 18. Bxe7 Qxe7 19. exd6 Qf6 20. Nbd2 Nxd6 21. Nc4 Nxc4 22. Bxc4 Nb6
23. Ne5 Rae8 24. Bxf7+ Rxf7 25. Nxf7 Rxe1+ 26. Qxe1 Kxf7 27. Qe3 Qg5 28. Qxg5
hxg5 29. b3 Ke6 30. a3 Kd6 31. axb4 cxb4 32. Ra5 Nd5 33. f3 Bc8 34. Kf2 Bf5
35. Ra7 g6 36. Ra6+ Kc5 37. Ke1 Nf4 38. g3 Nxh3 39. Kd2 Kb5 40. Rd6 Kc5 41. Ra6
Nf2 42. g4 Bd3 43. Re6 1/2-1/2

আপনি যদি এটি আরও ছোট করতে চান তবে কেবল এটি জিপ করুন । কাজ শেষ!


23
এই প্রাপ্ত 2 টি ডাউনভোটের বিরুদ্ধে আমার প্রতিরক্ষার জন্য: 1) এটি আপনি যা চান তা করেন 2) এটি thedailywtf.com/articles/riddle-me-an-interview.aspx পরীক্ষাটি পাস করে : "... কিছু লোক যারা সমাধান করতে পারে এই ধাঁধাগুলি হ'ল ধরণের লোক হিসাবে আপনি প্রোগ্রামার হিসাবে চান না you আপনি কি সেই লোকটির সাথে কাজ করতে চান যে জল-স্থানচ্যুতকরণ স্কেল / বার্জ তৈরি করে, ডক্সের জন্য একটি 747 ট্যাক্সিতে এবং তারপরে জাম্বো জেটটি ওজন করে, কেবল বোয়িংকে প্রথম স্থানে কল করার পরিবর্তে? " আপনি এমন কাউকে ভাড়া নিবেন না যে আপনাকে সাক্ষাত্কারে একটি এলোমেলো এনকোডিং আবিষ্কার করেছে, কারণ তারা তাদের কোডেও এটি করবে।
রব গ্রান্ট

4
ঠিক আছে, আমি যদি তাদের সমস্যা সমাধানের কৌশলটি পেতে বিশেষত কোনও সমস্যা সমাধানের জন্য বলছি, তবে আপনি ধরে নিতে পারেন যে আমি অন্যান্য জিনিসগুলি দিয়ে অন্য জিনিসগুলি কভার করব ...
অ্যান্ড্রু রোলিংস

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

18
একটি সাক্ষাত্কারে এটি এই প্রশ্নের আমার প্রথম উত্তর হবে। আপনি দেখাতে চান যে আপনার প্রথম প্রবৃত্তিটি একটি প্রস্তুত সমাধানের সন্ধান করা। যদি সাক্ষাত্কারকারী আপনাকে বলে যে আপনি নিজেরাই কী নিয়ে আসতে পারেন তা শুনতে চান, তবে আপনি কিছুটা প্যাকিং সমাধানে যেতে পারেন।
টিকটিকি

4
আমি এটির সাথে রবার্টের সাথে আছি - বিদ্যমান সমাধানটি ব্যবহারিক, মানব পাঠযোগ্য এবং যথেষ্ট কমপ্যাক্ট। এগুলিকে ডিকোড করার জন্য জটিল অ্যালগরিদমের সাথে কাস্টম সুপার প্যাকযুক্ত সমাধানের তুলনায় সবই মেজর হলেন। যদি এটি সাক্ষাত্কার সম্পর্কে হয় তবে আমি অবশ্যই ব্যবহারিক দিকটি বিবেচনা করব! আপনি অবাক হবেন যে কতবার সত্যিকারের স্মার্ট লোকেরা হাইপার জটিল অবৈধিক সমাধান নিয়ে আসে। এটি সাধারণত তাদের মাথার মধ্যে জটিলতা পরিচালনা করতে পারে এ কারণে দায়ী, তবে তারপরে - আমাদের বাকিদের কী ...
মার্চ

15

দুর্দান্ত ধাঁধা!

আমি দেখতে পাচ্ছি যে বেশিরভাগ লোক প্রতিটি টুকরোটির অবস্থান সংরক্ষণ করছে। কীভাবে আরও সহজ-মনের দৃষ্টিভঙ্গি গ্রহণ এবং প্রতিটি স্কোয়ারের বিষয়বস্তু সংরক্ষণ করা যায় ? এটি প্রচারের যত্ন নেয় এবং টুকরোটি স্বয়ংক্রিয়ভাবে ক্যাপচার করে।

এবং এটি হাফম্যান এনকোডিংয়ের অনুমতি দেয় । প্রকৃতপক্ষে, বোর্ডে টুকরোগুলির প্রাথমিক ফ্রিকোয়েন্সি এটির জন্য প্রায় নিখুঁত: বর্গক্ষেত্রের অর্ধেক শূন্য, বাকী স্কোয়ারগুলির অর্ধেকটি পাউন্ড, ইত্যাদি et

প্রতিটি টুকরোটির ফ্রিকোয়েন্সি বিবেচনা করে, আমি কাগজে একটি হাফম্যান গাছ তৈরি করেছি, যা আমি এখানে পুনরায় বলব না। ফলাফল, যেখানে cরঙের জন্য দাঁড়ায় (সাদা = 0, কালো = 1):

  • 0 খালি স্কোয়ারের জন্য
  • মহিমা জন্য 1c0
  • রোকের জন্য 1c100
  • নাইটের জন্য 1c101
  • বিশপের জন্য 1c110
  • রানির জন্য 1c1110
  • 1c1111 রাজার জন্য

প্রাথমিক বোর্ডের প্রাথমিক পরিস্থিতিতে, আমাদের রয়েছে have

  • খালি স্কোয়ারগুলি: 32 * 1 বিট = 32 বিট
  • प्याদ: 16 * 3 বিট = 48 বিট
  • মুরগি / নাইট / বিশপ: 12 * 5 বিট = 60 বিট
  • রানী / কিং: 4 * 6 বিট = 24 বিট

মোট: প্রাথমিক বোর্ড রাজ্যের জন্য 164 বিট । বর্তমানে সর্বাধিক ভোট দেওয়া উত্তরের 235 বিটের চেয়ে উল্লেখযোগ্যভাবে কম। গেমটি এগিয়ে যাওয়ার সাথে সাথে এটি কেবল আরও ছোট হতে চলেছে (প্রচারের পরে ছাড়া)।

আমি কেবল বোর্ডের টুকরোগুলির অবস্থানের দিকে তাকালাম; অতিরিক্ত রাজ্য (যার পালা, তিনি কাস্ট করেছেন, উত্তীর্ণ, পুনরাবৃত্তি চালানো ইত্যাদি) আলাদাভাবে এনকোড করতে হবে। সম্ভবত আরও 16 টি বিট, তাই পুরো গেমের রাজ্যের জন্য 180 বিট । সম্ভাব্য অপ্টিমাইজেশন:

  • কম ঘন ঘন টুকরো ফেলে রাখা এবং তাদের অবস্থান পৃথকভাবে সঞ্চয় করা। তবে এটি সাহায্য করবে না ... খালি স্কোয়ার দ্বারা রাজা এবং রানিকে প্রতিস্থাপন করলে 5 টি বিট সাশ্রয় হয় যা হ'ল 5 বিট যা আপনাকে অন্যভাবে তাদের অবস্থান এনকোড করতে হবে need
  • "পিছনের সারিতে কোনও পাউনা" পিছনের সারিগুলির জন্য আলাদা আলাদা হাফম্যান টেবিল ব্যবহার করে সহজেই এনকোড করা যায়নি, তবে আমি সন্দেহ করি এটি অনেকটা সহায়তা করে। আপনি সম্ভবত একই হাফম্যান গাছটি শেষ করতে চাইবেন।
  • "একটি সাদা, একটি কালো বিশপ" এ অতিরিক্ত চিহ্ন নেই যা cবিট নেই, তা দিয়ে এনকোড করা যেতে পারে , যা বিশপ চালু বর্গ থেকে বের করে নেওয়া যেতে পারে u (বিশ্রামে পদোন্নতিপ্রাপ্ত পাওনারা এই প্রকল্পটি ব্যাহত করে ...)
  • "এক সারিতে 2 টি ফাঁকা স্কোয়ার" এবং "এক সারিতে 4 টি ফাঁকা স্কোয়ার" বলার জন্য খালি স্কোয়ারগুলির পুনরাবৃত্তিগুলি অতিরিক্ত দৈর্ঘ্যের চিহ্ন দিয়ে প্রস্থের দৈর্ঘ্যের এনকোড করা যেতে পারে। তবে এগুলির ফ্রিকোয়েন্সি অনুমান করা এত সহজ নয় এবং আপনি যদি এটির ভুল হয়ে থাকেন তবে এটি সাহায্যের চেয়ে ক্ষতি করবে।

ব্যাঙ্কের র‌্যাঙ্কে কোনও प्याদ কিছুটা সাশ্রয় করে না - আপনি অন্যান্য সমস্ত নিদর্শনগুলির মধ্যে বিট # 3 কেটে ফেলতে পারেন। সুতরাং আপনি প্রতি এক বিট সংরক্ষণ করতে হবে আসলে একটি ব্যাঙ্ক র‌্যাঙ্কে।
লরেন পেচটেল

4
আপনি 64৪ স্কোয়ারের জন্য আলাদা আলাদা হাফম্যান গাছ করতে পারেন, কারও কারও কারও কাছে সম্ভবত অন্যান্য অংশের তুলনায় প্রায়শই টুকরো টুকরো থাকে।
ক্লদিউ

9

সত্যিই বড় লুক টেবিল পদ্ধতির

অবস্থান - 18 বাইট
আইনী পদের আনুমানিক সংখ্যা 10 43
কেবল তাদের সমস্তকে গণনা করুন এবং অবস্থানটি কেবল 143 বিটে সংরক্ষণ করা যেতে পারে। পরবর্তী কোন দিকে খেলতে হবে তা বোঝাতে আরও 1 বিট প্রয়োজন

গণনাটি অবশ্যই ব্যবহারিক নয়, তবে এটি দেখায় যে কমপক্ষে 144 বিট প্রয়োজন।

চাল - 1 বাইট
সাধারণত প্রতিটি পদের জন্য প্রায় 30-40 আইনি প্যাচসমূহ আছে কিন্তু 218 গনা সব একে পদের জন্য আইনি প্যাচসমূহ করতে দেয় যেমন সংখ্যা উচ্চ হিসাবে হতে পারে। এখন প্রতিটি পদক্ষেপে একটি বাইটে এনকোড করা যায়।

পদত্যাগের প্রতিনিধিত্ব করার জন্য আমাদের কাছে 0xFF এর মতো বিশেষ পদক্ষেপের জন্য প্রচুর জায়গা রয়েছে।


4
প্রয়োজনীয়তার হৃদয়টিতে সরাসরি "আপনি একটি দাবা গেমের রাজ্যটিকে এনকোড করার জন্য সবচেয়ে স্পেস-দক্ষ উপায়" ভাবতে পারেন "- অভিধানের চেয়ে কোনও কিছু স্কোয়াশের চেয়ে ভাল কিছুই নয়, এবং এর মধ্যে একটি ফ্লাইও অন্তর্ভুক্ত রয়েছে।
অ্যান্ড্রু

4
আমি এরকম একটি অভিধান তৈরি করতে কত সময় লাগবে তার একটি আকর্ষণীয় লিঙ্কটি পেয়েছিলাম :) ioannis.virtualcomposer2000.com/math/EveryChess.html
অ্যান্ড্রু রোলিংস

শ্যাননসের অনুমানটি কিছুটা পুরানো :-) তিনি কোনও পদোন্নতি বা ক্যাপচারও অন্তর্ভুক্ত করেননি, যা ন্যায্য পরিমাণে সংখ্যাটি উড়িয়ে দেয়। 5x10 ^ 52 এর উপরের গণ্ডিটি ভিক্টর অ্যালিস 1994 দিয়েছিলেন
গুন্থার পাইজ

অবশ্যই কোনও পরিবর্তনশীল দৈর্ঘ্যের এনকোডিংয়ের সাথে গড় কমপক্ষে 10 ^ 43 হয়? আরও পজিশনের প্রতি পক্ষপাতযুক্ত এনকোডিংয়ের অবশ্যই এটি হ্রাস করতে হবে, বিশেষত অনেকগুলি অবস্থান অসম্ভব।
ফিল এইচ

এরিচেস লিঙ্কটি এখন 'বিক্রয়ের জন্য', আর্কাইভ.আর লিঙ্ক: web.archive.org/web/20120303094654/http://…
oPless

4

এটি সবচেয়ে খারাপ অবস্থার পরিবর্তে, মানুষের দ্বারা খেলে থাকা সাধারণ গেমগুলির জন্য গড়- আকারের আকারের জন্য অনুকূলিতকরণে আগ্রহ যুক্ত করবে । (সমস্যার বিবৃতিটি কোনটি বলে না; বেশিরভাগ প্রতিক্রিয়াগুলি সবচেয়ে খারাপ পরিস্থিতি বলে মনে করে))

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

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

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


এই তথ্যটি পুলে সঞ্চয় করার জন্য জটিলতা হ'ল হে (এন), আমার সম্পাদিত উত্তরটি পরীক্ষা করুন।
লুকা রাহনে

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

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

4

প্রাথমিক অবস্থান এনকোড হওয়ার পরে পদক্ষেপগুলি এনকোডিংয়ের একটি সাব-সমস্যাটি আক্রমণ করে। পদ্ধতির পদক্ষেপগুলির একটি "লিঙ্কযুক্ত তালিকা" তৈরি করা হয়।

গেমের প্রতিটি পদক্ষেপ "পুরানো অবস্থান-> নতুন অবস্থান" জুটি হিসাবে এনকোড করা হয়। দাবা খেলার শুরুতে আপনি প্রাথমিক অবস্থানটি জানেন; পদক্ষেপের লিঙ্কিত তালিকাকে অনুসরণ করে, আপনি এক্স পদক্ষেপের পরে রাজ্যে যেতে পারেন।

প্রতিটি পদক্ষেপের এনকোডিংয়ের জন্য, আপনার প্রারম্ভিক অবস্থানটি এনকোড করার জন্য 64 টি মান প্রয়োজন (বোর্ডে squ৪ স্কোয়ারের জন্য 6 বিট - 8x8 স্কোয়ার), এবং শেষ অবস্থানের জন্য 6 বিট। প্রতিটি পক্ষের 1 পদক্ষেপের জন্য 16 বিট।

প্রদত্ত গেমটি এনকোডিংয়ের জন্য যে পরিমাণ জায়গা গ্রহণ করবে তা চালানের সংখ্যার সাথে সমানুপাতিক:

10 x (সাদা চাল সংখ্যা + কালো চাল সংখ্যা) বিট

হালনাগাদ: প্রচারিত পশমীদের সাথে সম্ভাব্য জটিলতা। পদ্মাকে কীভাবে প্রচার করা হয় তা জানাতে সক্ষম হওয়ার জন্য - বিশেষ বিটগুলির প্রয়োজন হতে পারে (স্থান বাঁচাতে এর জন্য ধূসর কোড ব্যবহার করা হবে, কারণ प्यादा প্রচার অত্যন্ত বিরল)।

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

Pawn: 
   - 2 options for movement (e2e3 or e2e4) + 2 options for taking = 4 options to encode
   - 12 options for promotions - 4 promotions (knight, biship, rook, queen) times 3 squares (because you can take a piece on the last row and promote the pawn at the same time)
   - Total of 16 options, 4 bits
Knight: 8 options, 3 bits
Bishop: 4 bits
Rook: 4 bits
King: 3 bits
Queen: 5 bits

সুতরাং কালো বা সাদা সরানো প্রতি স্থানিক জটিলতা হয়ে যায়

প্রাথমিক অবস্থানের জন্য 6 বিট + (স্থানান্তরিত জিনিসটির উপর ভিত্তি করে বিটের পরিবর্তনশীল সংখ্যা)।


সবেমাত্র আপডেট হয়েছে, আমি 128 টি সংশ্লেষ বোঝাতে পেরেছি - স্পষ্টতই 128 বিটের চেয়ে কম :) :)
অ্যালেক্স ওয়েইনস্টেইন

4
একটি গেম স্টেট চলার মতো নয়। প্রদত্ত যে কোনও অবস্থানকে একটি শীর্ষবিন্দু বা নোডের কথা ভাবা যেতে পারে এবং একটি আইনী পদক্ষেপকে নির্দেশিত প্রান্ত বা তীর সম্পর্কে চিন্তা করা যেতে পারে, যা একটি (নির্দেশিত অ্যাসাইক্লিক) গ্রাফ তৈরি করে।
শেগি ব্যাঙ

আমি নিশ্চিত না কেন নেতিবাচক ভোট - আমি আপডেট হওয়া আইডিয়ায় মানুষের মতামত শুনতে পছন্দ করব।
অ্যালেক্স ওয়েইনস্টাইন

4
এটি আপনার যুক্তিগুলিকে প্রভাবিত করে না, তবে একটি ছোট সংশোধন: একটি পদ্মায় চারটি পদক্ষেপ থাকতে পারে প্রচার সহ নয়, বা প্রচার সহ 12 টি চাল থাকতে পারে moves E2: e3, e4, exd3, exf3 এ পদ্মের উদাহরণ। উদাহরণস্বরূপ e7: ই8Q, e8N, e8R, e8B, exd8Q, exd8N, exd8R, exd8B, exf8Q, exf8N, exf8R, exf8B p
এ। রেক্স

4
একটি ছোটখাটো সমস্যা - 5 বিট কেবল 32 টি মানকে এনকোড করে। বোর্ডে যে কোনও বর্গক্ষেত্র নির্দিষ্ট করতে আপনার 6 বিট দরকার।
ক্রিস ডড

4

আমি গতকাল রাতে এই প্রশ্নটি দেখেছি এবং এটি আমাকে উত্সাহিত করেছিল তাই আমি বিছানায় বসে সমাধানগুলি ভেবে বসেছিলাম। আমার চূড়ান্ত উত্তরটি int3 এর প্রকৃতর সাথে বেশ মিল।

বেসিক সমাধান

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

মোট 32 টি টুকরা রয়েছে তবে প্রতিটি চলতে আপনি জানেন যে রঙটি কীভাবে চলাচল করছে তাই চিন্তার জন্য কেবল 16 স্কোয়ার রয়েছে, 4 বিট যার জন্য এই টুকরোটি টুকরো টুকরো করে।

প্রতিটি টুকরোটিতে কেবল সীমিত মুভসেট থাকে, যা আপনি কোনও উপায়ে গণনা করতে পারেন।

  • বন্ধন: 4 টি বিকল্প, 2 বিট (1 ধাপ এগিয়ে, 2 ধাপ এগিয়ে, প্রতিটি তির্যক 1)
  • রুক: 14 টি বিকল্প, 4 বিট (প্রতিটি দিকে সর্বোচ্চ 7)
  • বিশপ: ১৩ টি বিকল্প, ৪ টি বিট (যদি আপনার একটি ত্রিতে 7 থাকে তবে অন্যটিতে আপনার 6 টি থাকে)
  • নাইট: 8 টি বিকল্প, 3 বিট
  • রানী: 27 টি বিকল্প, 5 বিট (রুক + বিশপ)
  • কিং: 9 টি বিকল্প, 4 টি বিট (8 টি এক-পদক্ষেপের চালা, আরও কাস্টিং বিকল্প)

প্রচারের জন্য, এখানে 4 টি টুকরো বেছে নিতে হবে (রুক, বিশপ, নাইট, কুইন) সুতরাং সেই পদক্ষেপে আমরা এটি নির্দিষ্ট করতে 2 বিট যুক্ত করব । আমি মনে করি অন্যান্য সমস্ত নিয়ম স্বয়ংক্রিয়ভাবে কভার করা হয়েছে (যেমন এন পাসেন্ট)।

আরও অনুকূলিতকরণ ations

প্রথমে, এক রঙের 8 টি টুকরো ধরা পড়ার পরে, আপনি টুকরো এনকোডিংটি 3 বিট, তারপরে 4 বিটের 2 বিট এবং আরও কমিয়ে দিতে পারেন।

যদিও মূল অপটিমাইজেশন হ'ল গেমের প্রতিটি পয়েন্টে কেবলমাত্র সম্ভাব্য পদক্ষেপগুলি গণনা করা । ধরা যাক আমরা {00, 01, 10, 11}যথাক্রমে 1 ধাপ এগিয়ে 2 ধাপ এগিয়ে, তির্যক বাম এবং তির্যক ডান হিসাবে একটি পাউনের চালগুলি সঞ্চয় করি । যদি কিছু পদক্ষেপগুলি সম্ভব না হয় তবে আমরা এগুলি পরিবর্তনের জন্য এনকোডিং থেকে তাদের সরাতে পারি।

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

সংক্ষেপে, প্রতিটি টুকরো জন্য উপরে তালিকাভুক্ত বিট স্টোরেজ কেবলমাত্র সর্বোচ্চ । প্রায় প্রতিটি পদক্ষেপে কম বিকল্প এবং প্রায়শই কম বিট থাকবে।


4

প্রতিটি অবস্থানে সমস্ত সম্ভাব্য পদক্ষেপের সংখ্যা পান get

পরবর্তী পদক্ষেপ হিসাবে উত্পন্ন হয়

index_current_move =n % num_of_moves //this is best space efficiency
n=n/num_of_moves

এলোমেলোভাবে উত্পন্ন গেমটি সংরক্ষণের জন্য সম্ভবত সর্বোত্তম স্থান দক্ষতা এবং আপনার কাছে 30-40 সম্ভাব্য চলন রয়েছে বলে গড়ে প্রায় 5 বিট / মুভ প্রয়োজন। সংগ্রহের সঞ্চয় কেবল বিপরীত ক্রমে n উত্পন্ন করছে।

দুর্দান্ত অপ্রয়োজনীয়তার কারণে স্টোরিং পজিশনে ক্র্যাক করা শক্ত। (একটি সাইটের জন্য বোর্ডে 9 টি পর্যন্ত রানী থাকতে পারে তবে সেই ক্ষেত্রে কোনও পাউনা নেই, এবং বোর্ডে যদি বিপরীত রঙের স্কোয়ারগুলিতে থাকে তবে বিশপগুলি) তবে সাধারণত অবশিষ্ট স্কোয়ারগুলির উপর একই টুকরাগুলির সংমিশ্রণটি সংরক্ষণ করার মতো)

সম্পাদনা:

পয়েন্ট ইন সেভিং মুভগুলি কেবল মুভের সূচক সংরক্ষণ করা store কেসি 1-সি 2 সঞ্চয় করার পরিবর্তে এবং এই তথ্য হ্রাস করার চেষ্টা করার পরিবর্তে আমাদের কেবলমাত্র ডিটারমিনিস্টিক মুভিজনেটর (অবস্থান) থেকে উত্পন্ন পদক্ষেপের সূচক যুক্ত করা উচিত

প্রতিটি পদক্ষেপে আমরা আকারের তথ্য যুক্ত করি

num_of_moves = get_number_of_possible_moves(postion) ;

পুল এবং এই সংখ্যা হ্রাস করা যাবে না

তথ্য পুল হয়

n=n*num_of_moves+ index_current_move

অতিরিক্ত

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

তথ্য পুলের মধ্যে সংরক্ষণের উদাহরণ

ধরা যাক আমরা শুরু অবস্থানগুলি জানি এবং আমরা 3 টি চাল করি।

প্রথম পদক্ষেপে 5 টি সহজ চলন রয়েছে, এবং আমরা সরানো সূচক 4 নিয়ে চলেছি second দ্বিতীয় পদক্ষেপে 6 টি উপলভ্য চলন রয়েছে এবং আমরা অবস্থান সূচক 3 গ্রহণ করি এবং 3 য় স্থলে side পাশের জন্য 7 টি চাল উপলব্ধ থাকে এবং তিনি মুভ সূচকটি বেছে নেওয়ার জন্য বেছে নিয়েছিলেন ঘ।

ভেক্টর ফর্ম; সূচক = [৪,৩,২] এন_মোভস = [৫,6,,]

আমরা এই তথ্যটি পিছনের দিকে এনকোডিং করছি, সুতরাং এন = 4 + 5 * (3 + 6 * (2)) = 79 (7 দ্বারা গুন করার প্রয়োজন নেই)

এটি কীভাবে আনলপ করবেন? প্রথমে আমাদের অবস্থান আছে এবং আমরা খুঁজে বের করি যে এখানে 5 টি চাল উপলব্ধ রয়েছে। তাই

index=79%5=4
n=79/5=15; //no remainder

আমরা সরানো সূচী 4 গ্রহণ করি এবং আবার অবস্থান পরীক্ষা করি এবং এই বিন্দু থেকে আমরা জানতে পারি যে সেখানে 6 টি সম্ভাব্য পদক্ষেপ রয়েছে।

index=15%6=3
n=15/6=2

এবং আমরা মুভ সূচি 3 গ্রহণ করি যা আমাদের 7 টি সম্ভাব্য পদক্ষেপের সাথে একটি অবস্থানে নিয়ে যায়।

index=2%7=2
n=2/7=0

আমরা সর্বশেষ পদক্ষেপ সূচক 2 করি এবং আমরা চূড়ান্ত অবস্থানে পৌঁছায়।

আপনি দেখতে পাচ্ছেন যে সময়ের জটিলতা হ'ল ও (এন) এএনএসড স্পেস জটিলতা হ'ল ও (এন)। সম্পাদনা করুন: সময়ের জটিলতা আসলে ও (এন ^ 2) কারণ আপনার সংখ্যাটি বহুগুণে বৃদ্ধি পেয়েছে, তবে 10,000 গতিপথ পর্যন্ত গেমস সংরক্ষণ করতে কোনও সমস্যা হওয়া উচিত নয়।


সংরক্ষণের অবস্থান

সর্বোত্তম কাছাকাছি করা যেতে পারে।

যখন আমরা তথ্য এবং তথ্য সংরক্ষণের সন্ধান করি তখন আমাকে এটি সম্পর্কে আরও কথা বলতে দিন। সাধারণ ধারণাটি রিডানডেন্সি হ্রাস করা হয় (আমি পরে এটি সম্পর্কে কথা বলব)। ধরে নেওয়া যাক যে কোনও পদোন্নতি নেই এবং নেওয়াও নেই তাই 8 জন পাঁজর, 2 টি রুকস, 2 নাইট, 2 বিশপ 1 জন রাজা এবং প্রতিপক্ষের 1 জন রানী রয়েছে।

আমাদের কী সংরক্ষণ করতে হবে: ১. প্রতিটি শান্তির অবস্থান ২. কাস্টিংয়ের সম্ভাবনা ৩. এন-পাসেন্টের সম্ভাবনা ৪. পাশ যেটি উপলভ্য হয়েছে

ধরা যাক প্রতিটি টুকরোটি যে কোনও জায়গায় দাঁড়িয়ে থাকতে পারে তবে একই জায়গায় 2 টুকরা নয়। বোর্ডে 8 রঙের একই রঙের সজ্জিত পদ্ধতিগুলির সংখ্যা হ'ল সি (64৪/৮) (দ্বিপদী) যা ৩২ বিট, তারপরে ২ টি রুকস 2 আর-> সি (56/2), 2 বি -> সি (54/2) , 2 এন-> সি (52/2), 1Q-> সি (50/1), 1 কে -> সি (49/1) এবং অন্যান্য সাইটের জন্য একই তবে 8 পি -> সি (48/8) দিয়ে শুরু হবে এবং আরও ।

উভয় সাইটের একসাথে এটি গুণমান আমাদের 4634726695587809641192045982323285670400000 যা প্রায় 142 বিট হয়, আমাদের সম্ভাব্য এন-পাসেন্টের জন্য 8 টি যোগ করতে হবে (এন-পাসেন্ট প্যাঁচ 8 টির মধ্যে একটিতে থাকতে পারে), কাস্টিং সীমাবদ্ধতার জন্য 16 (4 বিট) যে সাইটটি সরানো হয়েছে তার জন্য এক বিট। আমরা 142 + 3 + 4 + 1 = 150 বিট দিয়ে শেষ করি

তবে এখন 32 টি টুকরো এবং কোনও গ্রহণ না করে বোর্ডে অপ্রয়োজনীয় সন্ধানের দিকে চলুন।

  1. কালো এবং সাদা উভয় পদ্মা একই কলামে এবং একে অপরের মুখোমুখি। প্রতিটি ভাঁড়ামি অন্যান্য পদ্মার মুখোমুখি হয় তার অর্থ সাদা প্যাড সর্বাধিক 6th ষ্ঠ র‌্যাঙ্কে থাকতে পারে। এটি আমাদের সি (64/8) * সি (48/8) এর পরিবর্তে 8 * সেন্টিগ্রেড (6/2) এনেছে যা 56 বিট দ্বারা তথ্য হ্রাস করে।

  2. কাস্টিংয়ের সম্ভাবনাও অতিরিক্ত red যদি রুকস শুরু করার জায়গায় না থাকে তবে সেই রুকের মতো কাস্টিংয়ের কোনও সম্ভাবনা নেই। সুতরাং আমরা কল্পনাশক্তিতে অতিরিক্ত তথ্য পেতে বোর্ডে 4 স্কোয়ার যুক্ত করতে পারি যদি এই রুকটি ঝকঝকে করা সম্ভব হয় এবং 4 টি কাস্টলিং বিট অপসারণ করে। সুতরাং সি (৫//২) * সি (৪০/২) * ১ instead এর পরিবর্তে আমাদের সি (৫//২) * সি (৪২/২) রয়েছে এবং আমরা ৩.7676 বিট (প্রায় ৪ টি বিট) হারিয়েছি

  3. এন-প্যাস্যান্ট: যখন আমরা ৮ জন পাসের সম্ভাব্যবিলাইটগুলির মধ্যে একটি সঞ্চয় করি তখন আমরা কালো প্যাঁচের অবস্থান জানি এবং তথ্যগত পুনর্নির্বাচিততা হ্রাস করি (যদি এটি সাদা পদক্ষেপ হয় এবং 3 তম প্যাঁস এন-পাসেন্ট থাকে যার অর্থ কৃষ্ণ প্যাঁচ সি সিতে থাকে এবং সাদা প্যাড হয়) সি 2, সি 3 বা সি 4) সি (6/2) এর অন্তর্নির্মিত আমাদের 3 রয়েছে এবং আমরা 2.3 বিট হারিয়েছি। আমরা কিছু অপ্রয়োজনীয়তা হ্রাস করি যদি আমরা শুভ এন-পাস্যান্ট সংখ্যাও পাশের অংশে সংরক্ষণ করি তবে যেগুলি থেকে সম্পন্ন করা যায় (3 সম্ভাবনা-> বাম, ডান, উভয়) এবং আমরা জানি যে প্যাডের সম্ভাবনাটি উত্তীর্ণ হতে পারে। (উদাহরণস্বরূপ, সি 5-তে বাম, ডান বা উভয় কী হতে পারে তা সাদা রঙের কালো উদাহরণ থেকে পাওয়া যায় it এটি যদি একটি সাইটে থাকে তবে আমাদের কাছে 2 * 3 (সিসিবিবিলাইটস সংরক্ষণের জন্য 3 এবং 3 or বা 6 র‌্যাঙ্কের কালো প্যাঁচের জন্য 2 টি সম্ভাব্য পদক্ষেপ রয়েছে) ) সি (6/2) এর প্ররোচিত এবং আমরা 1.3 বিট দ্বারা হ্রাস করি এবং উভয় পক্ষের দিকে আমরা 4.2 বিট হ্রাস করি। এইভাবে আমরা 2.3 + 1.3 = 3 দ্বারা হ্রাস করতে পারি।

  4. বিশপস: বিসপগুলি কেবলমাত্র অপস্টাইট স্কোয়ারে থাকতে পারে, এটি প্রতিটি সাইটের জন্য 1 বিট কমিয়ে দেয় রিডানডেন্সি।

যদি আমাদের যোগফল থাকে তবে দাবা পজিশনের জন্য যদি কোনও টাকা না থাকে তবে আমাদের জন্য 150-56-4-3-6-2 = 85 বেট প্রয়োজন

এবং যদি অ্যাকাউন্টে নেওয়া অর্থ এবং প্রচারগুলি নেওয়া হয় তবে বেশি কিছু না (তবে আমি পরে এটি লিখব যদি কেউ এই দীর্ঘ পোস্টটি ব্যবহারযোগ্য বলে খুঁজে পান)


আকর্ষণীয় পদ্ধতির। আরও কিছু বিশদ যুক্ত করুন :)
অ্যান্ড্রু রোলিংস

আমি পজিশন সাশ্রয়ের জন্য অ্যাপ্রোচ যোগ করেছি। আমি 85 পজেটে নেমেছি এমন কোনও পদক্ষেপ নেই যা ভালভাবে গ্রহণ না করে এবং এটি কতটা দূরে যেতে পারা যায় তা একটি ভাল ইলাস্ট্রেশন। আমি মনে করি যে কাস্টলিংয়ের সম্ভাবনাগুলি সংরক্ষণ করার ক্ষেত্রে সেরা ধারণাটি যেখানে প্রায় 4 টি বিট অপ্রয়োজনীয়।
লুকা রাহনে

3

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

বিট প্রতি টুকরো:

  • পিস-আইডি: প্রতি 16 টি টুকরোটি চিহ্নিত করতে সর্বোচ্চ 4 টি বিট b সাদা / কালো অনুমান করা যেতে পারে। টুকরা উপর একটি অর্ডার সংজ্ঞায়িত করা আছে। যেহেতু টুকরো সংখ্যা দুটির संबंधित ক্ষমতার নিচে নেমেছে, অবশিষ্ট টুকরোগুলি বর্ণনা করতে কম বিট ব্যবহার করুন।
  • বন্ধক: প্রথম পদক্ষেপে 3 সম্ভাবনা, সুতরাং +2 বিট (এক বা দুটি স্কোয়ার দ্বারা এগিয়ে, এন পাসেন্ট।) পরবর্তী পদক্ষেপগুলি দুটি দ্বারা এগিয়ে যাওয়ার অনুমতি দেয় না, সুতরাং +1 বিট যথেষ্ট। যখন মোহরানা সর্বশেষ র‌্যাঙ্কে এসেছে তখন লক্ষ করে ডকোডিং প্রক্রিয়াতে পদোন্নতি অনুমান করা যেতে পারে। যদি মহিমা প্রচারিত হয় বলে জানা যায়, তবে ডিকোডার আরও 2 বিট আশা করবে যা নির্দেশ করে যে এটি 4 টি বড় টুকরোর মধ্যে কীভাবে উন্নীত হয়েছে।
  • বিশপ: তির্যক ব্যবহৃত +1 বিট, তির্যকটি দূরত্বের জন্য +4 বিট পর্যন্ত (16 সম্ভাব্যতা) ডিকোডারটি সর্বাধিক সম্ভাব্য দূরত্বটি নির্ধারণ করতে পারে যে টুকরোটিটি তির্যক বরাবর চলে যেতে পারে, সুতরাং এটি যদি একটি ছোট তির্যক হয় তবে কম বিট ব্যবহার করুন।
  • নাইট: 8 সম্ভাব্য চাল, +3 বিট
  • রুক: অনুভূমিক / উল্লম্ব জন্য +1 বিট, লাইন বরাবর দূরত্বের জন্য +4 বিট।
  • কিং: 8 সম্ভাব্য চাল, +3 বিট। একটি 'অসম্ভব' পদক্ষেপের মাধ্যমে কাস্টলিংয়ের ইঙ্গিত দিন - যেহেতু কাসলিং কেবল তখনই সম্ভব যখন রাজা প্রথম পদে ছিলেন, তাই বাদশাকে 'পিছনের দিকে' - অর্থাৎ বোর্ডের বাইরে নিয়ে যাওয়ার নির্দেশ দিয়ে এই পদক্ষেপটি এনকোড করুন।
  • রানী: 8 সম্ভাব্য দিকনির্দেশ, + 3 বিট। লাইন / তির্যকটি দূরত্বের জন্য আরও +4 বিট (বিশপের ক্ষেত্রে যেমন তির্যকটি ছোট হয় তবে কম)

সমস্ত টুকরোগুলি বোর্ডে রয়েছে বলে ধরে নেওয়া, এগুলি চলন প্রতি বিটগুলি: বন্ধন - প্রথম চালনায় 6 টি বিট, পরে 5। পদোন্নতি হলে 7। বিশপ: 9 বিট (সর্বোচ্চ), নাইট: 7, রুক: 9, কিং: 7, কুইন: 11 (সর্বোচ্চ)


টুকরা চিহ্নিত করতে 32 বিট ??? আমি মনে করি আপনি 5 (32 টুকরা) বোঝাতে চেয়েছিলেন। বা 6 আপনার যদি একটি 'শেষ' অবস্থা এনকোড করা দরকার,
টড

একটি গিরিটি রোক, নাইট বা বিশপ হিসাবেও প্রচার করা যেতে পারে। অচলাবস্থা এড়াতে বা দ্বন্দ্ব এড়াতে এটি সাধারণ।
কোবি

এটি আপনার যুক্তিগুলিকে প্রভাবিত করে না, তবে একটি ছোট সংশোধন: একটি পদ্মায় চারটি পদক্ষেপ থাকতে পারে প্রচার সহ নয়, বা প্রচার সহ 12 টি চাল থাকতে পারে moves E2: e3, e4, exd3, exf3 এ পদ্মের উদাহরণ। উদাহরণস্বরূপ e7 এ পনিত: e8Q, e8N, e8R, e8B, exd8Q, exd8N, exd8R, exd8B, exf8Q, exf8N, exf8R, exf8B।
এ। রেক্স

হতে পারে আমি ভুল লিখছি, তবে কোনও প্যাঁচ এটি প্রথম পদক্ষেপে পাস করতে পারে না। আসলে আপনার কোনও বিশেষ "এন পাসেন্ট" স্বরলিপি প্রয়োজন নেই যেহেতু এটি গেমের নিয়মের মধ্যে রয়েছে - এটি কেবল একটি তির্যক পদক্ষেপ হবে। প্রথম পদক্ষেপটি 4 টি বিকল্পের মধ্যে একটি এবং পরবর্তী চলনগুলি 3 টি বিকল্প পর্যন্ত।
অসন্তুষ্ট গোয়াট

3

টিপিকাল দাবা গেমসের জন্য সবচেয়ে কার্যকর এমন কোনও এনকোডিং দেওয়ার ক্ষেত্রে কী সমস্যা বা সবচেয়ে সংক্ষিপ্ততম খারাপের এনকোডিং রয়েছে?

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

উপরের এনকোডিং চলার জন্য হেনক হলটারম্যানের পরামর্শে বর্ণিত হিসাবে আরও একটি ট্র্যাকটেবল সমাধান দেওয়ার জন্য গণনার ধারণাটি প্রয়োগ করা যেতে পারে। আমার পরামর্শ: ন্যূনতম নয়, তবে উপরে যে উদাহরণগুলি আমি দেখেছি তার চেয়ে ছোট এবং যুক্তিসঙ্গত ট্র্যাকটেবল:

  1. কোন স্কোয়ারগুলি দখল করা হয়েছে তা উপস্থাপনের জন্য 64৪ বিট (অধিগ্রহণের ম্যাট্রিক্স), এবং প্রতিটি দখলকৃত স্কোয়ারে কোন টুকরো রয়েছে তার তালিকা (পন্ডদের জন্য 3 বিট এবং অন্যান্য টুকরা 4 টি বিট থাকতে পারে): এটি শুরুর অবস্থানের জন্য 190 বিট দেয়। যেহেতু বোর্ডে 32 টির বেশি টুকরো থাকতে পারে না, তাই অধিগ্রহণের ম্যাট্রিক্সের এনকোডিং অপ্রয়োজনীয় এবং তাই সাধারণ বোর্ড পদের মতো কিছু এনকোড করা যায়, সাধারণ বোর্ডের তালিকা থেকে 33 সেট বিট প্লাসের সূচী হিসাবে বলুন।

  2. কে প্রথমে পদক্ষেপ নেয় তা বলার জন্য 1 বিট

  3. হেনকের পরামর্শ অনুসারে কোড মুভিগুলি: সাধারণত সাদা / কালো রঙের জুড়ি প্রতি 10 টি বিট, যদিও কোনও খেলোয়াড়ের বিকল্প চলাচল না করার পরে কিছু চাল 0 বিট নেবে।

এটি একটি টিপিকাল 30-মুভ গেম কোড করার জন্য 490 বিটগুলির পরামর্শ দেয় এবং এটি সাধারণত গেমগুলির জন্য যুক্তিসঙ্গতভাবে দক্ষ প্রতিনিধিত্ব হতে পারে।

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


ধরে নিন যে আমি গেমগুলির একটি বৃহত নির্বাচন করব এবং ফলাফলগুলি গড়ে তুলব।
অ্যান্ড্রু রোলিংস

3

বোর্ডের অবস্থানটি 7 বিটগুলিতে সংজ্ঞায়িত করা যায় (0-63, এবং 1 টি মান এটি নির্দিষ্ট করে যে এটি আর বোর্ডে নেই)। বোর্ডে প্রতিটি টুকরা জন্য এটি অবস্থিত যেখানে নির্দিষ্ট করুন।

32 টুকরা * 7 বিট = 224 বিট

সম্পাদনা: ক্যাড্রিয়ান যেমন উল্লেখ করেছেন ... আমাদের কাছে 'রানির কাছে পদোন্নতি' রয়েছে have আমি প্রস্তাব দিই যে কোন প্যাঁচকে প্রচার করা হয়েছে তা নির্দেশ করার জন্য আমরা শেষে অতিরিক্ত বিট যুক্ত করব।

সুতরাং প্রচারিত প্রতিটি প্যাঁচার জন্য আমরা 5 টি বিট সহ 224 বিট অনুসরণ করি যা প্রচারের জন্য সূচিত ইঙ্গিতটি নির্দেশ করে এবং 11111 যদি এটি তালিকাটির শেষ হয়।

সুতরাং সর্বনিম্ন কেস (কোনও প্রচার নেই) 224 বিট + 5 (কোনও প্রচার নেই)। প্রতিটি প্রচারিত পদ্দা জন্য 5 বিট যোগ করুন।

সম্পাদনা: কুঁচকানো ব্যাঙ যেমন উল্লেখ করেছে, কার পালাটি এটি কী তা বোঝাতে আমাদের শেষে আরও একটি বিট প্রয়োজন; ^)


এবং তারপরে ফলাফলটি জিপ করুন (যদি শিরোনামগুলি ফলাফলটি বাড়ায় না); ^)
টোড

কিছু বুকের নির্দিষ্ট রঙগুলিতে কিছু টুকরো কখনও পাওয়া যাবে না তা বিবেচনায় রেখে আপনি কী উন্নতি করতে পারবেন?
অ্যান্ড্রু রোলিংস

অ্যান্ড্রু: আসলে আমি পারছি না আমি রানী হিসাবে একটি প্রচারিত অর্থশক্তি গ্রহণ করা ভুলে গেছি (যেমন ক্যাড্রিয়ান এর উত্তর প্রস্তাব দেয়)। সুতরাং দেখে মনে হচ্ছে আমার আসলে আরও একটি অতিরিক্ত বিট দরকার
টড

আমি দেখতে পাচ্ছি কীভাবে কালো এবং সাদা বিশপগুলি একসাথে সংজ্ঞায়িত করা যায়। যদিও আমি নাইটদের সম্পর্কে অবাক হই ..
int3

4
আপনি রানীবিহীন পদোন্নতিগুলি হারিয়েছেন।
লরেন পেচটেল

2

আমি একটি রান দৈর্ঘ্যের এনকোডিং ব্যবহার করব। কিছু টুকরো অনন্য (বা কেবলমাত্র দু'বারের জন্য বিদ্যমান), তাই আমি তাদের পরে দৈর্ঘ্যটি বাদ দিতে পারি। ক্লিটাসের মতো, আমারও ১৩ টি অনন্য রাষ্ট্রের প্রয়োজন, তাই আমি টুকরোটি এনকোড করতে একটি নিবল (4 বিট) ব্যবহার করতে পারি। প্রাথমিক বোর্ডটি এর পরে দেখতে হবে:

White Rook, W. Knight, W. Bishop, W. Queen, W. King, W. Bishop, W. Knight, W. Rook,
W. Pawn, 8,
Empty, 16, Empty, 16
B. Pawn, 8,
B. Rook, B. Knight, B. Bishop, B. Queen, B. King, B. Bishop, B. Knight, B. Rook

যা আমাকে 8 + 2 + 4 + 2 + 8 নিম্বল = 24 নীবল = 96 বিট দিয়ে ফেলে leaves আমি একটি নিবলিল দিয়ে 16 টি এনকোড করতে পারি না তবে যেহেতু "খালি, 0" কোনও তাত্পর্যপূর্ণ নয়, তাই আমি "0" কে "16" হিসাবে বিবেচনা করতে পারি।

যদি বোর্ডটি খালি থাকে তবে উপরের বাম কোণে একটি একশো প্যাডের জন্য, আমি "পাউন, 1, খালি, 16, খালি, 16, খালি 16, খালি, 15" = 10 নীবলস = 40 বিট পাব।

সবচেয়ে খারাপ অবস্থাটি যখন আমার প্রতিটি টুকরোটির মধ্যে খালি স্কোয়ার থাকে। তবে টুকরোটির এনকোডিংয়ের জন্য আমার 16 টির মধ্যে 13 টির দরকার আছে, তাই আমি "খালি 1" বলতে অন্য একটি ব্যবহার করতে পারি। তারপরে, আমার 64 নিবলগুলি == 128 বিট দরকার।

গতিবিধির জন্য, টুকরাটির জন্য আমার 3 টি বিট দরকার (রঙটি সাদা রঙের দ্বারা সর্বদা প্রথম স্থানান্তরিত হয়) এর সাথে আরও 5 বিট (0..63) নতুন অবস্থানের জন্য = প্রতি বাইটে প্রতি বাইট। বেশিরভাগ সময়, আমার পুরানো অবস্থানের প্রয়োজন নেই কারণ কেবল একটি একক টুকরো সীমার মধ্যে থাকবে। বিজোড় ক্ষেত্রে, আমাকে অবশ্যই একক অব্যবহৃত কোড ব্যবহার করতে হবে (টুকরোটি এনকোড করার জন্য আমার কেবল codes কোড দরকার) এবং তারপরে পুরাতন জন্য 5 টি বিট এবং নতুন অবস্থানের জন্য 5 বিট।

এটি আমাকে 13 টি কামড়ায় কাস্টিংকে এনকোড করতে দেয় (আমি কিংকে রুকের দিকে নিয়ে যেতে পারি যা আমার উদ্দেশ্য বলতে কেবল যথেষ্ট)।

[সম্পাদনা] আপনি যদি স্মার্ট এনকোডারকে অনুমতি দেন তবে প্রাথমিক সেটআপের জন্য আমার 0 টি বিট প্রয়োজন (কারণ এটি কোনওভাবেই এনকোডিং করতে হবে না: এটি স্থির) এবং প্রতি চাল প্রতি এক বাইট।

[EDIT2] যা प्याকের রূপান্তরটি ছেড়ে দেয়। যদি কোনও মহিমা শেষ সারিতে পৌঁছে যায় তবে আমি এটি "ট্রান্সফর্মস" বলার জায়গায় স্থানান্তর করতে পারি এবং তারপরে যে টুকরোটি প্রতিস্থাপন করা হয় তার জন্য 3 টি বিট যুক্ত করতে পারি (আপনাকে কোনও রানী ব্যবহার করতে হবে না; আপনি প্যাঁচাকে যে কোনও কিছু দিয়ে প্রতিস্থাপন করতে পারেন) তবে কিং)


স্মার্ট এনকোডারটি ধরে নিতে পারে না যে এটি একটি সম্পূর্ণ খেলা। এটি কোনও গেমের খণ্ড হতে পারে। আমি মনে করি আপনার এখনও শুরুর অবস্থানগুলি এনকোড করা দরকার।
অ্যান্ড্রু রোলিংস

ঠিক আছে, সবচেয়ে খারাপ ক্ষেত্রে আমার কাছে হয় 128 বিট বা যদি গেমটি এখনও প্রাথমিক পর্যায়ে থাকে তবে আমি এটিকে শুরুতে = 120 বিটগুলিতে আনতে 15 টি পদক্ষেপ ব্যবহার করতে পারি।
অ্যারন ডিজুল্লা

যেহেতু যে কোনও রাষ্ট্র অবশ্যই এনকোড করা উচিত, এবং কেবলমাত্র প্রাথমিক বোর্ড রাজ্য নয়, আপনাকে নিজেই টুকরোগুলি এনকোড করতে হবে। সুতরাং আপনার প্রতি টুকরো কমপক্ষে 5 বিট লাগবে। সুতরাং এটি আপনাকে কমপক্ষে 32 * 5 বিট অতিরিক্ত দেবে
টড

@ রিনার: আপনি ভুল বলেছেন। আমার কেবল প্রতি টুকরো / খালি স্কোয়ারে চার বিট লাগবে। এবং আমি ইতিমধ্যে আমার উত্তরের প্রথম অংশে এটি আবৃত করেছি, সুতরাং কোনও "32 * 5 বিট অতিরিক্ত নয়"। প্রাথমিক অবস্থার জন্য আমার 96৯ বিট এবং অন্য যে কোনও প্রারম্ভিক অবস্থার জন্য আমার সর্বাধিক 128 বিট দরকার।
অ্যারন দিগুল্লা

হারুন: এখনও আপনি বলছেন যে এই এনকোডিংয়ের মধ্যে সবচেয়ে খারাপ পরিস্থিতি সত্যিই সবচেয়ে খারাপ। একটি স্টার্টবোর্ড থেকে 3 বা 4 সরানোর পরে, আপনার এনকোডিংয়ের জন্য আরও বেশি বিট লাগবে কারণ আপনি আরও এবং বেশি খালি যুক্ত করছেন
টড

2

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

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

কম্পিউটেশনাল নিউরোসায়েন্সে (এইআর) স্পাইক ট্রেনের জন্য অনুরূপ এনকোডিংগুলি ব্যবহৃত হয়।

ত্রুটিগুলি: আপনার বর্তমান অবস্থাটি পেতে পুরো খেলাটি পুনরায় খেলতে হবে এবং একটি উপসেট তৈরি করতে হবে, অনেকটা লিঙ্কযুক্ত তালিকায় যাওয়ার মতো।


এটি কেবল গেমের খণ্ড হতে পারে। আপনি হোয়াইট মুভস ফার্মগুলি ধরে নিতে পারবেন না।
অ্যান্ড্রু রোলিংস

2

সম্ভাব্য positions৪ টি পজিশন রয়েছে, সুতরাং আপনার প্রতি পজিশনে b বিট লাগবে। প্রাথমিকভাবে 32 টি টুকরো রয়েছে, সুতরাং এখন পর্যন্ত আমাদের মোট 192 টি বিট রয়েছে, যেখানে প্রতি 6 টি বিট প্রদত্ত টুকরোটির অবস্থান নির্দেশ করে। টুকরোগুলি যেভাবে প্রদর্শিত হবে তা আমরা প্রাক-নির্ধারণ করতে পারি, তাই কোনটি কোন তা আমাদের বলতে হবে না।

একটি টুকরা বোর্ডের বাইরে থাকলে কী হবে? ঠিক আছে, আমরা অন্য এক টুকরো হিসাবে একই জায়গাটিতে একটি টুকরো স্থাপন করতে পারি যে এটি বোর্ডের বাইরে রয়েছে, যেহেতু তা অন্যথায় অবৈধ হবে। তবে প্রথম টুকরো বোর্ডে থাকবে কিনা তাও আমরা জানি না। সুতরাং আমরা 5 টি বিট যুক্ত করি যা নির্দেশ করে যে কোন টুকরোটি প্রথমটি (32 টি সম্ভাবনা = 5 বিট প্রথম টুকরো উপস্থাপন করার জন্য)। তারপরে বোর্ডের বাইরে থাকা টুকরোগুলির জন্য আমরা সেই স্পটটি ব্যবহার করতে পারি। এটি আমাদের মোট 197 বিট এনে দেয়। বোর্ডে কমপক্ষে একটি টুকরো থাকতে হবে, যাতে এটি কার্যকর হবে।

তারপরে আমাদের পাল্টানোর জন্য একটি বিট প্রয়োজন - আমাদের 198 টি বিট এনে দেয় ।

মহিমা প্রচার সম্পর্কে কী? আমরা পদ্ম প্রতি 3 বিট যোগ করে 42 বিট যোগ করে এটি খারাপ উপায়ে করতে পারি। তবে তারপরে আমরা লক্ষ্য করতে পারি যে বেশিরভাগ সময় পশুর প্রচার হয় না।

সুতরাং, বোর্ডে থাকা প্রতিটি পদ্মের জন্য, বিট '0' ইঙ্গিত করে যে এটি প্রচারিত নয়। যদি কোনও মহিমা বোর্ডে না থাকে তবে আমাদের কিছুটা দরকার নেই। তারপরে আমরা পরিবর্তনশীল দৈর্ঘ্যের বিট স্ট্রিংগুলি ব্যবহার করতে পারি যার জন্য তার প্রচার রয়েছে। বেশিরভাগ ক্ষেত্রে এটি রানী হয়ে যায়, সুতরাং "10" এর অর্থ কোয়েন হতে পারে। তারপরে "১১০" এর অর্থ হুঙ্কার, "1110" অর্থ বিশপ এবং "1111" এর অর্থ নাইট।

প্রাথমিক অবস্থাটি 198 + 16 = 214 বিট নেবে , যেহেতু সমস্ত 16 টি প্যাঁস বোর্ডে রয়েছে এবং অপ্রত্যাশিত। দুটি প্রচারিত পদ্ম-রানী সহ একটি শেষ খেলাটি 1986 4 + 4 এর মতো কিছু নিতে পারে, যার অর্থ 4 টি পাঁজর জীবিত এবং প্রচারিত নয় এবং 2 রাণী পশুর, 206 বিটের জন্য মোট । বেশ শক্ত মনে হচ্ছে!

===

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

সুতরাং, প্রতিটি পৃথক অবস্থানের জন্য হাফম্যান এনকোডিং স্কিম তৈরি করুন। প্যাঁ সম্ভবত সম্ভবত 6 এর পরিবর্তে গড়ে 3-4 বিট নেবে রাজার পাশাপাশি কয়েকটি বিটও নেওয়া উচিত।

এছাড়াও এই স্কিমটিতে, সম্ভাব্য অবস্থান হিসাবে "নেওয়া" অন্তর্ভুক্ত করুন। এটি কাস্টিংকে খুব দৃly়রূপে পরিচালনা করতে পারে - প্রতিটি রুক এবং কিংয়ের একটি অতিরিক্ত "আসল অবস্থান, স্থানান্তরিত" অবস্থা থাকবে। আপনি এইভাবে प्याদগুলিতে এন পাস্ড এনকোড করতে পারেন - "আসল অবস্থান, এন পাসেন্ট"।

পর্যাপ্ত তথ্য সহ এই পদ্ধতির সত্যই ভাল ফলাফল পাওয়া উচিত।


4
বাদ দেওয়া টুকরোগুলি কেবল রাজার মতো একই স্কোয়ারে অর্পণ করুন। যেহেতু বাদশাহকে কখনই সরানো যায় না এটি অস্পষ্ট নয়
জন লা রুই

এটি একটি ভাল মন্তব্য :) এই সমাধানের খুব ভাল দিক। আমি বুঝতে পারি নি যে কোনও বিজয়ী বাছাই করা এত কঠিন হতে চলেছে।
অ্যান্ড্রু রোলিংস 23

2

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

সুতরাং আমার কাছে দুটি হাফম্যান টেবিল থাকবে - একটি টুকরো জন্য, অন্য স্কোয়ারের জন্য। আসল গেমটি দেখে এগুলি তৈরি করা হবে। আমি প্রতিটি টুকরা-বর্গক্ষেত্র জোড়া জন্য একটি বড় টেবিল থাকতে পারে, কিন্তু আমি মনে করি যে এটি বেশ অকার্যকর হবে কারণ একই টুকরা আবার একই স্কোয়ারে আবার চলার অনেকগুলি উদাহরণ নেই।

প্রতিটি টুকরোতে একটি নির্ধারিত আইডি থাকবে। যেহেতু 32 টি বিভিন্ন টুকরা রয়েছে তাই পিস আইডির জন্য আমার কেবল 5 বিট লাগবে। পিস আইডিগুলি গেম থেকে গেমে পরিবর্তন হচ্ছে না। স্কোয়ার আইডিগুলির ক্ষেত্রেও এটি একই রকম হয় যার জন্য আমার 6 টি বিট লাগবে।

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

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

গেমের শুরুতে একটি মহিমা প্রচার করা হয় এই সম্ভাবনার জন্য অ্যাকাউন্ট করতে হফম্যান গাছ এবং ডেটার মধ্যে একটি "প্রচারের টেবিল "ও থাকবে। প্রথমে 4 টি বিট থাকবে যা নির্দিষ্ট করে কত প্যাঁচকে আপগ্রেড করা হবে। তারপরে প্রতিটি পদ্মের জন্য এর হাফম্যান-এনকোডড আইডি এবং 2 টি বিট থাকবে যা তা কী হয়েছে তা উল্লেখ করে।

হাফম্যান গাছগুলি সমস্ত ডেটা (শুরুর অবস্থান এবং চলন উভয়) এবং প্রচার সারণী বিবেচনায় নিয়ে উত্পন্ন হবে। যদিও সাধারণত প্রচারের টেবিলটি খালি থাকবে বা মাত্র কয়েকটি এন্ট্রি থাকবে।

গ্রাফিকাল পদগুলিতে এটির যোগফল দিতে:

<Game> := <Pieces huffman tree> <squares huffman tree> <promotion table> <initial position> (<moves> | <1 bit for next move - see Added 2 below>)

<Pieces huffman tree> := <pieces entry 1> <pieces entry 2> ... <pieces entry N>
<pieces entry> := "0" | "1" <5 bits with piece ID>

<squares huffman tree> := <squares entry 1> <squares entry 2> ... <squares entry N>
<Squares entry> := "0" | "1" <6 bits with square ID>

<promotion table> := <4 bits with count of promotions> <promotion 1> <promotion 2> ... <promotion N>
<promotion> := <huffman-encoded piece ID> <2 bits with what it becomes>

<initial position> := <position entry 1> <position entry 2> ... <position entry N>
<moves> := <position entry 1> <position entry 2> ... <position entry N>
<position entry> := <huffman-encoded piece ID> <huffman-encoded squre ID> (<2 bits specifying the upgrade - optional>)

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

এটি তবে আসল রাষ্ট্রের প্রতিনিধিত্ব করতে অসুবিধা প্রকাশ করবে। একেকটি টুকরোটিকে তার জায়গায় রাখার জন্য একের পর এক ক্রম তৈরি করা যেতে পারে। এক্ষেত্রে প্রাথমিক অবস্থার শেষটি চিহ্নিত করা এবং চালগুলি শুরু করা প্রয়োজন।

বিকল্পভাবে সেগুলি সঙ্কুচিত 6-বিট স্কোয়ার আইডি ব্যবহার করে স্থাপন করা যেতে পারে।

এটি আকারে সামগ্রিক হ্রাস উপস্থাপন করবে কিনা - আমি জানি না। সম্ভবত, তবে কিছুটা পরীক্ষা করা উচিত।

যুক্ত 2: আরও একটি বিশেষ কেস। গেমের স্টেটে যদি কোনও নড়াচড়া না থাকে তবে কে কে এগিয়ে যায় তা আলাদা করা গুরুত্বপূর্ণ। তার জন্য আরও একটি বিট যোগ করুন। :)


2

[প্রশ্নটি সঠিকভাবে পড়ার পরে সম্পাদিত] আপনি যদি ধরে নেন যে প্রতিটি আইনী অবস্থান প্রাথমিক অবস্থান (যা "আইনী" এর একটি সম্ভাব্য সংজ্ঞা) থেকে পৌঁছতে পারে, তবে যে কোনও অবস্থান শুরু থেকেই চলার ক্রম হিসাবে প্রকাশ করা যেতে পারে। একটি মানহীন অবস্থান থেকে শুরু করে একটি ছোট ছোট স্নিপেট শুরুতে পৌঁছানোর জন্য প্রয়োজনীয় গতিগুলির ক্রম হিসাবে প্রকাশ করা যেতে পারে, পরবর্তী চালনাগুলির পরে ক্যামেরা চালু করতে একটি স্যুইচ হয়।

সুতরাং আসুন প্রাথমিক বোর্ডের রাজ্যটিকে একক বিট "0" বলি।

যে কোনও অবস্থানের চলাচলগুলি বর্গক্ষেত্রের সংখ্যা নির্ধারণ করে এবং প্রারম্ভিক 2 বর্গক্ষেত্রের জাল নির্দেশক কাস্টিংয়ের সাহায্যে (শুরু, শেষ) দ্বারা চালগুলি অর্ডার করে গণনা করা যেতে পারে। অবৈধ পদক্ষেপগুলি এনকোড করার দরকার নেই, কারণ বোর্ডের অবস্থান এবং নিয়মগুলি সর্বদা ज्ञात। ক্যামেরাটি চালু করার পতাকাটি হয় একটি বিশেষ ইন-ব্যান্ড মুভ হিসাবে প্রকাশিত হতে পারে, বা আরও সংবেদনশীলভাবে একটি ব্যাক-অফ-ব্যান্ড মুভ নম্বর হিসাবে প্রকাশ করা যেতে পারে।

উভয় পক্ষের জন্য 24 টি উদ্বোধনী পদক্ষেপ রয়েছে, যা প্রতিটি 5 টি বিটে ফিট করতে পারে। পরবর্তী পদক্ষেপগুলি আরও কম বা বিটের প্রয়োজন হতে পারে তবে আইনী পদক্ষেপগুলি সর্বদা গণনীয়, তাই প্রতিটি পদক্ষেপের প্রস্থ আনন্দের সাথে বাড়তে বা প্রসারিত করতে পারে। আমি গণনা করি নি, তবে আমি কল্পনা করেছি যে 7 বিট অবস্থান বিরল হবে।

এই সিস্টেমটি ব্যবহার করে, একটি 100 অর্ধ-মুভ গেমটি প্রায় 500 বিটগুলিতে এনকোড করা যায়। তবে, খোলার বইটি ব্যবহার করা বুদ্ধিমানের কাজ হতে পারে। ধরুন এটিতে মিলিয়ন অনুক্রম রয়েছে। তারপরে, প্রাথমিক 0 স্ট্যান্ডার্ড বোর্ড থেকে শুরু সূচিত করে এবং 1 টি 20 বিট সংখ্যার পরে সেই সূচনা ক্রম থেকে সূচনা নির্দেশ করে। কিছুটা প্রচলিত উদ্বোধন সহ গেমগুলি 20 হাফ-মুভ বা 100 বিট বলে সংক্ষিপ্ত করা যেতে পারে।

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

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


প্রাথমিক অবস্থান অগত্যা জানা যায়নি। এটি গেমের খণ্ড হতে পারে।
অ্যান্ড্রু রোলিংস

@ অ্যান্ড্রু: হ্যাঁ আমার ভুল. গেমের টুকরো টুকরো করার জন্য আমি সম্পাদনা করেছি।
ডগলাস বাগনল

2

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

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

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

প্রাথমিক অবস্থানটি সবচেয়ে শক্ত এবং প্রায় 250 মিলিয়ন সম্ভাব্য অবস্থান তৈরি করতে পারে (আমার মনে হয়) যার পদক্ষেপটি এটি নির্ধারণের জন্য প্রায় 28 বিট প্লাস অতিরিক্ত বিট লাগবে।

ধরে নিলাম আমরা জানি কে এই ঘুরিয়েছে (প্রতিটি মোড় সাদা থেকে কালোতে উল্টে যায়) ডিস্ট্রিমেন্টিক জেনারেটরটি দেখতে এমন কিছু দেখতে পাবেন:

for each row
    for each column
        add to list ( get list of possible moves( current piece, players turn) )

'সম্ভাব্য পদক্ষেপের তালিকা পান' এমন কিছু করবে:

if current piece is not null 
    if current piece color is the same as the players turn
        switch( current piece type )
            king - return list of possible king moves( current piece )
            queen - return list of possible queen moves( current piece )
            rook - return list of possible rook moves( current piece )
            etc.

রাজা যদি চেক করে থাকেন তবে প্রতিটি 'সম্ভাব্য এক্সএক্সএক্সএক্স মুভের তালিকা' কেবলমাত্র বৈধ পদক্ষেপগুলি ফিরিয়ে দেয় যা চেকের পরিস্থিতি পরিবর্তন করে।


এটি একটি ছদ্মবেশী সমাধান ... সুতরাং ... এই পরিস্থিতিতে ডিটারমিনিস্টিক সংখ্যা তৈরির জন্য আপনার অ্যালগরিদমটি বর্ণনা করুন।
অ্যান্ড্রু রোলিংস 23


2

উত্তরগুলির বেশিরভাগই 3 ভাঁজ পুনরাবৃত্তি উপেক্ষা করে। দুর্ভাগ্যক্রমে 3 ভাঁজ পুনরাবৃত্তির জন্য আপনাকে এখন পর্যন্ত খেলানো সমস্ত পজিশন সংরক্ষণ করতে হবে ...

প্রশ্নটি আমাদের স্থান দক্ষতার সাথে সংরক্ষণ করতে হবে যাতে আমরা যতক্ষণ না চালের তালিকা থেকে এটিকে নির্মাণ করতে পারি ততক্ষণ আমাদের অবস্থান সংরক্ষণের প্রয়োজন নেই (যদি আমাদের স্ট্যান্ডার্ড শুরুর অবস্থান থাকে)। আমরা পিজিএন অনুকূল করতে পারি এবং এটি শেষ হয়ে যায়। বেলো একটি সহজ পরিকল্পনা।

বোর্ডে squ৪ স্কোয়ার রয়েছে, =৪ = ২ ^ ^. আমরা যদি প্রতিটি পদক্ষেপের কেবল প্রাথমিক এবং চূড়ান্ত বর্গক্ষেত্র সংরক্ষণ করি যা 12 বিট নিতে পারে (প্রচার পরবর্তী সময়ে মোকাবেলা করা হবে)। নোট করুন যে এই স্কিমটি ইতিমধ্যে প্লেয়ারকে সরানো, জোর করে দেওয়া, টুকরো টুকরো টুকরো করা, কাস্টলিং ইত্যাদি অন্তর্ভুক্ত করে; এগুলি কেবল সরানো তালিকার পুনরায় খেলানো থেকে তৈরি করা যেতে পারে।

প্রচারের জন্য আমরা ভেক্টরগুলির একটি পৃথক অ্যারে রাখতে পারি যা বলে যে "ম্যাক এ এন পিচ এক্সওয়াইজেডে প্রচার করুন" would আমরা (ইনট, বাইট) এর ভেক্টর রাখতে পারি।

এটি ভেক্টরকেও (টু, ফোর) অপ্টিমাইজ করার লোভনীয়, যেহেতু এর মধ্যে অনেকগুলি (টু, ফোর) ভেক্টর দাবাতে উপযুক্ত নয়। যেমন E1 থেকে d8 ইত্যাদিতে কোনও পদক্ষেপ থাকবে না তবে আমি কোনও স্কিম নিয়ে আসতে পারিনি। পরবর্তী কোনও ধারণা সর্বাধিক স্বাগত জানায়।


2

আমি দীর্ঘদিন ধরে এটি সম্পর্কে চিন্তা করেছি (+ - 2 ঘন্টা)। এবং কোন সুস্পষ্ট উত্তর নেই।

ধরে নেওয়া:

  1. সময় স্থিতি উপেক্ষা করা (কোনও খেলোয়াড়ের সময়সীমা থাকার জন্য ব্যবহার করা হয়নি তাই না খেলে ড্রকে জোর করতে পারে)
  2. খেলা কবে খেলা হয়েছিল?!? এটি গুরুত্বপূর্ণ কারণ সময়ের সাথে সাথে নিয়মগুলি পরিবর্তিত হয়েছে (সুতরাং পরবর্তী সময়ে এটি একটি আধুনিক গেমটিকে আধুনিক গেম হিসাবে গ্রহণ করবে ...) দয়া করে উদাহরণস্বরূপ মৃত প্যাঁচার নিয়মটি দেখুন (উইকিপিডিয়ায় এটি দেখানো খুব বিখ্যাত সমস্যা রয়েছে), এবং আপনি যদি চান সময় ফিরে যেতে সৌভাগ্য বিশপ কেবল ধীরে ধীরে চলত এবং পাশা ব্যবহৃত হত। হাঃ হাঃ হাঃ.

... তাই আধুনিক নিয়ম এটি। পুনরাবৃত্তি এবং সরানো পুনরাবৃত্তি সীমা নির্বিশেষে প্রথমে।

-সি 25 বাইট বৃত্তাকার (64 বি + 32 * 4 বি + 5 বি = 325 বি)

= Its৪ বিট (কিছু / কিছুই নয়) + 32 * 4 বিট [1 বিট = রঙ {কালো / উইথ উদাহরণস্বরূপ, যদি এটি পূর্বের পালাটিতে সর্বশেষ স্থানান্তরিত পদ্দাটি নির্দেশ করে যে কোনও 'এন পাসেন্ট' সম্ভাব্য। ] + আসল অবস্থার জন্য 5 বিট (যার পালা, উত্তরণকারী, কাঁপানোর সম্ভাবনা বা প্রতিটি পক্ষেই নয়)

এ পর্যন্ত সব ঠিকই. সম্ভবত উন্নত করা যেতে পারে তবে বিবেচনায় নেওয়ার ক্ষেত্রে পরিবর্তনশীল দৈর্ঘ্য এবং প্রচার হতে পারে !?

এখন, নিম্নলিখিত নিয়মগুলি কেবলমাত্র তখনই প্রযোজ্য যখন কোনও খেলোয়াড় ড্রয়ের জন্য অ্যাপল করে, এটি স্বয়ংক্রিয় নয়! সুতরাং বিবেচনা করুন বা ক্যাপচার ছাড়াই এই 90 টি পদক্ষেপগুলি বিবেচনা করুন বা যদি কোনও প্লেয়ার ড্রয়ের জন্য কল না করে তবে এই প্যাভ করা চালানো সম্ভব! এর অর্থ যে সমস্ত পদক্ষেপগুলি রেকর্ড করা দরকার ... এবং উপলভ্য।

অবস্থানের পুনরাবৃত্তি ... যেমন উপরে বর্ণিত বোর্ডের রাজ্য (সি দেখুন) বা না ... (FIDE বিধি সম্পর্কে নিম্নলিখিত দেখুন) -আমি ক্যাপচার ছাড়াই 50 টি সরকারী ভাতার জটিল সমস্যাটি ছেড়ে দেয় সেখানে একটি কাউন্টার প্রয়োজন ... তবে।

তাহলে কীভাবে আপনি এটি মোকাবেলা করবেন? ... আসলেই উপায় নেই। কারণ কোনও খেলোয়াড়ই আঁকতে বা বুঝতে চায় না যে এটি ঘটেছে। এখন E এর ক্ষেত্রে কাউন্টার যথেষ্ট হতে পারে ... তবে এখানে কৌশল এবং এমনকি FIDE বিধিগুলি পড়তে হবে (http://www.fide.com/comp घटक/handbook/?id=124&view=article) আমি একটি খুঁজে পাই না উত্তর ... কাঁপানোর ক্ষমতা হ্রাস সম্পর্কে কি। এটা কি পুনরাবৃত্তি? আমি মনে করি না তবে তবে এটি একটি অস্পষ্ট বিষয় যা সম্বোধন করা হয়নি, স্পষ্ট করা হয়নি।

সুতরাং এখানে দুটি নিয়ম যা দুটি জটিল বা অপরিজ্ঞাত এমনকি এমনকি এনকোড করার চেষ্টা করার জন্য ... চিয়ার্স।

সুতরাং কোনও গেমটি সত্যই এনকোড করার একমাত্র উপায় হ'ল সমস্ত কিছু শুরু থেকে রেকর্ড করা ... যা "বোর্ডের রাজ্য" প্রশ্নের সাথে দ্বন্দ্ব (বা না?)।

আশা করি এই সহায়তার ... খুব বেশি গণিত নয় :-) কেবল দেখানোর জন্য যে কোনও প্রশ্ন সঠিক এবং কার্যকর হওয়ার জন্য ব্যাখ্যা বা প্রাক জ্ঞানের পক্ষে এতটা সহজ নয়, খুব সহজ নয়। আমি সাক্ষাত্কারের জন্য একটিরও বিবেচনা করব না কারণ এটি কৃমির একটি ক্যান খুব বেশি খোল।


2

ইয়াকবির সমাধানে প্রারম্ভিক অবস্থানের সম্ভাব্য উন্নতি

কোনও আইনি অবস্থানের প্রতিটি রঙের 16 টিরও বেশি টুকরো নেই। Black৪ স্কোয়ারে ১ black টি কালো এবং ১ white টি সাদা টুকরো রাখার উপায়গুলির সংখ্যা প্রায় 3.63e27। লগ 2 (3.63e27) = 91.55। এর অর্থ আপনি 92 বিটগুলিতে সমস্ত টুকরো অবস্থান এবং রঙ এনকোড করতে পারেন। এটি পজিশনের জন্য than৪ বিটের চেয়ে কম Y২ বিট অবধি রঙের জন্য যা ইয়াকবির সমাধান প্রয়োজন requires এনকোডিংয়ে যথেষ্ট জটিলতার ব্যয়ে আপনি সবচেয়ে খারাপ ক্ষেত্রে 4 টি বিট সংরক্ষণ করতে পারেন।

অন্যদিকে, এটি 5 বা ততোধিক টুকরো অনুপস্থিত সহ পজিশনের আকার বাড়িয়ে তোলে। এই অবস্থানগুলি সমস্ত অবস্থানের কেবলমাত্র <4% প্রতিনিধিত্ব করে তবে আপনি সম্ভবত এমন অবস্থাগুলির মধ্যে বেশিরভাগ ক্ষেত্রে যেখানে আপনি সূক্ষ্ম অবস্থানের চেয়ে আলাদা অবস্থান শুরু করতে চান।

এটি সম্পূর্ণ সমাধানের দিকে নিয়ে যায়

  1. উপরের পদ্ধতি অনুসারে টুকরোগুলির অবস্থান এবং বর্ণটি এনকোড করুন। 92 বিট
  2. প্রতিটি টুকরার ধরণ নির্দিষ্ট করতে, একটি হাফম্যান কোড ব্যবহার করুন: প্যাড: '0', রোক: '100', নাইট: '101', বিশপ: '110', রানী: '1110', কিং: '1111'। এটির জন্য (16 * 1 + 12 * 3 + 4 * 4) = টুকরাগুলির সম্পূর্ণ সেটের জন্য 68 বিট প্রয়োজন । পূর্ণ বোর্ড অবস্থানটি সর্বোচ্চ 92 + 68 = 160 বিটগুলিতে এনকোড করা যায় ।
  3. অতিরিক্ত গেমের রাজ্যের জোরে জোড় যুক্ত করা হবে: ঘুরুন: 1 বিট, যা castালাই সম্ভব: 4 বিট, "এন পাসেন্ট" সম্ভব: 4 বিট পর্যন্ত (1 বিট বলছে এটি কেস এবং 3 বিট কোনটি বলবে)। প্রারম্ভিক অবস্থানটি = 160 + 9 = 169 বিটগুলিতে এনকোড করা আছে
  4. পদক্ষেপের তালিকার জন্য, প্রদত্ত অবস্থার জন্য সমস্ত সম্ভাব্য চালগুলি গণনা করুন এবং সরানো অবস্থানের তালিকানুতে সংরক্ষণ করুন। পদক্ষেপের তালিকায় সমস্ত বিশেষ কেস (ক্যাসলিং, এন পাসেন্ট এবং পদত্যাগ করা) অন্তর্ভুক্ত রয়েছে। সর্বোচ্চ অবস্থান সংরক্ষণ করার জন্য প্রয়োজনীয় যতগুলি বিট প্রয়োজন কেবল ব্যবহার করুন। গড় হিসাবে এটি প্রতি চাল 7 বিট অতিক্রম করা উচিত নয় (16 টুকরো টুকরো এবং 8 টুকরো প্রতি আইন প্রতি সরানো 8) কিছু ক্ষেত্রে, যখন কোনও পদক্ষেপ জোর করা হয়, তার জন্য কেবল 1 বিট প্রয়োজন (পদক্ষেপ বা পদত্যাগ)।

1

বোর্ডে 32 টুকরা রয়েছে। প্রতিটি টুকরা একটি অবস্থান (64 স্কোয়ার এক)। সুতরাং আপনার কেবল 32 ধনাত্মক পূর্ণসংখ্যার প্রয়োজন।

আমি জানি 64৪ টি পজিশনে its বিট রয়েছে তবে আমি তা করব না। আমি কয়েকটি ফ্ল্যাগের জন্য শেষ বিটগুলি রাখব (টুকরো টুকরো, রানী পড়া)


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

হ্যাঁ, এটি হওয়া উচিত, যেহেতু আপনি মহিমাটির প্রারম্ভিক অবস্থানের দ্বারা বলতে পারবেন না যদি মহিরা প্রচারিত হয় বা না হয়! সুতরাং এটি প্রাথমিক সেটআপে এনকোড করা হিসাবে
টড

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

আমি মনে করি যদি কোনও মহিমা এখনও একটি মহিমা হয় বা রানির পদোন্নতি হয়ে যায় তবে বাকি খেলাগুলি খুব কমই অপ্রাসঙ্গিক। যদি আপনি এটি না ভাবেন, আমি আপনার সাথে দাবা খেলা খেলতে পছন্দ করব; ^)
টড

@ রেইনিয়ার: তিনি দাবি করছেন এটি অপ্রাসঙ্গিক যদি কোনও বর্তমান রানী মূলত রানী বা মূলত একটি মহিমা ছিল।
এ। রেক্স

1

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

আমি দাবা খেলোয়াড় নই, তবে আমি বিশ্বাস করি আরও একটি কর্নারের কেস রয়েছে: কতগুলি চালনার পুনরাবৃত্তি হয়েছে। প্রতিটি খেলোয়াড় একবার তিনবার একই পদক্ষেপ নিলে, খেলাটি একটি ড্র, না? যদি তা হয় তবে আপনার সেই তথ্যটি রাজ্যে সংরক্ষণ করা দরকার কারণ তৃতীয় পুনরাবৃত্তির পরে, রাষ্ট্রটি এখন টার্মিনাল।


এই পথে যেতে, আপনার উভয় খেলোয়াড়ের জন্য খেলে সময় যুক্ত করতে হবে যেহেতু বাস্তব দাবা খেলায় উভয় খেলোয়াড়ই কেবল 1 বা 2 ঘন্টা মোট ভাবেন।
তুষারপাত

4
আপনাকে প্রকৃত ডেটাতে নিয়মগুলি এনকোড করতে হবে না। আপনি ধরে নিতে পারেন যে এনকোডার নিজেই প্রয়োজনীয় কোনও নিয়ম জানে।
অ্যান্ড্রু রোলিংস

আহ .. আমি খেলার সময় বিবেচনা করি নি। শুভ কল ... :)
অ্যান্ড্রু রোলিংস

@ অ্যান্ড্রু রোলিংস: বিধিটি রাষ্ট্র-ভিত্তিক, যেমন রয়েছে, কোনও নির্দিষ্ট পূর্বশর্ত পূরণ হলেই এটি ট্রিগার হয়। পূর্বশর্তের সেই অবস্থার সন্ধান করা ... ... ভাল, রাষ্ট্রেরও একটি অংশ। :)
শেজি ফ্রগ

এই ক্ষেত্রে অপ্রাসঙ্গিক। প্রয়োজনে ডিকোডারটি বিজয়ী নির্ধারণের জন্য রাজ্যটি পরীক্ষা করতে পারে। মনে রাখবেন, এনকোডার / ডিকোডারটি বিধি-সচেতন। কেবলমাত্র যে জিনিসগুলিকে সত্যই এনকোড করা দরকার তা হ'ল প্লেয়ারের পছন্দ - অন্য কোনও কিছুই এনকোডার / ডিকোডার দ্বারা পরিচিত হতে পারে বলে ধরে নেওয়া যায়।
অ্যান্ড্রু রোলিংস

1

যেমনটি বেশ কয়েকজন উল্লেখ করেছেন যে আপনি যে 32 টি টুকরোগুলি সংরক্ষণ করতে পারবেন তার জন্য তারা যে স্কোয়ারে রয়েছে এবং যদি তারা বোর্ডে থাকে বা না থাকে তবে এটি 32 * (লগ 2 (64) + 1) = 224 বিট দেয়।

তবে বিশপগুলি কেবল কালো বা সাদা স্কোয়ারগুলিতেই দখল করতে পারে তাই এর জন্য আপনার কেবল পজিশনের জন্য লগ 2 (32) বিট দরকার, যা 28 * 7 + 4 * 6 = 220 বিট দেয়।

এবং যেহেতু प्याদগুলি পিছন থেকে শুরু হয় না এবং কেবল এগিয়ে যেতে পারে, সেগুলি কেবল 56-এ থাকতে পারে, পাণ্ডাদের জন্য প্রয়োজনীয় বিটের সংখ্যা হ্রাস করার জন্য এই সীমাবদ্ধতাটি ব্যবহার করা উচিত।


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

বিশপদের 6 টি বিট লগ 2 (32) + 1 = 6, তবে আপনি সমস্ত বিবরণ বিবেচনা করার সময় এটি নিশ্চিতভাবে জটিল প্রশ্ন :)
আন্দ্রেয়াস ব্রিন্ক

আমি এই লাইন বরাবর চিন্তা ছিল কিন্তু এটি কোন লাভ হয় না। থমাসের উত্তর দেখুন এবং খালি জায়গাগুলির ধারণাটি সরাতে তার হাফম্যান এনকোডিংটি সংশোধন করুন। আপনি ম্যাট্রিক্স সংরক্ষণ করতে occupied৪ বিট ব্যবহার করেন যার স্কোয়ারগুলি দখল করা হয় এবং আপনি প্রতিটি এনকোড থেকে ১ বিট সরিয়ে ফেলেন - এইভাবে একই 64৪ বিট পুনরুদ্ধার করে।
লরেন পেচটেল

1

একটি বোর্ডের squ৪ স্কোয়ার রয়েছে এবং square৪ বিট দ্বারা প্রতিনিধিত্ব করা যেতে পারে যেখানে স্কোয়ার ফাঁকা আছে কিনা তা দেখানো হচ্ছে। স্কোয়ারের টুকরো থাকলে আমাদের কেবল টুকরো তথ্য দরকার। যেহেতু প্লেয়ার + পিস 4 টি বিট নেয় (পূর্বে দেখানো হয়েছে) আমরা বর্তমান অবস্থা 64 + 4 * 32 = 192 বিটগুলিতে পেতে পারি। বর্তমান টার্নে নিক্ষেপ করুন এবং আপনার 193 বিট রয়েছে।

তবে, প্রতিটি টুকরোগুলির জন্য আইনী পদক্ষেপগুলি আমাদের এনকোড করা দরকার। প্রথমত, আমরা প্রতিটি টুকরোটির জন্য আইনী পদক্ষেপের সংখ্যা গণনা করি এবং একটি সম্পূর্ণ বর্গক্ষেত্রের শিরোনামের পরে অনেকগুলি বিট যুক্ত করি। আমি নিম্নলিখিত হিসাবে গণনা করেছি:

ভাঙা: ফরোয়ার্ড, প্রথমে দুটি ফরোয়ার্ড করুন, পাসেন্ট * 2, প্রচার = 7 বিট। আপনি প্রথম টার্ন ফরওয়ার্ড এবং প্রচারকে একত্রে সংযুক্ত করতে পারেন যেহেতু তারা একই অবস্থান থেকে ঘটতে পারে না, সুতরাং আপনার কাছে 6. রুক: 7 উল্লম্ব স্কোয়ার, 7 অনুভূমিক স্কোয়ার = 14 বিট নাইট: 8 স্কোয়ার = 8 বিট বিশপ: 2 ত্রিভুজ * 7 = 14 বিট কুইন: 7 উল্লম্ব, 7 অনুভূমিক, 7 তির্যক, 7 তির্যক = 28 বিট কিং: 8 পার্শ্ববর্তী স্কোয়ার

এর অর্থ এখনও আপনার বর্তমান অবস্থানের উপর ভিত্তি করে লক্ষ্যবস্তু বানাতে ম্যাপ করা দরকার তবে এটি (সাধারণ হওয়া উচিত) একটি সাধারণ গণনা।

যেহেতু আমাদের কাছে 16 টি পাঁঠা, 4 জন রুকস / নাইট / বিশপ এবং 2 রানী / কিং রয়েছে তাই এটি 16 * 6 + 4 * 14 + 4 * 8 + 4 * 14 + 2 * 28 + 2 * 8 = 312 আরও বিট নিয়ে আসছে মোট 505 বিট মোট।

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

দীর্ঘ গল্পের সংক্ষিপ্তসার: যখন কোনও বর্গক্ষেত্র দখল করা হয় তখন কেবল অতিরিক্ত ডেটা (টুকরো ইত্যাদি) সঞ্চয় করুন এবং প্রতিটি টুকরোটির আইনী পদক্ষেপের প্রতিনিধিত্ব করার জন্য কেবল সর্বনিম্ন বিট সংরক্ষণ করুন।

EDIT1: কোনও টুকরোতে কাস্টলিং এবং মহিমা প্রচার সম্পর্কে ভুলে গেছেন। এটি 557 পদক্ষেপে স্পষ্ট অবস্থানের সাথে মোটটি আনতে পারে (পদ্মফুলের জন্য আরও 3 বিট, রাজাদের জন্য 2)


1

প্রতিটি টুকরা 4 টি বিট (বাদাম থেকে বাদাম, 6 ধরণের), কালো / সাদা = 12 মান দ্বারা প্রতিনিধিত্ব করা যেতে পারে

বোর্ডের প্রতিটি বর্গক্ষেত্রকে 6 টি বিট (এক্স কর্ড, ওয়াই কর্ড) দ্বারা প্রতিনিধিত্ব করা যায়।

প্রাথমিক অবস্থানগুলিতে সর্বাধিক 320 বিট প্রয়োজন (32 টুকরা, 4 + 6 বিট)

প্রতিটি পরবর্তী পদক্ষেপ 16 বিট (অবস্থান থেকে, অবস্থান থেকে টুকরা) দ্বারা প্রতিনিধিত্ব করা যেতে পারে।

কাস্টিংয়ের জন্য অতিরিক্ত 16 বিট লাগবে, কারণ এটি দ্বৈত পদক্ষেপ।

কুইনড পাউন্ডগুলি 4 বিটের মধ্যে 4 অতিরিক্ত মানগুলির মধ্যে একটি দ্বারা প্রতিনিধিত্ব করা যেতে পারে।

বিশদে গণিত না করে, এটি 32 * 7 বিট (পূর্বনির্ধারিত টুকরো টুকরো) বা 64 * 4 বিট (স্কোয়ারগুলির পূর্বনির্ধারিত অ্যাসাইনমেন্ট) সংরক্ষণের তুলনায় প্রথম পদক্ষেপের পরে স্থান সংরক্ষণ করা শুরু করে

উভয় পক্ষের 10 টি পদক্ষেপের পরে, সর্বাধিক প্রয়োজনীয় স্থানটি 640 বিট

... তবে আবার আমরা যদি প্রতিটি টুকরোটিকে স্বতন্ত্রভাবে চিহ্নিত করি (5 বিট) এবং রানী প্যাঁচাগুলি পতাকাঙ্কণের জন্য একটি ষষ্ঠ বিট যুক্ত করি, তবে আমাদের প্রতিটি পদক্ষেপের জন্য কেবল টুকরো-আইডি + টু-পজিশনের প্রয়োজন। এটি গণনা পরিবর্তন করে ...

প্রাথমিক অবস্থান = সর্বোচ্চ 384 বিট (32 টুকরা, 6 + 6 বিট) প্রতিটি পদক্ষেপ = 12 বিট (টু-পজিশনে, টুকরো-আইডি)

তারপরে প্রতিটি দিকে 10 টি চালানোর পরে সর্বাধিক স্থানের প্রয়োজন 624 বিট


দ্বিতীয় বিকল্পটিতে অতিরিক্ত সুবিধা রয়েছে যে স্টোরেজটি 12 বিট রেকর্ড, প্রতিটি রেকর্ড = অবস্থান এবং টুকরো হিসাবে পড়া যায়। প্রথম চাল পদক্ষেপটি টুকরোটির আগে প্রবেশের বিষয়টি সনাক্ত করে।
স্টিভ ডি কক্স

চলার মধ্যবর্তী সময়ের জন্য, প্রতিটি রেকর্ডে কাউন্টারের জন্য এক্স বিট যুক্ত করুন। সেটআপ রেকর্ডগুলির জন্য, এটি 0 তে সেট করা হবে
স্টিভ ডি কক্স

এই পদ্ধতির আমি লিখতে যাচ্ছি। একটি অপ্টিমাইজেশন হ'ল স্ট্যান্ডার্ড গেমসের জন্য, আপনাকে প্রাথমিক অবস্থানগুলি মোটেও এনকোড করার দরকার নেই - "এটি একটি স্ট্যান্ডার্ড গেম" বলে মাথার একক বিট যথেষ্ট। এছাড়াও, কাস্টলিং একটি দ্বৈত পদক্ষেপ গ্রহণ করে না - যেহেতু একটি ক্যাসলিং পদক্ষেপ সর্বদা সুস্পষ্ট থাকে এবং কোনও প্রদত্ত রাজা যখন কাস্টিংয়ের অর্ধেক সময় উপস্থিত হয় তখন নড়াচড়ার জন্য কেবল একটি বৈধ উপায় রয়েছে it's প্রচারের জন্য, নতুন পিসের আকারটি হয়ে যায় তা নির্দিষ্ট করার জন্য আপনি কোনও পদ্দা শেষ সারিটিতে চলে যাওয়ার পরে 4 টি বিট ব্যবহার করতে পারেন।
কিরিউ

সুতরাং, একটি সাধারণ গেমের জন্য, 10 পদক্ষেপের পরে আপনি কোনও পদোন্নতি অনুমান করে 121 বিট এ থাকবেন। অ্যাটিপিকাল গেমগুলির জন্য পতাকা, টুকরোগুলি * 10 বিট এবং 1 প্লেয়ারের জন্য প্রথম খেলোয়াড়কে নির্দেশ করতে অন্য বিট লাগবে। এছাড়াও, প্রতিটি পদক্ষেপের জন্য কেবল 12 বিট লাগবে, কারণ প্রদত্ত বর্গক্ষেত্রের টুকরোটি গেমের আগের চালগুলি থেকে অন্তর্ভুক্ত। এটি সম্ভবত প্রস্তাবিত কয়েকটি পদ্ধতির চেয়ে কম দক্ষ তবে এটি বেশ পরিষ্কার এবং "স্ট্যান্ডার্ড" গেমগুলির জন্য যুক্তিসঙ্গতভাবে দক্ষ।
কিরিউ

@ কাইরো - আমি নিশ্চিত নই যে চলন প্রতি 12 টি বিট মারতে পারে - স্ট্যান্ডার্ড সেটআপের জন্য আপনার নাল সম্পর্কে ধারণাটি ব্যবহার করে (আমি এখনও বিন শূন্যে 12 টি বিট ব্যবহার করব) - প্রতিটি পাশের 1000 পদক্ষেপের পরে এটি 24012 বিট ওরফে 3002 বাইট (বৃত্তাকার) এমনকি আপনার অভিধানটি হার্ড-কোডেড (বা যুক্তিযুক্তভাবে উদ্বেগযোগ্য, একই জিনিস) ঘোষণার মাধ্যমে আপনাকে কিছুটা ধাক্কা দিতে হবে এমন সংকোচনের কোনও রূপ ব্যবহার করে
স্টিভ ডি কক্স

1

রবার্ট জি-এর মতো আমিও পিজিএন ব্যবহারের প্রবণতা থাকি কারণ এটি স্ট্যান্ডার্ড এবং বিস্তৃত সরঞ্জাম দ্বারা ব্যবহার করা যেতে পারে।

তবে, আমি যদি একটি দাবা এআই খেলছি যা একটি দূরবর্তী স্থানের তদন্তে রয়েছে, এবং এইভাবে প্রতিটি বিট মূল্যবান হয় তবে আমি এই পদক্ষেপগুলির জন্য যা করব। আমি পরে প্রাথমিক অবস্থায় এনকোডিং করতে আসব।

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

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

নিম্নলিখিত সারণিতে লাইন বরাবর বর্গাকার সংখ্যা নির্ধারণ করে আমরা বেশিরভাগ টুকরোগুলির গন্তব্যটিকে এনকোড করেছি: ডাব্লু, এনডাব্লু, এন, এনই (কৃষ্ণ দিকটি এন)। বর্গক্ষেত্রের প্রদত্ত দিকটিতে সরে যাওয়ার জন্য একটি লাইন শুরু হয় যা সরানোর জন্য আইনী এবং এর দিকে এগিয়ে যায়। অবিচ্ছিন্ন রাজার জন্য, চালগুলির তালিকাটি হ'ল ডাব্লু, ই, এনডাব্লু, এসই, এন, এস, এনই, এসডাব্লু। নাইটের জন্য, আমরা 2W1N দিয়ে শুরু করি এবং ঘড়ির কাঁটার দিকে এগিয়ে যাই; গন্তব্য 0 এই ক্রমের প্রথম বৈধ গন্তব্য।

  • পাউন্ডস: একটি অব্যক্ত প্যাঁচে গন্তব্যগুলির 2 টি পছন্দ রয়েছে, সুতরাং এটির জন্য 1 বিট প্রয়োজন। যদি কোনও গিরি অন্যটিকে ক্যাপচার করতে পারে তবে তা সাধারণত বা এন পাসেন্ট (যা ডিকোডারটি নির্ধারণ করতে পারে, যেহেতু এটি রাষ্ট্রের উপর নজর রাখছে), এতে চালনার 2 বা 3 টি পছন্দও রয়েছে। ব্যতীত, একটি প্যাডে কেবল 1 টি পছন্দ থাকতে পারে, কোনও বিটের প্রয়োজন নেই। যখন কোনও মহিমা তার th তম র‌্যাঙ্কে থাকে, আমরা প্রচারের পছন্দটিও গ্রহণ করি। যেহেতু সাধারনত রাণীতে সাধারণত প্রচার হয় এবং নাইটরা অনুসরণ করে, আমরা পছন্দগুলি এনকোড করে থাকি:
    • রানী: 0
    • নাইট: 10
    • বিশপ: 110
    • রোক: 111
  • বিশপ: সর্বাধিক 13 টি গন্তব্য যখন 4 বিটের জন্য {d, e most, 4,5। হয়।
  • রুক: সর্বাধিক 14 গন্তব্য, 4 বিট।
  • নাইটস: সর্বাধিক 8 টি গন্তব্য, 3 বিট।
  • কিং: কাস্টলিং যখন বিকল্প হয়, রাজা এটি আবার এস তে ফিরে আসে এবং নীচের দিকে যেতে পারে না; এটি মোট 7 টি গন্তব্য দেয়। বাকি সময়টিতে, একজন রাজা সর্বাধিক 8 টি বিট দিয়ে মোট 8 টি চালান চালান।
  • রানী: বিশপ বা রুকের জন্য পছন্দ মতো, মোট 27 টি পছন্দ, যা 5 বিট

যেহেতু পছন্দগুলির সংখ্যাটি সর্বদা দু'জনের শক্তি নয়, উপরের এখনও বিটগুলি নষ্ট করে। ধরুন, পছন্দগুলির সংখ্যা সি এবং নির্দিষ্ট পছন্দটি সি , এবং এন = সিল (এলজি ( সি )) এর (পছন্দটি এনকোড করার জন্য প্রয়োজনীয় বিটের সংখ্যা) is আমরা পরের পছন্দটির প্রথম বিট পরীক্ষা করে অন্যথায় নষ্ট হওয়া মানগুলি ব্যবহার করি। যদি এটি 0 হয় তবে কিছুই করবেন না। যদি 1 এবং এর + + সি <2 এন , তারপর যোগ সি থেকে । একটি সংখ্যার ডিকোডিং এর বিপরীত হয়: যদি প্রাপ্ত সি > = সি হয় তবে সি বিয়োগ করুন এবং পরের সংখ্যাটির জন্য প্রথম বিটটি 1 এ সেট করুন যদি <<2n - C , তারপরে পরবর্তী সংখ্যাটির জন্য প্রথম বিটটি 0 এ সেট করুন If যদি 2 এন - সি <= সি < সি হয় , তবে কিছুই করবেন না। এই স্কিমটিকে "স্যাচুরেশন" বলুন।

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

স্যাচুরেশন সহ, ক্যাপচার-এনকোডিং সম্ভবত কোনও সুবিধা বহন করে না। আমরা উভয় বিকল্পের জন্য অনুমতি দিতে পারি, ব্যবহৃত হয় প্রাথমিক অবস্থায় নির্দিষ্ট করে। যদি স্যাচুরেশন ব্যবহার না করা হয় তবে গেমের সময় বিকল্পগুলি পরিবর্তন করতে গেমের এনকোডিং অব্যবহৃত পছন্দ নম্বর ( সি <= সি <2 এন ) ব্যবহার করতে পারে। যে কোনও সময় সি দুটি পাওয়ার, আমরা বিকল্পগুলি পরিবর্তন করতে পারি নি।


1

বোর্ডের এনকোডিংয়ের জন্য থমাসের সঠিক পন্থা রয়েছে। তবে এটি স্ট্রোক স্টোরেজগুলির জন্য রালুর পদ্ধতির সাথে একত্রিত হওয়া উচিত। সমস্ত সম্ভাব্য পদক্ষেপের একটি তালিকা তৈরি করুন, এই সংখ্যাটি প্রকাশ করার জন্য প্রয়োজনীয় বিটের সংখ্যাটি লিখুন। যেহেতু ডিকোডার একই গণনা করছে এটি কতটা সম্ভব তা জানে এবং কত বিট পড়তে হবে তা জানতে পারে, কোনও দৈর্ঘ্যের কোডের প্রয়োজন হয় না।

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

চলাচলে সাধারণত 5 বা 6 টি বিট লাগবে তবে 1 থেকে 8 পর্যন্ত পরিবর্তিত হতে পারে।

একটি অতিরিক্ত শর্টকাট - যদি এনকোডটি 12 1 বিট দিয়ে শুরু হয় (একটি অবৈধ পরিস্থিতি - এমনকি একটি খণ্ডেও একদিকে দুটি রাজা থাকবে না) আপনি ডিকোডটি বাতিল করেন, বোর্ডটি মুছুন এবং একটি নতুন গেম সেট আপ করুন। পরের বিটটি একটি মুভি বিট হবে।


1

অ্যালগরিদমের প্রতিটি পদক্ষেপে নির্ধারিতভাবে সমস্ত সম্ভাব্য গন্তব্য গণনা করা উচিত। গন্তব্য সংখ্যা:

  • 2 বিশপ, প্রত্যেকে 13 টি গন্তব্য = 26
  • 2 টি রুকস, প্রতিটি 14 টি গন্তব্য = 28
  • 2 নাইট, 8 টি গন্তব্য প্রতিটি = 16
  • রানী, ২ dest টি গন্তব্য
  • রাজা, 8 গন্তব্য

8 পাজরা সকলেই সবচেয়ে খারাপ (গণনা অনুযায়ী) ক্ষেত্রে কুইন হয়ে উঠতে পারে, ফলে এটি সম্ভাব্য গন্তব্যগুলির সর্বাধিক সংখ্যা তৈরি করে 9 * 27 + 26 + 28 + 16 + 8 = 321। সুতরাং, যে কোনও পদক্ষেপের জন্য সমস্ত গন্তব্যগুলি 9 বিট সংখ্যা দ্বারা গণনা করা যেতে পারে।

উভয় পক্ষের সর্বাধিক সংখ্যা 100 (যদি আমি ভুল না হয় তবে দাবা খেলোয়াড় নয়) is সুতরাং যে কোনও খেলা 900 বিট রেকর্ড করা যেতে পারে। প্লাস প্রাথমিক অবস্থান প্রতিটি টুকরা bit বিট সংখ্যা ব্যবহার করে রেকর্ড করা যায়, যা মোট পরিমাণে 32 * 6 = 192 বিট। "কে প্রথমে চলে যায়" রেকর্ডের জন্য প্লাস ওয়ান বিট। সুতরাং, যে কোনও গেমটি 900 + 192 + 1 = 1093 বিট ব্যবহার করে রেকর্ড করা যায়।


1

বোর্ডের রাজ্য সংরক্ষণ করা হচ্ছে

আমি যে সহজ উপায়টি ভেবেছিলাম তা হ'ল প্রথম টুকরোটির অবস্থানের প্রতিনিধিত্বকারী 8 * 8 বিটগুলির অ্যারে রয়েছে (সুতরাং সেখানে যদি দাবা টুকরা থাকে তবে 1 না থাকলে 0)। এটি একটি নির্দিষ্ট দৈর্ঘ্য হিসাবে আমাদের কোনও টার্মিনেটর প্রয়োজন নেই।

এরপরে প্রতিটি দাবা অংশকে তার অবস্থান অনুসারে প্রতিনিধিত্ব করুন। প্রতি বিট 4 বিট ব্যবহার করে, এটি 32 * 4 বিট নেয় (মোট 128)। যা সত্যিই অপব্যয়।

একটি বাইনারি গাছ ব্যবহার করে, আমরা এক বাইটে একটি গিরির প্রতিনিধিত্ব করতে পারি, একটি নাইট এবং রুক এবং বিশপ 3 এবং একটি রাজা এবং রানী 4 in যেমন (এটি ভুল হলে আমাকে ক্ষমা করুন, আমি এর আগে কোনও বিবরণ দিয়ে হাফম্যানের কোডিংয়ের দিকে কখনও দেখিনি):

  • বন্ধন: 2
  • রুক: 4
  • নাইট: 4
  • বিশপ: 4
  • রাজা: 5
  • রানী: 5

মোট দেওয়া:

2*16 + 4*4 + 4*4 + 4*4 + 2*5 + 2*5 = 100

28 বিট দ্বারা বিটের একটি নির্দিষ্ট আকারের সেট ব্যবহার করে কোনটি মারধর করে।

সুতরাং আমি সবচেয়ে ভাল পদ্ধতিটি খুঁজে পেয়েছি এটি একটি 8 2 + 100 বিট অ্যারেতে সঞ্চয় করা

8*8 + 100 = 164



স্টোর মুভ
প্রথমে আমাদের জানা দরকার যেটি কোন টুকরোটি কোথায় চলছে। বোর্ডে সর্বাধিক 32 টুকরা রয়েছে এবং আমরা জানি যে প্রতিটি টুকরা কী, বর্গের প্রতিনিধিত্বকারী একটি পূর্ণসংখ্যার চেয়ে আমাদের টুকরা অফসেটের প্রতিনিধিত্বকারী একটি পূর্ণসংখ্যার থাকতে পারে, যার অর্থ আমাদের কেবলমাত্র 32 টি সম্ভাব্য মানগুলি উপস্থাপন করতে হবে টুকরা.

দুর্ভাগ্যক্রমে বিভিন্ন বিশেষ বিধি রয়েছে, যেমন রাজাকে কাস্টলিং বা উত্সাহিত করা এবং প্রজাতন্ত্র (টেরি প্র্যাচেট রেফারেন্স) গঠন করা, সুতরাং টুকরোগুলি সরিয়ে রাখার আগে আমাদের একটি বিট প্রয়োজন যা এটি একটি বিশেষ পদক্ষেপ কিনা তা নির্দেশ করে।

সুতরাং প্রতিটি সাধারণ পদক্ষেপের জন্য আমাদের একটি প্রয়োজনীয় 1 + 5 = 6বিট রয়েছে। (1 বিট টাইপ, টুকরা জন্য 5 বিট)

টুকরো নম্বরটি ডিকোড করার পরে, আমরা তখন টুকরার প্রকারটি জানি এবং প্রতিটি টুকরোটি সবচেয়ে কার্যকর উপায়ে তার চলন উপস্থাপন করে। উদাহরণস্বরূপ (যদি আমার দাবাড়ির নিয়মগুলি স্ক্র্যাচ করা অবধি থাকে) একটি প্যাকেটে মোট ৪ টি সম্ভাব্য পদক্ষেপ থাকে (বামে ধরুন, ডানদিকে ধরুন, একটিকে এগিয়ে যান, দুটি এগিয়ে যান)।
সুতরাং একটি জঞ্জাল পদক্ষেপের প্রতিনিধিত্ব করতে আমাদের '6 + 2 = 8' বিট দরকার। (প্রাথমিক পদক্ষেপের শিরোনামের জন্য 6 বিট, কী সরানোয় 2 বিট)

রানীর পক্ষে চলা আরও জটিল হবে, যার মধ্যে প্রতিটি দিকের দিকে যাওয়ার জন্য একটি দিক (8 সম্ভাব্য দিকনির্দেশ, সুতরাং 3 বিট) এবং মোট 8 সম্ভাব্য স্কোয়ার (তবে আরও 3 বিট) রাখা ভাল best সুতরাং একটি রানিকে স্থানান্তরিত করার জন্য এটি 6 + 3 + 3 = 12বিটগুলির প্রয়োজন হবে ।

আমার সাথে সর্বশেষ যে ঘটনাটি ঘটে তা হ'ল আমাদের কোন খেলোয়াড় ঘুরিয়ে দেওয়া উচিত তা সংরক্ষণ করা উচিত। এটি একক বিট হওয়া উচিত (পরে যাওয়ার জন্য সাদা বা কালো)



ফলস্বরূপ ফর্ম্যাট
তাই ফাইল ফর্ম্যাটটি দেখতে এরকম কিছু দেখাচ্ছে

[B৪ বিট] প্রাথমিক পিসের অবস্থানগুলি
[১০০ বিট সর্বাধিক] প্রাথমিক টুকরা [১ বিট] প্লেয়ার টার্ন
[এন বিট] নড়াচড়া

যেখানে একটি সরান
[1 বিট] সরানোর ধরণ (বিশেষ বা সাধারণ)
[n বিট] সরানো বিশদ

যদি সরানো একটি সাধারণ পদক্ষেপ হয় তবে সরানো বিশদটি
[5 বিট] টুকরা
[এন বিট] নির্দিষ্ট টুকরা মুভ (সাধারণত 2 থেকে 6 বিটের মধ্যে থাকে] এর মতো কিছু দেখায় ]

যদি এটি একটি বিশেষ পদক্ষেপ হয়
তবে এর একটি পূর্ণসংখ্যার প্রকার এবং তারপরে কোনও অতিরিক্ত তথ্য থাকা উচিত (যেমন এটি কাস্টিংয়ের মতো হয়)। আমি বিশেষ পদক্ষেপের সংখ্যা মনে করতে পারি না, সুতরাং এটি নির্দিষ্ট পদক্ষেপ বলে ইঙ্গিত করা ঠিক হবে (যদি কেবলমাত্র একটি থাকে)


1

প্রাথমিক বোর্ডের সাথে পরবর্তী পদক্ষেপের বেস ক্ষেত্রে, নিম্নলিখিতটি বিবেচনা করুন।

সম্ভাব্য সমস্ত পদক্ষেপে সম্ভাব্যতা নির্ধারণের জন্য একটি দাবা প্রোগ্রাম ব্যবহার করুন। উদাহরণস্বরূপ, e2-e4 এর জন্য 40% d2-d4 এর জন্য 20% এবং আরও অনেক কিছু। যদি কিছু পদক্ষেপ বৈধ হয় তবে সেই প্রোগ্রামটি বিবেচনা না করে তবে তাদের কিছুটা কম সম্ভাবনা দিন। কোন পছন্দটি নেওয়া হয়েছিল তা সংরক্ষণ করতে পাটিগণিত কোডিং ব্যবহার করুন, যা প্রথম পদক্ষেপের জন্য 0 এবং 0.4 এর মধ্যে কিছু নম্বর হবে, দ্বিতীয়টির জন্য 0.4 এবং 0.6 এবং আরও কিছু।

অন্য দিকে একই কাজ করুন। উদাহরণস্বরূপ, যদি e2-e4 এর প্রতিক্রিয়া হিসাবে e7-e5 এর 50% সম্ভাবনা থাকে তবে এনকোডড নম্বরটি 0 এবং 0.2 এর মধ্যে হবে। গেমটি শেষ না হওয়া পর্যন্ত পুনরাবৃত্তি করুন। ফলাফলটি একটি সম্ভাব্য খুব ছোট পরিসীমা। ক্ষুদ্রতম বেসের সাথে বাইনারি ভগ্নাংশটি সন্ধান করুন যা এই ব্যাপ্তিতে ফিট করে। এটি গাণিতিক কোডিং।

এটি হাফম্যানের চেয়ে ভাল কারণ এটি ভগ্নাংশ বিট এনকোডিং হিসাবে ভাবা যেতে পারে (প্লাস কিছু শেষে পুরোটা কিছুটা গোল করার জন্য)।

ফলাফলটি হাফম্যানের চেয়ে আরও কমপ্যাক্ট হওয়া উচিত, এবং পদোন্নতি, পাস, 50 টি বিধি পদক্ষেপ এবং অন্যান্য বিবরণের জন্য বিশেষ কোনও মামলা নেই কারণ তারা দাবা মূল্যায়ন প্রোগ্রাম দ্বারা পরিচালিত হয়।

পুনরায় খেলতে, আবার বোর্ডের মূল্যায়ন করতে দাবার প্রোগ্রামটি ব্যবহার করুন এবং প্রতিটি পদক্ষেপে সমস্ত সম্ভাব্যতা নির্ধারণ করুন। আসলে কোন পদক্ষেপটি খেলা হয়েছিল তা নির্ধারণ করতে পাটিগণিতের এনকোডযুক্ত মানটি ব্যবহার করুন। সম্পন্ন না হওয়া পর্যন্ত পুনরাবৃত্তি করুন।

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

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

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