ক্ষুদ্রতম দাবা বোর্ড সংক্ষেপণ


39

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

এনকোডিং অবশ্যই দেখাতে সক্ষম হবে:

  • যার পালা।
  • প্লেয়ার প্রতিটি পক্ষেই ক্যাসল করতে পারে কিনা।
  • খেলোয়াড় কোনও এন-পাসেন্ট পারফর্ম করতে পারে কিনা এবং যদি তা হয় তবে তাদের কোন মণি বন্ধক রয়েছে?
  • সমস্ত টুকরা অবস্থান।

কাস্টিংয়ের বিষয়ে গুরুত্বপূর্ণ দ্রষ্টব্য: যদি সাদা তাদের বাদশাহকে এক বার করে এবং তারপরে এটি আবার সরিয়ে দেয় তবে এটি অবশ্যই স্পষ্ট হবে যে তারা এর পরে উভয় দিকে ক্যাসল করতে পারবে না। তারা যদি তাদের বাম বা ডানদিকের স্থানটি সরিয়ে ফেলতে পারে তবে একই অবস্থা হবে। বোর্ড দুটি দৃষ্টিভঙ্গির আগের মতো একই অবস্থানে থাকলেও গেমের অবস্থা পরিবর্তন হয়েছে। এখানে আরও তথ্য: http://en.wikedia.org/wiki/Chess#Castling

এন-পাসেন্ট সম্পর্কে গুরুত্বপূর্ণ নোট: এটিও একটি পালা সংবেদনশীল পদক্ষেপ। আরও তথ্যের জন্য নিয়ম পড়ুন। http://en.wikipedia.org/wiki/Chess#En_passant

প্রয়োজন অনুসারে ইনপুট এবং আউটপুট নির্ধারণ করুন। যে কেউ এটিকে সবচেয়ে সংকুচিত করতে পারে তার কাছে মেজর প্রপস!

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


"বিটওয়াইজ" বলতে কী বোঝ?
পিটার টেলর

এটি কি সবচেয়ে ক্ষুদ্রতম কোড বা সর্বাধিক সঙ্কুচিত? সর্বাধিক সঙ্কুচিত আরও আকর্ষণীয় is
জাস্টিন

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


1
@ আজেমানসফিল্ড, এটি প্রায় ২৮ জন পুরুষের বোর্ড সহ কার্যকর হতে পারে তবে আমি গণনা করি যে ৩২ জন পুরুষের বোর্ডের জন্য ১১7 বিট প্রচুর, যা লক্ষ্যমাত্রার চেয়ে প্রায় ৫০ বিট কম। জটিলতাটি হ'ল একবার আপনি 32 জন পুরুষের নীচে চলে গেলে প্রচার কোনও খেলোয়াড়কে আরও বিশপ দিতে পারে।
পিটার টেলর

উত্তর:


27

সর্বনিম্ন: 12 বিট
সর্বাধিক:
গড়:

গতরাতে এবং ভেবেছিলাম যে আমি সম্ভবত এটি আরও ছোট করে তুলতে পারি।

x   Colour to play next (0 -> Black, 1-> White)
1   Only King left?

00000 Position of White King (0 -> A1 ... 63 -> H8)
00000 Position of Black King

01 00000 11111  WK:A1, BK:H2 (Black to play)
11 00000 11111  WK:A1, BK:H2 (White to play)

ফলাফলটি 12 বিটের একটি চিত্তাকর্ষক আকার !

সুতরাং কে +1 অন্যান্য ধরণের টুকরা সম্পর্কে কি?

x
 0
   0
     000  +Pawn
     001  +Rook   
     010  +Knight
     011  +Bishop
     100  +Queen

উপ গাছের 2 সম্ভাব্য ব্যবস্থা রয়েছে।

   /\      /\
  +  K    K  +

উভয়ই সমস্ত বিট আকারের জন্য একই বিট আকারের ফলাফল। সুতরাং এটি ব্যবহার করে আমরা কোনটিই পার্থক্য করব না, আমি প্রথমটি বেছে নেব।

x
 0
  0
   000
      1011001110000000000000000000000000000000000000000000000000000000000000
(+ 000) En-Passant (if >= 2 pawn & pawn in en-passant positions)
(+ 00 ) Castlings  (if >= 1 rook)
Min: 75 bit
Max: 109 bits

সুতরাং কিং +2 অন্যান্য টুকরা টাইপ

x
 0
  1
   PRBNQ
   00011  +N +Q
   00101  +B +Q
   00110  +B +N
   01001  +R +Q
   01010  +R +N
   01100  +R +B
   10001  +P +Q
   10010  +P +N
   10100  +P +B
   11000  +P +R

এখানে 5 টি সাব সাব গাছ রয়েছে (আমি কোন টুকরোটি নির্দেশ করতে 1 এবং 2 ব্যবহার করব)

   /\          /\       /\         /\          /\
  /  \        /  \     /  \       /  \        /  \
 K   /\      /\   2   /\   \     1   /\      /\   \
    1  2    K  1     K  2   1       K  2    1  2   K

সুতরাং কোন উপ ট্রিটি ব্যবহার করতে হবে তা এনকোড করতে আমাদের 3 বিট লাগবে।

x
 0
  1
   PRBNQ
         000  Sub Tree used

Min:= 11 = Header 
       6 = 2 * 3
       4 = 1 * 4
       4 = 1 * 4
      60 = 60    Empty
      --
      85 bits

Max:=  11 = Header
        4 =  2 * 4 Kings
       48 = 16 * 3 Pawns
       12 =  4 * 3 Rook
       42 = 42 * 1 Empty
        3 =  1 * 3 En-Passant
        2 =  1 * 2 Castlings
      ---
      122 bits

এখনও আরও টুকরো জন্য বিশ্লেষণ করছেন

+3 অন্যান্য

x
 0
  1
   PRBNQ
         0000  Sub Tree used (of 14 possible)

+4 অন্যান্য

x
 0
  1
   PRBNQ
         000000  Sub Tree used (of 42 possible)

+5 অন্যান্য

x
 0
  1
   PRBNQ
         0000000  Sub Tree used (of 132 possible)
 (+000)
 (+00)

সর্বোচ্চ: 208?


এই সমস্ত উপ-গাছগুলিকে 9 বিটের মধ্যে এনকোড করা সম্ভব?

যদি আমরা সম্ভাব্য সাব-ট্রিগুলিতে মোট সংগ্রহ করি তবে আমরা 392 টি সাব-ট্রি পেয়েছি।

 1  0
 2  2
 3  5
 4  14
 5  42
 6  132
    ---
    392  <= 2^9

ফ্রিক আইডি ব্যবহার করা হচ্ছে

যেহেতু 164603 অনন্য পিস ফ্রিকোয়েন্সি

Log2( 164603) = 17.3286110452
             ~ 18 bits

0
 0000 0000 0000 0000 00  Freq ID

(+000) (+00) কাস্টিং

সর্বাধিক: = 204 বিট


রেভ 3

ন্যূনতম: 82 সর্বাধিক: 199 গড়: 160

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

               0   Player
              00  Castling
               0  En-Passant Possible
            ?000  En-Passant column (include if En-Passant Possible = 1
  0000 0000 0000  Tree Encoding ID
[Board Encoding]  Between 66 .. 180 bits 

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

এছাড়াও বোর্ডের আকারের জন্য কেবলমাত্র 144 টি বিভিন্ন আকার (সবচেয়ে খারাপ কেস) রয়েছে।


75 - 216 বিট (v2) ভি 1 সর্বনিম্ন আকার 98 বিট (12.25 বাইট), বোর্ডে কেবলমাত্র দুটি রাজা।

সর্বাধিক আকারটি কেবলমাত্র 216 বিট (27 বাইট) অদৃশ্যভাবে:

  9 x Queens
  1 x King
  2 x Rooks
  2 x Knights
  2 x Bishops
on each side.

গড়ে আকারটি প্রায় 157 বিট (19.625 বাইট) হবে।

টুকরা

বোর্ডটি এনকোড করতে আমি বাইনারি ট্রি এনকোডিং স্কিম ব্যবহার করছি। খালি স্কোয়ারটি 32 থেকে 62 এর মধ্যে উপস্থিতিগুলির মধ্যে সবচেয়ে ঘন ঘন। এরপরে পাগা, তারপরে রুকস, নাইটস, বিশপস এবং সবচেয়ে কম ঘন ঘন কুইন এবং কিং King

0 - left node
1 - righ node

     /\
    e  \    e:= Empty Square
      B/\W  B:= Black ; W:= White
      /  \
     /    \
    /      \
   /\      /\
  p  \    p  \  p:= Pawn
     /\      /\
    /  \    /  \
   /\  /\  /\  /\
  r  b n \ r b n \  r:= Rook; b:= Bishop; n:= Knight
         /\      /\ 
        q  k    q  k  q:= Queen ; k:= King

প্রারম্ভিক বোর্ডটি কেবল 166 বিট (20.75 বাইট) এ এনকোড করা যাবে

  A     B     C      D      E     F     G     H
-----+-----+-----+------+------+-----+-----+------+
10100 10101 10110 101110 101111 10110 10101 10100 | 8 
  100   100   100    100    100   100   100   100 | 7
    0     0     0      0      0     0     0     0 | 6
    0     0     0      0      0     0     0     0 | 5
    0     0     0      0      0     0     0     0 | 4
    0     0     0      0      0     0     0     0 | 3
  110   110   110    110    110   110   110   110 | 2
11100 11101 11110 111110 111111 11110 11101 11100 | 1

কাদের পদক্ষেপটি নির্দেশ করতে এটি কেবলমাত্র একক বিট নেয়

0-> Black , 1-> White

কাস্টলিং 4 বিট মধ্যে এনকোড করা যেতে পারে।

 B  W
LR LR
00 00

সুতরাং আমি 171 বিট (21.375 বাইট) ব্যবহার করেছি

এন-পাসকে কেবল 16 বিটে এনকোড করা যায় (2 বাইট)

সুতরাং মোট thats 187 বিট (23.375 বাইট)।

বিন্যাস

  bits    Encodes
 0 -  15  En-Passe
16 -  19  Castling
      20  Move 
21 -  23  Unused
24 -> ..  Board

এখনও কোন কোড লেখা হয়নি।

লক্ষ্য করুন যে 3 টি বিট অব্যবহৃত রয়েছে। সুতরাং সর্বোচ্চ 213bits হয়


সম্ভাব্য উন্নতি

1) হেডার ব্লক ফর্মটি 24 থেকে 8 বিট হ্রাস করেছে (@ পিটার টেলারের পরামর্শ সহ)

0 - 2 En-Passant
    3 Move
4 - 7 Castling
8 ... Board Pieces 

2) পরিবর্তনশীল দৈর্ঘ্যের শিরোনাম

একটি ছোট 4 বিট স্থির হেডার

0 0 0 0
| | | |
| | | +-> En-Passant Block Present?
| | | 
| | +---> Pawns on board?
| |
| +-----> Castling still possible?
|                
+-------> Who's move? 0-Black 
                      1-White

অতিরিক্ত বিটের পরবর্তী ব্লক (যদি কাস্টিং এখনও সম্ভব হয়)

00 00
|| ||
|| |+-> White Castle Right
|| +--> White Castle Left
||
|+----> Black Castle Right
+-----> Black Castle Left

অতিরিক্ত বিটগুলির পরবর্তী ব্লক (যদি মন্ত্রীরা উপস্থিত থাকে)

000--> En-Passant column Position

সুতরাং এখন আমি একটি পরিবর্তনশীল দৈর্ঘ্যের শিরোনাম 4 - 11 বিট আছে


৩) বোর্ডে কী টুকরো রয়েছে তার উপর নির্ভর করে একটি আলাদা এনকোডিং স্কিম ব্যবহার করুন।

বোর্ডে কী টুকরা রয়েছে তার উপর নির্ভর করে গাছের এনকোডিং পরিবর্তন করে এবং সেখানে ফ্রিকোয়েন্সি।

শেষ গেমের রাজ্যের জন্য সম্ভাব্য একটি এনকোডিং (কোনও পাঁসনা)

        /\            
       e /\           
  Black /  \ White
       /    \
      /      \
     /        \       
    /\        /\
   /  \      /  \     
  /   /\    /   /\
 /\  / /\  /\  / /\   
r b n q k  r b n q k

যা প্রতি টুকরো সম্পর্কে প্রায় 4 ডলার বিট।

বোর্ডে কোন ধরণের টুকরো উপস্থিত রয়েছে?

RBNQK Permutation
11111 (11111)

পারমুটেশনটি পরিবর্তনশীল দৈর্ঘ্যের 0-5 বিট হয়। যদি কেবল এক প্রকারের টুকরোটি থাকে তবে এটি অন্তর্ভুক্ত করবেন না।

গাছের জন্য এই টুকরোগুলির কোন অনুচ্ছেদ? এটি উপরের উদাহরণে টুকরো সংখ্যার ফ্যাক্টরিয়াল এটি 5 টুকরা তাই 120 সম্ভাব্য ক্রম যা এনকোড করা যেতে পারে।

 #    !  bit 
 6  720  10  (If pawn included)
 5  120   6
 4   24   5
 3    6   3
 2    2   1  Don't include as of equal size.
 1    1   0  Don't include as its not needed.

মনে রাখবেন যে খালি স্কোয়ার এবং রঙের জন্য অতিরিক্ত বিট রয়েছে।


উদাহরণ

কেবল কিউকে বামে একটি উদাহরণ দিন

RBNKQ
00011

  /\
 s  \
    /\
  B/  \W
  /\  /\
q  k q  k

101 100  0 x 60 110 111 ==> 60 + (2 x 6) = 60 + 12 = 72 bits for the board

0000 00011 Header ==> 9 bits

মোট 81 বিট


আসুন দেওয়া যাক এবং কেবল বাদশাহাদের উদাহরণ বাকী

 RBNQK
 00001 

  /\
 s  k
   / \
  B   W

 10 0 0 0 0 0 0 0   K... ....
  0 0 0 0 0 0 0 0   .... ....
  0 0 0 0 0 0 0 0   .... ....
  0 0 0 0 0 0 0 0   .... ....
  0 0 0 0 0 0 0 0   .... ....
  0 0 0 0 0 0 0 0   .... ....
  0 0 0 0 0 0 0 0   .... ....
  0 0 0 0 0 0 0 11  .... ...k

সব একসাথে রাখুন

 header  4   0 0 0 0
 pieces  5   0 0 0 0 1
 perm    0   - - - - - -
  board 66   10 0 0 0 0 0 0 0
              0 0 0 0 0 0 0 0
              0 0 0 0 0 0 0 0
              0 0 0 0 0 0 0 0
              0 0 0 0 0 0 0 0
              0 0 0 0 0 0 0 0
              0 0 0 0 0 0 0 0
              0 0 0 0 0 0 0 11

সুতরাং আমি বোর্ডের জন্য ক্ষুদ্রতম এনকোডিংটি 75 বিটগুলিতে গণনা করি (9 বিট 3 বিট)

এখনও এই কোডিং স্কিমটি সর্বোচ্চ আকারকে কীভাবে প্রভাবিত করে তা গণনা করতে পারেনি।


উন্নতি 4

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

 0 Castling possible (from header block)
 LR 
 00

এটি সম্পর্কে চিন্তাভাবনা করে, হেডার ব্লকের ভিতরে 2 বিট অন্তর্ভুক্ত করা আরও ভাল।


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

কেন গাফতারা গাছের মধ্যে আরও ভাল অবস্থান পায়? সাধারণ ক্ষেত্রে এগুলি সর্বাধিক সাধারণ তবে চরম ক্ষেত্রে আর / বি / এন 10 বার উপস্থিত হতে পারে।
ugoren

@ পিটারটেলর, প্রকৃতপক্ষে পাসের জন্য 3 টি বিটই যথেষ্ট। যদি আপনি কেবল কালো 5 ম র‌্যাঙ্কের প্যাকেটের (সাদা পদক্ষেপ ধরে) নিয়ে কলামগুলি গণনা করেন তবে 8 টি অবৈধ হয়ে যায়।
ugoren

1
মনে রাখবেন যে আপনার সবচেয়ে খারাপ পরিস্থিতি আসলে সম্ভব নয়। ক্যাপচার ব্যতীত প্রচার অসম্ভব (কমপক্ষে 2 প্রতি প্রচারের জন্য একটি ক্যাপচারের প্রয়োজন)।
ugoren

2
Positions৪ টি অবস্থানের এনকোড করার জন্য নোট (সাদা বা কালো রাজার জন্য) আপনার 6 বিট (২ ** = = )৪) দরকার।
ল্যাম্ব্রস্কো এসিডো

17

192 বিট (সবচেয়ে খারাপ ক্ষেত্রে)

এখানে একটি খুব সাধারণ স্টোরেজ স্কিম যা স্বেচ্ছাসেবী পদ্ম প্রচারগুলির সাথে লড়াই করা উচিত এবং এর জন্য কখনও কখনও 64 + 4 4 32 = 192 বিটের বেশি প্রয়োজন হয় না:

  • প্রথম 64 বিট একটি দোকান bitboard বলে যে যেখানে টুকরা (কিন্তু নয় কি তারা)। এটি হল, আমরা দাবাবোর্ডের প্রতিটি বর্গক্ষেত্রের জন্য এক বিট সঞ্চয় করি (বর্গ a1 থেকে শুরু করে বি 1, সি 1 ইত্যাদি ইত্যাদি বর্গ h8 পর্যন্ত) যেমন একটি শূন্য বর্গক্ষেত্র 0 এবং একটি দখলকৃত স্কোয়ার 1 দ্বারা প্রতিনিধিত্ব করা হয়।

  • এরপরে, বিটবোর্ডে দখলকৃত হিসাবে চিহ্নিত প্রতিটি স্কোয়ারের জন্য, আমরা সেই স্কোয়ারে টুকরোটি এনকোডিং করে একটি 4-বিট নিবিল সঞ্চয় করি। চারটি বিটের প্রথমটি টুকরোটির রঙ এনকোড করে (0 = সাদা, 1 = কালো), যখন বাকী তিনটি বিট টুকরো টাইপের এনকোড করে:

    +-----+-----+-----+-----+
    |Black|   Piece Type    |
    +-----+-----+-----+-----+
       4     3     2     1    Bits
    

    টুকরো টাইপ

    0 = (সাধারণ) পদ্ম
    1 = (সাধারণ) রোক
    2 = নাইট
    3 = বিশপ
    4 = কুইন
    5 = কিং (খেলোয়াড়ের পরের দিকে যেতে)
    6 = কিং (অন্য খেলোয়াড়ের)

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

    Black Type Description
    +----+----+--------------------------------+
    |  0 | 5  | White King; White to move next |
    +----+----+--------------------------------+
    |  0 | 6  | White King                     |
    +----+----+--------------------------------+
    |  1 | 5  | Black King; Black to move next |
    +----+----+--------------------------------+
    |  1 | 6  | Black King                     |
    +----+----+--------------------------------+
    

    প্রবেশকারী এবং কাস্টলিং বিধিমালার জন্য প্রয়োজনীয় অতিরিক্ত তথ্য এনকোড করতে আমরা একটি অতিরিক্ত টুকরো প্রকারের সাথে পরিচয় করিয়ে দিই, যা প্রদর্শিত হয় তার সারিটির উপর নির্ভর করে একটি প্যাঁচ বা রোক বোঝায়:

    ((সারি ১ ​​এবং ৮) = একটি রোক যা কখনও সরেনি, এবং যার রাজাও কখনও সরেনি, এবং তাই
    এটি 7 (4 এবং 5 সারিগুলিতে) কাস্টিংয়ের জন্য যোগ্য is = একটি মহিমানা যা কেবল দুটি স্কোয়ারকে উন্নত করেছে, এবং অতএব পাসেন্ট en বন্দী হতে পারে

সবগুলোকে একত্রে রাখ:

     Hex Description
    +---+---------------------------------------------+
    | 0 | White Pawn (normal)                         |
    | 1 | White Rook (has moved)                      |
    | 2 | White Knight                                |
    | 3 | White Bishop                                |
    | 4 | White Queen                                 |
    | 5 | White King; White to move next              |
    | 6 | White King                                  |
    | 7 | White Rook (pre castle) / Pawn (en Passant) |
    | 8 | Black Pawn (normal)                         |
    | 9 | Black Rook (has moved)                      |
    | A | Black Knight                                |
    | B | Black Bishop                                |
    | C | Black Queen                                 |
    | D | Black King; Black to move next              |
    | E | Black King                                  |
    | F | Black Rook (pre castle) / Pawn (en Passant) |
    +---+---------------------------------------------+

বোর্ডের রাজ্যে এনকোড করার জন্য প্রয়োজনীয় বিটের মোট সংখ্যা তাই বোর্ডে থাকা টুকরোগুলির 64 + 4। #। যেহেতু বোর্ডে কখনই 32 টির বেশি টুকরো থাকতে পারে না, তাই এই এনকোডিংয়ের সর্বোচ্চ দৈর্ঘ্য 192 বিট।

উদাহরণস্বরূপ, উপরে বর্ণিত এনকোডিংটি ব্যবহার করে বোর্ডের প্রাথমিক অবস্থা এনকোড করা হবে (পঠনযোগ্যতার জন্য সাদা স্থান):

1111 1111 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111
0111 0010 0011 0100 0101 0011 0010 0111 0000 0000 0000 0000 0000 0000 0000 0000
1000 1000 1000 1000 1000 1000 1000 1000 1111 1010 1011 1100 1110 1011 1010 1111

বা, হেক্সাডেসিমালে:

FFFF 0000 0000 FFFF 7234 5327 0000 0000 8888 8888 FABC EBAF

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

আপনি বিটবোর্ডের জন্য কেবলমাত্র 63 টি বিট সংরক্ষণ করে এবং এনকোড করা পুরুষদের সংখ্যা থেকে শেষ বিটটি অনুমান করে যুক্তিসঙ্গতভাবে কিছুটা সংরক্ষণ করতে পারেন। (এটি প্রতারণা করছে কিনা তা আমার কাছে পরিষ্কার নয় কারণ এর জন্য বিট ক্রমের দৈর্ঘ্যের বাহ্যিক এনকোডিং প্রয়োজন)। এবং যদি আপনি পুরুষদের জন্য 6 এবং 7 টি রাজ্য খনন করেন তবে আপনাকে 6 ^ 32 পর্যন্ত এনকোড করতে হবে, যা 82.7 বিট লাগে; 83 83 অবধি গোল করে এটি b এবং states স্টেট ব্যবহার করে 13 বিট সাশ্রয় করছে এবং আপনি একই তথ্যটি কেবল 8 বিটে এনকোড করতে পারেন।
পিটার টেলর

ধন্যবাদ, @ ফায়ারফ্লাই! আমি আপনার পরামর্শ বাস্তবায়ন করেছি। (পিটার টেলরের পরামর্শ অবশ্যই আরও বেশি দক্ষ, তবে আমি এখন পর্যন্ত এটি ব্যবহার করি নি কারণ আমি বর্তমান স্কিমের সাধারণ বাইনারি এনকোডিংয়ের মতো। আপনি এটি সর্বদা পৃথক এন্ট্রি হিসাবে জমা দিতে পারেন ...)
ইলমারি করোনেন

ঠিক আছে - এটি হালকা জটিল। তবে আমার কথা শুনুন। আপনি শুধুমাত্র একটি পালা নির্দেশকের ওপর 1 বিট হিট নিতে থাকে, তাহলে আপনি প্রতিস্থাপন করতে পারে পালা সঙ্গে রাজা এক টুকরা আমি কলের pawn1 সঙ্গে। প্যাডকে প্যাডে0 এ পরিবর্তন করুন। এখন, যখনই কোনও (প্যাসেন্ট অরক্ষিত নয়) মণ রয়েছে - আপনি পরবর্তী অংশে একটি বিট তথ্যও অর্জন করতে পারেন (হয় শ্যাওলা 0 এর জন্য একটি 0 বা প্যাড 1 এর জন্য 1)। যেহেতু 16 প্যাঁ রয়েছে, আপনি মোড় সূচকটির জন্য 16 টি বিট কম পান gain যখনই কোনও অনুগমন ঘটে যা পাসের পক্ষে ঝুঁকিপূর্ণ তখন আপনাকে তার পরে কিছুটা পিছনে যোগ করতে হবে। তবে পাসের অবশ্যই অবিলম্বে ঘটতে হবে, আপনার ন্যূনতম লাভগুলি 14 বিট।
ব্যবহারকারী5957401

আপনি বিশপের মতো কিছু দিয়েও একই জিনিস করতে পারেন। মনে করুন যে আপনার কোনও বিশপ তার একটি 'বিশেষ জোন'-এ নয় (এর কোণে 10 টি দাগ এবং এর পাশের সারি সারি) বিশেষ হিসাবে চিহ্নিত হয়েছে। কারণ আপনি এর অবস্থান জানেন - আপনি এটি একটি বিশপ জানেন। এখন আপনার কাছে দুটি বিশপ রয়েছে এবং তাদের প্রত্যেককে পরের অংশে 0 বা 1 দিতে পারে। এটি আরও 4 টি বিট দেয় - তবে সবচেয়ে খারাপ ক্ষেত্রে সমস্ত বিশেষ অঞ্চলগুলিতে বিশপ রয়েছে, এবং কোনও লাভ নেই।
ব্যবহারকারী5957401

14

160 বিট সবচেয়ে খারাপ ক্ষেত্রে

আমার আগের উত্তরটি 22 বাইট পোস্ট করার পরে, আমি ভাবতে শুরু করি যে আমরা 21 বাইটে নামতে পারি কিনা। যাইহোক যখন আমি পিটার টেলারের আশ্চর্যজনক 166 বাইট দেখেছি আমি ভেবেছিলাম "হ্যাং কর, মনে হচ্ছে পাঁচটি 32-বিট শব্দ সম্ভব হতে পারে!"

সুতরাং অনেক চিন্তাভাবনার পরে, আমি এগুলি নিয়ে এলাম: 159.91936391 বাইট (একটি বেশ আঁটসাঁট ফিট!) এই স্তরের সংকোচনটির জন্য মোটামুটি জটিল প্রোগ্রামের প্রয়োজন হবে তবে আমি কীভাবে এটি যুক্তিসঙ্গত সময়ে চালিত করব সে সম্পর্কে চিন্তাভাবনা করেছি।

এটি একটি দীর্ঘ পোস্ট হতে চলেছে, তাই দয়া করে আমার সহ্য করুন, আমি আজ যা করতে পারি তা পোস্ট করব এবং শীঘ্রই কয়েকটি কোডের বিট যুক্ত করব।

সুতরাং, এটি কীভাবে করবেন তা এখানে:

এন পাসেন্ট এবং কাস্টিং অবৈধ অবস্থানের দ্বারা এনকোডেড (0 বিট)

এন পাসেন্ট

অন্যান্য উত্তরে যেমন উল্লেখ করা হয়েছে, সেখানে সর্বোচ্চ ৫ টি সম্ভাব্য স্কোয়ার রয়েছে যার উপর পাসের পক্ষে ঝুঁকির মতো ঝাঁকুনি দাঁড়িয়ে থাকতে পারে। এই প্লেয়ারের পাউন্ডের পাশের স্কোয়ারগুলি যার পালা।

এটিকে এনকোড করার জন্য, প্রবেশকারীদের কাছে ঝুঁকির মতো প্রথম এবং শেষ সারিতে যে কোনও একটি স্কোয়ারের সাথে যা আছে তা দিয়ে বিনিময় করা হয়। এটি হয় কোনও মানুষ বা খালি স্কোয়ার হতে পারে। এটি একটি অবৈধ অবস্থান তৈরি করে, কারণ प्याগুলি এই সারিগুলিতে থাকতে পারে না। ডিকোডারকে অবশ্যই তুষারকে তার সঠিক অবস্থানে ফিরিয়ে আনতে হবে, প্রবেশকারীদের তথ্য বের করতে হবে।

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

Castling

যে রাজা দুর্গে প্রবেশের অনুমতিপ্রাপ্ত তার সংজ্ঞা অনুসারে এখনও তার প্রাথমিক স্কোয়ারে রয়েছে। শ্বেত রাজা তার প্রাথমিক স্কোয়ারে মোট 63৩ টি স্কোয়ার যেখানে কালো রাজা দাঁড়াতে পারবেন, তার মধ্যে ৫৮ টি আইনানুগ (তিনি নিজেকে সাদা রাখার জন্য সাদা রাজার পাশে ডানদিকে যাওয়ার অনুমতি নেই)। যদি সাদা বাদশাকে দুর্গে প্রবেশের অনুমতি দেওয়া হয় তবে তাকে হয় বাম রুক, ডানদল বা উভয়কেই ক্যাসল করার অনুমতি দেওয়া হয়। এইভাবে 3x58 = 174 সম্ভাবনা রয়েছে যেখানে সাদা রাজা দুর্গ করতে পারবেন, অন্য 174 যেখানে কালো রাজা দুর্গ করতে পারবেন এবং আরও 3x3 = 9 যেখানে উভয়ই দুর্গ করতে পারবেন, মোট 357।

দুটি রাজার যেখানে তারা সংলগ্ন স্কোয়ারগুলিতে রয়েছে তার অবৈধ ব্যবস্থা রয়েছে: 3x4 = 12 সাদা কানের কোণে থাকলে 5x24 = 120, যখন তিনি প্রান্তে ছিলেন এবং 8x36 = 288 যখন তিনি অন্য স্কোয়ারে আছেন। অতএব সহজেই সম্ভাব্য কাস্টিংয়ের সমস্ত সম্ভাবনার এনকোড করার জন্য পর্যাপ্ত অবৈধ অবস্থান রয়েছে।

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

এটি গুরুত্বপূর্ণ যে এটি পাসের আগে এনকোড করে ডিকোড করা হবে, অন্যথায় কিছু সম্ভাব্য হস্তক্ষেপ রয়েছে।

তুলনা

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

Whose turn is it?                                   1.000 bits
Which squares are occupied by men of which colour? 91.552 bits 
Subtotal                                          *92.552 bits* 
For the two colours, which men and which order?   *68.613 bits* 
GRAND TOTAL                                       161.165 bits

এটি ২৯ জন পুরুষের সবচেয়ে খারাপ ক্ষেত্রে (পিটারের উত্তর দেখুন)) নীচে আমি দেখাব যে আমি **-তে চিহ্নিত উভয় দফায় কীভাবে প্রান্তিক উন্নতি করেছি (কমপক্ষে 29 পুরুষের ক্ষেত্রে)।

কোন স্কোয়ার দখল করা / কার পালা?

কোন স্কোয়ারগুলি দখল করা হয়েছে তা এনকোড করার সহজ উপায় হ'ল 64 বিট গ্রিড। এটি আমাদের জানায় যে কত স্কোয়ার দখল করা আছে। তবে এটি কিছুটা অপ্রয়োজনীয় কারণ এখানে 32 টিরও বেশি স্কয়ার দখল করা সম্ভব নয়। আমার সমাধান হ'ল হোয়াইটের পালা হওয়ার সময় দখলকৃত স্কোয়ারগুলির জন্য এনকোড করার জন্য 1 এবং ব্যবহারের স্কোয়ারগুলি যখন কালো রঙের পালা হয় তখন কোডগুলি এনকোড করা use এখন সমস্ত সংমিশ্রণ ব্যবহৃত হয় এবং কোনও অপচয় নেই।

এইভাবে আমরা টার্নটি সংরক্ষণের জন্য কিছুটা সাশ্রয় করি: 321 এর চেয়ে কম, এটি সাদা রঙের পালা, 321 এর বেশি, এটি কালো রঙের পালা। একমাত্র অস্পষ্ট ক্ষেত্রে যখন সমস্ত পুরুষ বোর্ডে থাকে এবং সেখানে 32 1 এবং 32 0 হয়। সুতরাং এই ক্ষেত্রে কেবল অতিরিক্ত বিট প্রয়োজন। যেহেতু কোনও ক্যাপচার না হওয়া পর্যন্ত কোনও প্রচার হতে পারে না, এই অতিরিক্ত বিটটি সামগ্রিকভাবে খারাপের ক্ষেত্রে প্রভাব ফেলবে না (যা ঘটেছে ৩ জন পুরুষ এবং বাকি ২৯ জন নিয়ে occurs

স্কোয়ার দখল করা পুরুষদের রঙ

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

মোট 16 টিরও বেশি পুরুষের জন্য, বোর্ডে প্রতিটি রঙের 16 এর বেশি পুরুষ থাকতে পারে না এমন একটি অতিরিক্ত বাধা রয়েছে। সুতরাং যখন সমস্ত 32 জন পুরুষ বোর্ডে থাকবে তাদের অবশ্যই 16 জনের থাকতে হবে এবং মোট সম্ভাবনা 601080390 যা 2 32 এর চেয়ে কিছুটা কম ।

1   1    1    1      1     1      1       1       1        1        1         1         1         1          1          1          1 
1   2    3    4     5      6      7       8       9       10       11        12        13        14         15         16         17
1   3    6   10    15     21     28      36      45       55       66        78        91       105        120        136        153
1   4   10   20    35     56     84     120     165      220      286       364       455       560        680        816        969
1   5   15   35    70    126    210     330     495      715     1001      1365      1820      2380       3060       3876       4845
1   6   21   56   126    252    462     792    1287     2002     3003      4368      6188      8568      11628      15504      20349
1   7   28   84   210    462    924    1716    3003     5005     8008     12376     18564     27132      38760      54264      74613
1   8   36  120   330    792   1716    3432    6435    11440    19448     31824     50388     77520     116280     170544     245157
1   9   45  165   495   1287   3003    6435   12870    24310    43758     75582    125970    203490     319770     490314     735471
1  10   55  220   715   2002   5005   11440   24310    48620    92378    167960    293930    497420     817190    1307504    2042975
1  11   66  286  1001   3003   8008   19448   43758    92378   184756    352716    646646   1144066    1961256    3268760    5311735
1  12   78  364  1365   4368  12376   31824   75582   167960   352716    705432   1352078   2496144    4457400    7726160   13037895
1  13   91  455  1820   6188  18564   50388  125970   293930   646646   1352078   2704156   5200300    9657700   17383860   30421755
1  14  105  560  2380   8568  27132   77520  203490   497420  1144066   2496144   5200300  10400600   20058300   37442160   67863915
1  15  120  680  3060  11628  38760  116280  319770   817190  1961256   4457400   9657700  20058300   40116600   77558760  145422675
1  16  136  816  3876  15504  54264  170544  490314  1307504  3268760   7726160  17383860  37442160   77558760  155117520  300540195
1  17  153  969  4845  20349  74613  245157  735471  2042975  5311735  13037895  30421755  67863915  145422675  300540195  601080390

পাস্কালগুলির ত্রিভুজের এই নিষ্কর্ষের "সারিগুলি" সংক্ষেপণের মাধ্যমে সম্ভাবনার সংখ্যাটি পাওয়া যাবে (যার দ্বারা আমি টেবিলের NE-SW ত্রিভুজগুলি বোঝায়, কারণ আমি সুবিধাজনক উপস্থাপনের জন্য ত্রিভুজটি 45 ডিগ্রি অ্যান্টিক্লোকের দিকে ঘোরালাম প্রয়োজনীয় বিটের সংখ্যা মোড়টি এনকোড করার জন্য, পুরুষদের দখল করা স্কোয়ার এবং রঙটি নিম্নরূপ:

25 জনের বেশি পুরুষ: 64+ এর চেয়ে সামান্য কম (পুরুষ সংখ্যা)
25 জনেরও বেশি পুরুষের জন্য:

men permutations  bits required  occupied sq+turn   
    of colours                   (bits required)  total bits
26   55791790     25.7335495      64              89.7335495
27  100960110     26.58921015     64              90.58921015
28  175844430     27.3897244      64              91.3897244
29  290845350     28.115677       64              92.115677   
30  445962870     28.73234836     64              92.73234836
31  601080390     29.16298271     64              93.16298271
32  601080390     29.16298271     65              94.16298271

দুটি রঙের জন্য, কোন পুরুষ এবং কোন ক্রমে?

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

  1. ব্ল্যাক প্যাড সাদা প্যাঁচকে ধরেছে: এখন ক্যাপচারিং প্যাড প্রচারের জন্য মুক্ত কারণ তিনি এখন অন্য একটি কলামে রয়েছেন। একই কলামে তাঁর সহকর্মীও প্রচার করতে পারেন। সাদা মহিমাটির মূল কলামে কালো প্যাডও প্রচার করতে পারে। এটি কেবলমাত্র 3 টি পদোন্নতির অনুমতি দেয়।

  2. কালো বোঁচকোটি সংলগ্ন কলামে সাদা পদ্মর অতীত হয়ে যায় এবং তার পরে পিছনে সাদা টুকরা (প্যাঁচ ছাড়া অন্য) ক্যাপচার করে। এটি ক্যাপচারিং প্যাড এবং হোয়াইট প্যাডকে সক্ষম করে যিনি প্রচার করতে মূল কলামে ছিলেন। প্রতিটি পক্ষের জন্য একটি করে পদোন্নতি।

  3. হোয়াইট প্যাড টুকরা দ্বারা ক্যাপচার করা হয়েছে (প্যাঁচ ছাড়া অন্য।) এটি কেবলমাত্র ব্ল্যাকের জন্য একটির প্রচার করতে পারে। একমাত্র ব্যতিক্রম হ'ল যখন এটি একটি অবরুদ্ধ পদ্মার গঠনটি মুক্ত করে যা ইতিমধ্যে একই কলামে বেশ কয়েকটি ক্যাপচার মুদ্রণের ফলে ঘটেছিল।

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

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

Max promotions   0            1            2             3             4              5 
8 PAWNS 
13 men    18725850    146911050    567991710    1373480394    2297173164     2902775304
14 men    36756720    339459120   1555313760    4501448952    9021804792    13325103792
15 men    60810750    660810150   3555401850   12144582450   28834205400    50030580600
16 men    64864800    843242400   5383778400   21810428640   61514893440    1.26476E+11
7 PAWNS                         
13 men    17760600    141003720    546949260    1321302840    2200401060     2761730400
14 men    30270240    287567280   1331890560    3852728880    7641553920    11068817760
15 men    32432400    372972600   2075673600    7209001800   17135118000    29315286000
6PAWNS                          
13 men    14054040    114594480    447026580    1069488420    1739577840     2113185360
14 men    15135120    151351200    718918200    2087805720    4073028960     5697051360                         
5 PAWNS                         
13 men     6486480     55135080    217297080     510630120     794233440      910235040

আমরা দেখতে পাচ্ছি যে 8 পাউন্ড, 15 পুরুষ, 0 পদোন্নতির মতো ক্ষেত্রে, আদেশের সংখ্যা 8 পাউন্ড 16 পুরুষ, 0 পদোন্নতির চেয়ে সামান্য কম। তবে যদি আমরা 7 টি পাউন্ড, 15 পুরুষ, 0 পদোন্নতির মতো কেসটি বিবেচনা করি (যা ধরা পড়েছে লোকটি অবশ্যই একটি উদ্যান ছিল বলে বিবেচনা করার মতো) তবে আমরা প্রায় অর্ধেক আদেশের অনুমতি পাই।

সুতরাং, যে ক্ষেত্রে কৃষ্ণের 16 পুরুষ এবং সাদা 15 পুরুষ রয়েছে, আমরা কৃষ্ণর জন্য 2 টি প্রচার এবং হোয়াইটের জন্য একটি প্রচারের একটি উচ্চতর আবদ্ধ অনুমানটি বিবেচনা করতে পারি:

5383778400 x 660810150 = 3.55766E+18 possibilities

তবে আমরা নিম্নরূপে এগিয়ে গেলে আমরা আরও ভাল করতে পারি।

উ: ব্ল্যাক অ্যান্ড হোয়াইটের জন্য একের জন্য একটি পদোন্নতির কথা বিবেচনা করে ধরে নিই যে হোয়াইট লোকটি যেভাবে হারিয়েছে তা যে কোনও ধরণের হতে পারে:

843242400 x 660810150 = 5.57223E+17 possibilities

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

(5383778400-843242400) x 372972600 = 1.6935 E+18 possibilities.

এই দু'টিকে একসাথে যুক্ত করার সাথে আমরা 2.25072E + 18 পাই যা 3.55766E + 18 এর চেয়ে কম সংখ্যা। 3 টি ক্যাপচারের জন্য সমস্ত সম্ভাবনা (29 জন পুরুষ অবশিষ্ট) নীচে তালিকাভুক্ত রয়েছে।

(Promotions, Pawns lost) possibilities

BLACK 16 MEN, WHITE 15 MEN. ESTIMATE   3.55766E+18 = 2^61.62563249
(1,0)   843242400 x (1,0)  660810150 = 5.57223E+17
(2,0)  4540536000 x (1,1)  372972600 = 1.6935 E+18
                               TOTAL   2.25072E+18 = 2^60.96509144


BLACK 16 MEN, WHITE 14 MEN. ESTIMATE   9.5675 E+19 = 2^66.3747752
(2,0)  5383778400 x (2,0) 1555313760 = 8.37346E+18
(3,0) 16426650240 x (2,1) 1331890560 = 2.18785E+19
(4,0) 39704464800 x (2,2)  718918200 = 2.85443E+19
                               TOTAL   5.87962E+19 = 2^65.67235739


BLACK 16 MEN, WHITE 13 MEN. ESTIMATE   2.69447E+20 = 2^67.86856193
(3,0) 21810428640 x (3,0) 1373480394 = 2.99562E+19
(4,0) 39704464800 x (3,1) 1321302840 = 5.24616E+19
(5,0) 64960896000 x (3,2) 1069488420 = 6.94749E+19
(6,0) 69702272640 x (3,3)  510630120 = 3.55921E+19
                               TOTAL   1.87485E+20 = 2^67.34533572


BLACK 15 MEN, WHITE 15 MEN. ESTIMATE   1.47491E+20 = 2^66.99918768
(2,0)  3555401850 x (2,0) 3555401850 = 1.26409E+19
(2,1)  2075673600 x (3,0) 8589180600 = 1.78283E+19
(3,0)  8589180600 x (2,1) 2075673600 = 1.78283E+19
(3,1)  5133328200 x (3,1) 5133328200 = 2.63511E+19
                  TOTAL BOTH COLUMNS   7.46486E+19 = 2^66.01674923


BLACK 15 MEN, WHITE 14 MEN. ESTIMATE   4.51366E+20 = 2^68.61286007      
(3,0) 12144582450 x (3,0) 4501448952 = 5.46682E+19
(3,1)  7209001800 x (4,0) 4520355840 = 3.25873E+19
(4,0) 16689622950 x (3,1) 3852728880 = 6.43006E+19
(4,1)  9926116200 x (4,1) 3788825040 = 3.76083E+19
(5,0) 21196375200 x (3,2) 2087805720 = 4.42539E+19
(5,1) 12180168000 x (4,2) 1985223240 = 2.41804E+19
                  TOTAL BOTH COLUMNS   2.57599E+20 = 2^67.80368692

সুতরাং এক পক্ষের 15 পুরুষের সাথে অন্যদিকে 14 পুরুষের সাথে সবচেয়ে খারাপ ক্ষেত্রে আমাদের 67.804 বিট দরকার।

কোন স্কোয়ার এবং কোন রঙ নির্দিষ্ট করার জন্য এটি 92.116 বিটগুলিতে যুক্ত করার পরে আমরা মোট 67.804 + 92.116 = 159.92 বিট পাই।


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

শেষে আপনি বিটগুলির পরিবর্তে বাইটগুলি আদায় করতে সক্ষম হলেন যা আপনি বোঝাতে চেয়েছিলেন, এটি পাঠকদের কাছে কিছুটা চিন্তার কারণ হতে পারে
এক্স 244

13

177 বিট সবচেয়ে খারাপ ক্ষেত্রে

এই অ্যালগরিটম খুব কমই সহজ, 177 বিট সবচেয়ে খারাপ ক্ষেত্রে দেয় (অনুশীলনে 184 বি = 23 বি), 13 বি (16 বি = 2 বি) সর্বাধিক ক্ষেত্রে যখন 2 জনের বাদ পড়ে যায় তখন পরিস্থিতি সবচেয়ে ভাল।

Bit     Description
  1     Turn (0=white 1=black)
  2-  7 White king position (2-4=letter, 5-7=number)
  8- 13 Black king position (8-10=letter, 11-13=number)
 14- 75 Which squares contain pieces (skipping the 2 king squares, so only 62)
        Ordered a1-h1,a2-h2,(...)
 76-105 Which color owns the square with their piece (0=white, 1=black)
        If there's LESS than 30 pieces (apart from kings), this area is
        smaller
106-end Square data

Square data has the following system:
Every square gets assigned a number which determines piece. Number is:
0 Queen
1 Rook
2 Bishop
3 Knight
4 Pawn OR allowed-castle rook depending on square
5 Pawn subject to potential enpassant

The first bits (max 13) is the potential enpassant slots from A-H, determined
from data of 1 + 14-105 for which of the squares has a piece, and which color
owns the piece and whose turn it is. For example, if turn is White (bit 1 is
0), all pieces on row 5 which is Black owned (determined from 14-105 metadata)
and has at least 1 adjacant (on the same row) square owned by White, is
explained in A-H order. A base 6 number is used which is converted to binary
for the storage. On reading, it's converted and read A-H according to the
numbers above (4 is obviously pawn in this case).
The second amount of bits takes care of the 1st and 8th row (not corners!)
in b1-g1,b8-g8. These only take up 2 bits since 4 or 5 is never needed
(pawn on 1st or 8th is invalid).
The third amount of bits takes care of the rest of the board, in the following
order: a1,h1,a2-h2,a3-h3,a4-h4,a5-h5,a6-h6,a7-h7,a8,h8 (skipping the
"enpassant" slots), in base 5 (since piece ID 0-4 are the only used) converted
to binary.

Best case: 13 bits (bit 1 for turn, bit 2-12 for kings)
Worst case: 177 bits
* 32 pieces with kings
* 5 viable enpassant pawns
* No pieces at 1st or 8th row (except if kings+rooks are at initial posions
whether or not they can castle)
In this case, the space as following:
  1   bit   turn
+ 12  bits  king positions
+ 62  bits  which squares have pieces
+ 30  bits  color of pieces
+ 13  bits  enpassant area
+ 0   bits  initial rows area
+ 59  bits  the rest of the area
= 177 bits  total

Potential optimizations but not really worth it IMO:
* Decrease average by make corners 2 bits as well if kings aren't at e1/e8
* Alter reading order to read b1-g1,b8-g8 last - decreases worst case to
  176 bits if the "which squares have pieces" area is cut off if 30 existing
  pieces has been defined already. Would actually save 8 bits on file but meh

খুব সুন্দর. মাল্টিনোমিয়াল সহগের উপর ভিত্তি করে এনকোডিং সহ বিটগুলি 14-105 (92 বিট) প্রতিস্থাপন করে আপনি এটিকে আরও দক্ষ করতে পারেন। sum_{i=0}^{15} sum_{j=0}^{15} 62! / (i! j! (62-i-j)!) < 2^87.45
পিটার টেলর

কেবলমাত্র আমি যেটি পরিবর্তন করব তা হ'ল এনপাস্যান্ট এরিয়ার জন্য বরং আরও সরল সংস্করণ তৈরি করা। উদাহরণস্বরূপ: আপনি যদি বেস 5-তে 30 টি টুকরো এনকোড করেন এবং সর্বাধিক 5 এনপাসেন্ট অবস্থান থাকে তবে আপনার কাছে 5 5 31 <2 ^ 72 থাকতে পারে। একইভাবে যদি আপনি তাদের এনপাস্যান্ট (13) এবং নন-এনপাসেন্ট (59) এ বিভক্ত করেন তবে অতিরিক্ত জটিলতা ছাড়াই।
অ্যালিন স্টোইয়ান

এটি করতে আসলে 1 টি অতিরিক্ত বিট ব্যবহৃত হবে। কারণটি হ'ল (সবচেয়ে খারাপ পরিস্থিতি) 5 টি এনস্পাসেন্ট সম্ভাবনা থাকতে পারে তবে এখনও "নো এনপাসেন্ট" অর্থাৎ a ষ্ঠ রাষ্ট্রের জন্য আমার সম্ভাব্যতা ঘোষণা করা দরকার। 1 অতিরিক্ত বিট এই ক্ষেত্রে এনপাস্যান্টকে সম্ভব বা না তা ঘোষণা করতে চলেছে (এবং এই পদ্ধতির সাহায্যে আমি এনপাসিং ব্লককে এড়িয়ে 30 টি টুকরো এনকোডিং সহ একটি আরও সহজ পদ্ধতিরও ব্যবহার করতে পারি, এবং এনপাস্যান্ট চেকের জন্য পৃথকভাবে 3 বিট ব্যবহার করতে পারি, যা এছাড়াও +1 বিট ব্যবহারের দিকে নিয়ে যায়)। নিম্নলিখিত 5 তম সারিতে 5 সম্ভাব্য এনস্পাসেন্টকে সক্ষম করতে হবে (হোয়াইটের পালা): BWBBWBBW
FIQ

হ্যাঁ আপনি ঠিক.
অ্যালিন স্টোইয়ান

7

166 বিট

  • 1 বিট: কার পালা?
  • 2বিট: কাস্টিং বিকল্পগুলি খোলা আছে? (প্রশ্নটি পড়ার জন্য এনবি, যে খেলোয়াড়ের পালা এখন কেবল তার জন্য কাস্টিং বিকল্পগুলি রেকর্ড করা প্রয়োজন)।
  • lg 6 ~= 2.585বিটস: কোন পাসেন্ট বিকল্প খোলা আছে? (আমার অন্যান্য উত্তর দেখুন)
  • lg sum_{i=1}^{16} sum_{j=1}^{16} 64! / (i! j! (64-i-j)! = lg 3629590441720924477681996172 ~= 91.552 বিট: কোন বর্গ কোন রঙের পুরুষদের দ্বারা দখল করা হয়?
  • lg 451366131803622235200 ~= 68.613কোন পুরুষ এবং কোন ক্রমে (নীচে দেখুন) নির্দেশ করতে সবচেয়ে খারাপ বিট

পাটিগণিত এনকোডিং ব্যবহার (যেহেতু প্রতিটি পদক্ষেপে আমরা অভিন্ন বিতরণ প্রয়োগ করছি) আমরা ceil(3 + 2.585 + 91.552 + 68.613) = 166বিট অর্জন করতে পারি ।

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

তবে আন্তঃনির্ভরতার বিষয়টি বিবেচনায় নিয়ে আমরা আরও ভাল করতে পারি। আমি এটি কেবলমাত্র একটি বেসিক স্তরে করছি: কতগুলি প্রচার হতে পারে? একটি গিরিটি কেবল "পাস" হয়ে উঠতে পারে এবং তিনটি উপায়ে প্রচার করতে সক্ষম হয়: এটি ক্যাপচার করে এবং অন্য কলামে চলে আসে; বা এর বিপরীত পদ্মায় ক্যাপচার এবং তাই একটি পৃথক কলামে সরানো; বা এর বিপরীত পদ্মায় ধরা পড়ে। সুতরাং সাদা জন্য একটি ক্যাপচার সম্ভাব্যভাবে সাদা জন্য দুটি এবং একটি কালো জন্য প্যাঁচ তৈরি করে।

আমরা প্রচারের উপরের সীমানার একটি আংশিক টেবিল তৈরি করতে পারি:

(Max white promos, max black promos):

           White men
           16      15      14      13
Black men
       16  (0, 0)  (1, 2)  (2, 4)  (3, 6)
       15  (2, 1)  (3, 3)  (4, 5)  (5, 7)
       14  (4, 2)  (5, 4)  (6, 6)  (7, 8)
       13  (6, 3)  (7, 5)  (8, 7)  (8, 8)

একজন খেলোয়াড়ের Nপুরুষ রয়েছে এবং Pপ্রচারিত তীরচিহ্ন ছাড়া আর কোনও দেওয়া যায়নি এমন সংখ্যা আমরাও গণনা করতে পারি :

Num of permutations (cumulative):
    max promotions: 0              1              2              3              4              5              6              7              8
 1 men              1              1              1              1              1              1              1              1              1
 2 men             10             10             10             10             10             10             10             10             10
 3 men             72             75             75             75             75             75             75             75             75
 4 men            436            496            500            500            500            500            500            500            500
 5 men           2305           3025           3120           3125           3125           3125           3125           3125           3125
 6 men          10746          17106          18606          18744          18750          18750          18750          18750          18750
 7 men          44170          88795         106260         109179         109368         109375         109375         109375         109375
 8 men         159832         415360         575240         619200         624744         624992         625000         625000         625000
 9 men         509841        1721961        2884815        3398769        3504735        3515301        3515616        3515625        3515625
10 men        1447200        6258240       13063080       17697780       19260180       19510320       19530840       19531230       19531240
11 men        3706065       20021265       52183395       85007571      102173181      106786581      107369592      107409918      107410281
12 men        8678340       57101220      183088620      364510476      509818716      570620556      584017632      585352152      585430164
13 men       18725850      146911050      567991710     1373480394     2297173164     2902775304     3107861328     3143928216     3146014014
14 men       36756720      339459120     1555313760     4501448952     9021804792    13325103792    15664512864    16283899632    16360920576
15 men       60810750      660810150     3555401850    12144582450    28834205400    50030580600    66655789200    73588394880    74576231730
16 men       64864800      843242400     5383778400    21810428640    61514893440   126475789440   196178062080   240747386880   253686232800

উভয়ের সংমিশ্রণে, আমরা উভয় ক্রম নির্ধারণের জন্য প্রয়োজনীয় বিটের সংখ্যা উভয় পক্ষের পুরুষদের সংখ্যার ভিত্তিতে পেতে পারি:

           White men
           16      15      14      13      <13
Black men
       16  51.902  61.626  66.375  67.868  <=67.009
       15  --      67.000  68.613  67.534  <=65.243
       14  --      --      67.734  65.480  <=63.055
       13  --      --      --      63.102  <=60.676

যদি এটি টেবিলের এই অংশে না থাকে তবে আমরা কেবল ধরে নিতে পারি যে উভয় পক্ষের 8 টিরও বেশি প্রচার রয়েছে এবং আমরা এখনও সবচেয়ে খারাপের চেয়ে ভাল করছি, যা একটির 14 পুরুষ এবং অন্যটির 15 জন পুরুষ থাকে তখন 68.613 বিট হয়।

মনে রাখবেন যে এটি নিখুঁত উপস্থাপনা হওয়া থেকে এখনও অনেক দীর্ঘ পথ, কারণ এটি অনেকগুলি অবৈধ অবস্থানের অনুমতি দেয়।

অনুমান টেবিল গণনার জন্য কোড:

import java.util.*;

public class ChessCombinatorics {
    public static void main(String[] args) {
        long[] f = new long[17];
        f[0] = 1;
        for (int i = 1; i < 17; i++) f[i] = i * f[i-1];

        // Indexed by num promotions, then total num men.
        long[][] distribs = new long[9][17];
        long[][] perms = new long[9][17];

        for (int promotedPawns = 0; promotedPawns < 9; promotedPawns++) {
            Map<Integer, Map<String, Long>> numCases = new HashMap<Integer, Map<String, Long>>();
            for (int i = 1; i < 17; i++) numCases.put(i, new HashMap<String, Long>());

            for (int extraQ = 0; extraQ <= promotedPawns; extraQ++) {
                for (int extraR = 0; extraR + extraQ <= promotedPawns; extraR++) {
                    for (int extraN = 0; extraN + extraR + extraQ <= promotedPawns; extraN++) {
                        int extraB = promotedPawns - extraN - extraR - extraQ;
                        int unpromotedPawns = 8 - promotedPawns;

                        // Promoted pawns should only count towards their new type if the existing ones are alive.
                        // Otherwise we double-count some cases.
                        int minQ, maxQ, minR, maxR, minN, maxN, minB, maxB;
                        if (extraQ == 0) {minQ = 0; maxQ = 1;} else {minQ = maxQ = 1 + extraQ;}
                        if (extraR == 0) {minR = 0; maxR = 2;} else {minR = maxR = 2 + extraR;}
                        if (extraN == 0) {minN = 0; maxN = 2;} else {minN = maxN = 2 + extraN;}
                        if (extraB == 0) {minB = 0; maxB = 2;} else {minB = maxB = 2 + extraB;}

                        for (int numQ = minQ; numQ <= maxQ; numQ++) {
                            for (int numR = minR; numR <= maxR; numR++) {
                                for (int numN = minN; numN <= maxN; numN++) {
                                    for (int numB = minB; numB <= maxB; numB++) {
                                        for (int numP = 0; numP <= unpromotedPawns; numP++) {
                                            // The number of possibilities at these values is (numK + numQ + numR + numN + numB + numP)! / (numK! numQ! numR! numN! numB! numP!)
                                            numCases.get(1+numQ+numR+numN+numB+numP).put(numQ+","+numR+","+numN+","+numB+","+numP, f[1 + numQ + numR + numN + numB + numP] / f[numQ] / f[numR] / f[numN] / f[numB] / f[numP]);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            for (int numMen = 1; numMen < 17; numMen++) {
                distribs[promotedPawns][numMen] = numCases.get(numMen).size();
                if (distribs[promotedPawns][numMen] > 0) {
                    for (Long l : numCases.get(numMen).values()) perms[promotedPawns][numMen] += l;
                }
            }
        }

        System.out.println("Num of permutations (cumulative):");
        System.out.println("    max promotions: 0              1              2              3              4              5              6              7              8");
        for (int numMen = 1; numMen < 17; numMen++) {
            System.out.print(String.format("%2d men", numMen));
            long cumul = 0;
            for (int promotedPawns = 0; promotedPawns < 9; promotedPawns++) {
                cumul += perms[promotedPawns][numMen];
                System.out.print(String.format("%15d", cumul));
            }
            System.out.println();
        }

        System.out.println("Entropy of permutations:");
        System.out.println("    max promotions: 0              1              2              3              4              5              6              7              8");
        for (int numMen = 1; numMen < 17; numMen++) {
            System.out.print(String.format("%2d men", numMen));
            long cumul = 0;
            for (int promotedPawns = 0; promotedPawns < 9; promotedPawns++) {
                cumul += perms[promotedPawns][numMen];
                System.out.print(String.format("  %6.3f", Math.log(cumul) / Math.log(2)));
            }
            System.out.println();
        }

    }
}

আপনি কীভাবে রাজাদের পদমর্যাদা কাটাবেন? আপনি আপনার গণনায় 15 জন পুরুষ এবং রাজা পদগুলির জন্য কোনও বিশেষ বিট ব্যবহার করেন না।
অ্যালিন স্টোইয়ান

অ্যালিনস্টোয়ান আমার প্রোগ্রামটির আউটপুট লুপের <পরিবর্তে আমার একটি ছিল <=। এটা ইশারা জন্য ধন্যবাদ। বোর্ডে থাকা 32 জন পুরুষকে বিশেষ-কেস করে আমি পূর্ববর্তী স্কোরটি পুনরুদ্ধার করতে পারি, তবে আমি এখনই তা করব না।
পিটার টেলর

আকর্ষণীয় তথ্য! ধারণ করা 3 পুরুষের সাথে তাত্ত্বিক সবচেয়ে খারাপ পরিস্থিতি
লেভেল রিভার সেন্ট

@ স্টিভেভারিল, আমি সত্যিই যা করতে চাই তা হ'ল একটি "ব্লক" এবং তারপরে টুকরোয় অবস্থান এবং মানগুলিকে অদৃশ্য পদক্ষেপ এবং পদোন্নতির সংখ্যা এনকোড করা। তবে, পদোন্নতিগুলিকে বিবেচনায় না নিয়ে কমপক্ষে 2 ^ 38 টি পন অবস্থান রয়েছে এবং এগুলি দক্ষতার সাথে গণনা করা এখন পর্যন্ত আমার হাত থেকে বাঁচতে পেরেছে।
পিটার টেলর

@ পেটারটাইলর যদি আপনার কেবল বোর্ডে 16 টি প্যাঁ থাকে, 48 টি স্কোয়ারের মধ্যে সীমাবদ্ধ থাকে তবে আপনার কাছে 48! / 32! / 8! / 8! = 29019905518636890 সম্ভাবনা রয়েছে। সামান্য 2 ^ 54 এর চেয়ে বেশি! এর মধ্যে কয়েকটি অবৈধ, বোর্ডের একপাশে আপনার এক রঙের সমস্ত प्याদ থাকতে পারে না।
স্তর নদী সেন্ট

5

178 বিট (এক চিমটে 174!) সবচেয়ে খারাপ ক্ষেত্রে

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

যাইহোক, এইভাবেই আমি ডেটা কাঠামো করি। প্রাথমিক ধারণাটি 178 বিট এ আসে তবে কিছু জিগারি পোকারি দিয়ে এটি 174 এ নামিয়ে আনতে পারে (এটি 21 3/4 বাইট)। 175 প্রোগ্রাম করা সহজ, আরও মানব পাঠযোগ্য এবং এখনও 22 বাইটের মধ্যে রয়েছে।

ক) উভয় রাজার অবস্থান: সাদা এবং কালো 12 বিটিএসের জন্য প্রতিটি 6 টি বিট

খ) অবশিষ্ট squ২ স্কোয়ারের মধ্যে কোনটি দখল করা আছে? 62 বিআইটিএসের একটি ম্যাট্রিক্স

গ) কার পালা? 1 বিআইটি

মোট মোট: 75 বিট

ঘ) এন পাসেন্ট। যদি সাদা রঙের পালা চালানোর পালা হয়, তবে 5 টি কালো প্যাঁকো দেখে মনে হচ্ছে তারা এন পাসেন্টকে বন্দী করতে পারে। কালো শৈশবে 5 টি সারি হতে হবে (নীচে থেকে শীর্ষে শূন্য থেকে শুরু হওয়া) এবং তার পাশে একটি সাদা প্যাশন রাখতে হবে। সর্বাধিক সংখ্যক ক্যাপচার সহ একটি পরিস্থিতি এরকম দেখাচ্ছে:

BWBBWBBW

৫ নং সারিটিতে 6 টি কালো রঙের प्याদ থাকলে সাদাকে কেবল দাঁড়ানোর জন্য 2 স্কোয়ার থাকতে পারে এবং কেবল 4 টি কালো রঙের प्याদকেই হুমকি দিতে পারে, সুতরাং একই সময়ে এন পাসেন্টের দ্বারা হুমকির মুখে 5 টিরও বেশি কালো জলদস্যু হওয়া সম্ভব নয়। সুতরাং আমাদের একটি সংখ্যার 1 থেকে 5 দরকার যা সূচিত করে যে 5 তম সারিতে (5 অবধি) পশুর মধ্যে একটি শত্রু রয়েছে (এই ক্ষেত্রে সাদা) এর পাশের শেষ বাঁকটিতে 2 বা স্কোয়ার উন্নত ছিল ( বা শূন্যতা না থাকলে) এই পরিস্থিতিতে শেষ বাঁকটিতে এইভাবে সরানো হয়েছিল))

ঙ) ৩০ টি পর্যন্ত দখলকৃত স্কোয়ারের (বাদশাহাসহ) এর মধ্যে কী রয়েছে?

দশটি সংখ্যা দ্বারা প্রতিনিধিত্ব করা 10 টি সম্ভাবনা রয়েছে।

কমপক্ষে উল্লেখযোগ্য বিট রঙটি উপস্থাপন করে।

সুতরাং এমনকি সংখ্যা সাদা, বিজোড় সংখ্যা কালো।

সাদা কালো

বন্ধন 0/1 (বা কাস্ট করার অনুমতিপ্রাপ্ত রুক *)

নাইট 2/3

বিশপ 4/5

6/7 রুক

রানী 8/9

* এমন একটি দালাল যা দুর্গে প্রবেশের অনুমতিপ্রাপ্ত (এবং তাই এটি প্রথম বা শেষ সারিতে কখনও সরানো হয়নি) 6 বা of এর পরিবর্তে 0 বা 1 দ্বারা উপস্থাপিত হয় এটি একটি পদ্ম দিয়ে বিভ্রান্ত করা যায় না, কারণ পদ্মাগুলি প্রথমটিতে পাওয়া যায় না বা শেষ সারি

এটি 30 টি সংখ্যা পর্যন্ত দশমিক সংখ্যা দেয়, যা আমরা 6 দিয়ে গুণতে এবং তারপরে এন পাসেন্টের জন্য কোড যুক্ত করতে পারি। ফলাফল সংখ্যা 103 বিট মধ্যে মাপসই করা হবে, যখন উপরে বর্ণিত 75 যোগ করা হয় 103 + 75 = 178 বিট । আসলে, যদি আমরা কেবল 6 এর পরিবর্তে 10 দ্বারা গুণ করি তবে এটি ব্যবহৃত বিটের সংখ্যার সাথে কোনও পার্থক্য করে না এবং ডিকোডিং সহজ easier

এটি 22 বাইটের বেশি মাত্র 2 বিট। তবে আমরা এটিকে 174 বিট পর্যন্ত নামাতে পারি, নীচে বর্ণিত।

যদি কোনও টুকরো ধরা পড়ে না থাকে, তবে প্যাঁচার পক্ষে প্রচার করা অসম্ভব

অনুসরণ হিসাবে প্রমাণ। গেমটির শুরু থেকেই সাদা উদাহরণস্বরূপ (যেমন উদাহরণস্বরূপ) কলামে তাঁর উদোম প্রচার করতে উদগ্রীব হয়েছে তা কল্পনা করুন। এই মহিমাটির বিপরীতে একটি কালো শৈশব রয়েছে the সুতরাং এই প্যাড প্রচার করার জন্য, নিম্নলিখিতগুলির একটি অবশ্যই ঘটবে:

1) কালো প্যাঁচা ধরা পড়ে।

2) কালো প্যাঁচা অন্য টুকরা ক্যাপচার এবং তাই পথ থেকে সরানো।

3) সাদা প্যাঁচটি সংলগ্ন কলামে যেমন কলাম ডি তে একটি পদ্মাকে ক্যাপচার করে D.

৪) সাদা পদ্মটি সংলগ্ন কলামে একটি কালো মহিমা পাস (বা পাশ দিয়ে যায়) এবং পরে সেই একই সংলগ্ন কলামে একটি টুকরো ধরে ফেলবে, যার ফলে সাদা পদ্মটি কলাম পরিবর্তন করেছে।

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

যাইহোক, কোনও পদ্মাটি কোনও টুকরো ধরা না দেওয়া পর্যন্ত প্রচার করতে পারে না তার অর্থ আমাদের 30 তম টুকরা সংরক্ষণ করতে হবে না। আমরা এলোমেশনের মাধ্যমে এটি কাজ করতে পারি (বা বিয়োগ দ্বারা, কারণ গেমের শুরুতে টুকরা কোডের সম্পূর্ণ সেট সর্বদা একই পরিমাণ = 80 যোগ করে)) একটি ছোট্ট বিষয়টি আমাদের অবশ্যই নিশ্চিত করতে হবে যে যেখানে বর্গগুলি সেখানে রয়েছে গেমের শুরুতে দাঁড়ান প্রথম স্ক্যান করা হয় (কারণ তারা যদি শেষ হয় তবে আমরা বুঝতে পারি না যে রুক ক্যাসল করতে পারে কিনা।) এটি সারি 0 এবং তারপরে 7 থেকে 1 সারি স্ক্যান করে সহজেই করা হয়: আর জন্য = 8 থেকে 1 স্ক্যান সারি [r মড 8]।

সুতরাং, (বি) -তে বিটের ম্যাট্রিক্স আমাদের জানাবে যে সেখানে কতগুলি টুকরো রয়েছে (বাদে বাদে)) যদি পূর্ণ 30 টি থাকে তবে এনকোডিংয়ের সময় শেষ টুকরোটিকে উপেক্ষা করুন, ডিকোডারটি যা ছিল তা কার্যকর করবে। আমাদের কাছে এখন পর্যন্ত ২৯ ডিজিটের দশমিক সংখ্যা রয়েছে, যা আমরা by দিয়ে গুণ করব এবং এন পাসেন্ট কোডে যুক্ত করব। ফলস্বরূপ সংখ্যাটি মোট 99 + 75 = 174 বিট প্রদান করে 99 টি বিটগুলিতে সঙ্কুচিত হবে।

উদাহরণ হিসাবে এখানে একটি আসল অবস্থান। হোয়াইট সবেমাত্র তার প্রথম পদক্ষেপ (উন্নত রাজার উদোক্ত) করেছেন এবং এটি ব্ল্যাকের পালা।

rnbqkbnr
pppppppp


    P

PPPP PPP
RNBQKBNR

ক) রাজাদের অবস্থান ( অষ্টালে সাদা / কালো, 12 বিট ): 03 73 = 000011 111011

খ) কোন স্কোয়ার দখল করা হয়? সারি শূন্য (নীচের সারি) দিয়ে শুরু করুন এবং তারপরে বাদে বাদে সমস্ত অন্যান্য সারি উপরে থেকে নীচে অবধি:

1111 111

1111 111
11111111
00000000
00000000
00001000
00000000
11110111 

গ) কালো রঙের পালা: ঘুরুন বিট = 1

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

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

RNBQ BNR =   0248 420
rnbq bnr =   1359 531
pppppppp =   11111111
PPPPPPPP = (0)0000000

30 তম সংখ্যা (বন্ধনীতে) বাতিল করা যেতে পারে।

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

স্কোয়ারের সামগ্রীর জন্য 29 টি কোড সহ প্লাস এন পাসেন্ট কোড সহ আমাদের ডেটা এখন এ জাতীয় দেখাচ্ছে:

 (0 discarded) 0000000 11111111 1359531 0248420 (0 en passant)

এনকোডিং করার সময় ডিকোডিং করার সময় ডান থেকে বাম এবং বাম থেকে ডানে (বিপরীত ক্রম) স্ক্যান করা ভাল। এর অর্থ হ'ল যখন খুব কম টুকরো থাকবে তখন সর্বাধিক ধারাবাহিকতা বজায় রাখার সময় (যেমন আমরা ফাঁকা স্থান / শূন্যগুলি নেতৃত্বাধীন করতে চাই, পিছনে নয়, খুব কম দখলকৃত বোর্ডগুলির সংক্ষেপণ সক্ষম করতে।) যখন আমাদের কেবল ২ জন রাজা থাকে বোর্ডে, আমাদের উপরে উল্লিখিত b 75 বিট, এবং উত্তম ক্ষেত্রে এন পাসেন্ট ডেটা = b 78 বিট সংরক্ষণ করার জন্য 3 বিট থাকবে। প্রতিটি অতিরিক্ত টুকরো 3.5 বিট এর নিচে সামান্য আসে (2 টুকরা 7 বিট মধ্যে সংরক্ষণ করা যেতে পারে, কারণ 100 <128।)

একটি ব্যবহারিক সমস্যা আছে যে একটি 99 বিট পূর্ণসংখ্যার একটি 64 বিট পূর্ণসংখ্যার ভেরিয়েবলের সাথে ফিট করার জন্য খুব বড়, যার অর্থ অনেক প্রোগ্রামিং ল্যাঙ্গুয়েজগুলি এর জন্য সমর্থন সরবরাহ করে না (আপনি কেবল 29-30 সংখ্যার একটি স্ট্রিং প্রতিনিধিত্বকে রূপান্তর করতে পারবেন না) পূর্ণসংখ্যায় নম্বর।) 22 বাইটের জন্য এনকোডিংয়ের সহজ উপায় হিসাবে, আমরা একটি 30 সংখ্যার সংখ্যা (29 পিস কোড + এন পাসেন্ট কোড) দুটি 15 ডিজিটের সংখ্যায় বিভক্ত করতে পারি যার প্রতিটিই 50 বিট প্রতিটি (মোট 100 বিট) এ মাপসই হবে প্লাস উপরে বর্ণিত 75 টি 175 বিটকে সবচেয়ে খারাপ পরিস্থিতি তৈরি করে)

সর্বাধিক সংকোচনের জন্য, যেমন উপরে বর্ণিত হয়েছে, 29 দশমিক সংখ্যা প্লাস এন পাসেন্ট কোড (6 সম্ভাব্য মান) কেবল 99 বিটের মধ্যে (মোট 174 বিটের জন্য) ফিট হবে তবে এই আকারের পূর্ণসংখ্যার ভাষার সমর্থন ছাড়াই এটি হবে প্রোগ্রাম জটিল। 29 টি রঙিন বিটগুলি আলাদা করা এবং পিস-টাইপ কোডগুলি (5 সম্ভাব্যতা) এবং এন পাসেন্ট কোড (6 সম্ভাব্যতা) থেকে রঙগুলি (70 বিট, প্রায় bit৪ বিটের ভেরিয়েবলের সাথে ফিট করে) আলাদা করে কাজ করা সহজ হতে পারে)


শেষ লোকটির সাথে দুর্দান্ত কৌশল।
পিটার টেলর

5

এখানে একটি সম্পূর্ণ সমাধান, প্রকৃত নিকৃষ্টতম মামলা 181 বিট

এখানে ফোকাসটি একটি সহজ প্রোগ্রাম যা আপনি সহজেই বুঝতে পারবেন

ইনপুটটি FEN, এখানে খোলার অবস্থান, এটিতে ছয়টি ক্ষেত্র রয়েছে (5 এবং 6 উপেক্ষা করা):

rnbqkbnr / pppppppp / 8/8/8/8 / পিপিপিপিপিপিপিপি / আরএনবিকিউবিএনআর ডাব্লু কে কিউকিউ - 0 1

প্রথম ক্ষেত্র (টুকরা বসানো) পার্স করা হয়েছে

perl -pe 's/\d/"_"x$&/ge;s/\s.*//;s|/||g'

উৎপাদন করা:

rnbqkbnrpppppppp________________________________PPPPPPPPRNBQKBNR

প্রথম ক্ষেত্র: কিংগুলির অবস্থান এনকোড করুন (12 বিট):

printf("%b",index('k',$_))
printf("%b",index('K',$_))

ক্ষেত্রের দুটি: এনকোড টুকরা (প্রতি টুকরো পর্যন্ত 5 বিট):

s/_/0/g     Blank
s/P/100/g   From here, as normal chess meaning
s/p/101/g
s/Q/11000/g
s/q/11001/g
s/R/11010/g
s/r/11011/g
s/B/11100/g
s/b/11101/g
s/N/11110/g
s/n/11111/g
s/K//
s/k//

ক্ষেত্র তিনটি: সক্রিয় রঙ (1 বিট)

s/w/0/
s/b/1/

মাঠ চতুর্থ: কাস্টিং উপলভ্যতা (4 বিট)

m/K/?1:0
m/k/?1:0
m/Q/?1:0
m/q/?1:0

মাঠ পাঁচ: এন পাসেন্ট (শূন্য বা 3 বিট)

printf("%b",ord($1)-ord("a")) unless m/-/
// The EP's rank is 3 or 6 based on active color, only need to encode file

নিষ্পাপ সবচেয়ে খারাপ ক্ষেত্রে 200 বিট

  • দুটি রাজার স্থান - 12 বিট
  • তক্তা
    • QRRBBNN QQQQQQQQ - 75 বিট
    • qrrbbnn qqqqqqqq - 75 বিট
    • খালি স্কোয়ার - 30 বিট
  • সক্রিয় রঙ - 1 বিট
  • কাস্টিং - 4 বিট
  • এন পাসেন্ট - 3 বিট

প্রকৃত খারাপতম কেস

প্রতিটি প্লেয়ার অন্য টুকরো ক্যাপচার না করে সমস্ত প্যাঁচকে প্রচার করতে পারে না । এখানে টুকরো ক্যাপচারের এনট্রপি প্রভাব রয়েছে:

  • PpR(3 + 3 + 5 = 11 বিট) => Qq_(5 + 5 + 1 = 11 বিট)
  • PPpp(3 + 3 + 3 + 3 = 12 বিট) => QQq_(5 + 5 + 5 + 1 = 16 বিট)

সুতরাং আসলে সবচেয়ে খারাপ কেস বোর্ড হ'ল:

  • QRRBBNN QQQQQQQQ - 75 বিট
  • qrrbbnn qqqq - 55 বিট
  • খালি স্কোয়ার - 34 বিট

সবচেয়ে খারাপ ক্ষেত্রে হ'ল পাসের জন্য ভাটা ছেড়ে যাওয়ার চেয়ে সমস্ত টুকরো প্রচার করা।

কোড কোড 12 + 75 + 55 + 34 + 1 + 4 = 181 বিট সহ মোট আসল ওয়ার্ল্ড কেস

এফআইকিউ এই সাধারণ স্কিমের দুটি উন্নতি দেখায় , তবে তাদের কোড করা শক্ত:

  • 1 এবং 8 সারিগুলিতে টুকরো এনকোডিং থেকে বিট 2 সরান যেহেতু পদ্মারা সেখানে যেতে পারে না (16 বিট সঞ্চয় পর্যন্ত)
  • Castালাইযোগ্য রুকসকে এনকোড করার জন্য प्याদ ব্যবহার করুন (4 বিট সঞ্চয়)

এই উত্তরে (ব্রিভিটির জন্য) প্রদর্শিত না হওয়া কেবলমাত্র অবশিষ্ট কোডটি হ'ল: ক্ষেত্রগুলিতে ( split /\s/) এবং ভেরিয়েবল অ্যাসাইনমেন্টে FEN ইনপুট ভঙ্গ করা ।


একজন খেলোয়াড় তার সমস্ত তক্ষককে প্রচার করতে পারেন (প্রদত্ত যে তিনি শত্রুদের কবগী ধারণ করতে সক্ষম); Qn4QQ / Qb6 / Qq1k4 / Qr6 / Qb6 / Qr6 / Qn4NK / RNB2B1R খ - - 0 84
Krzysztof Szewczyk

@ ক্রিজিৎসটোফসজেউসিজিক, হ্যাঁ উপরে এটি উল্লেখ করা হয়েছে PPpp=>QQq_
উইলিয়াম এন্টারিকেন

4

মোট ডেটা 33 বাইট প্রয়োজন

(মন্তব্যগুলিতে কারও ধন্যবাদ আমি বুঝতে পেরেছি এটি পদ্ম প্রচারের জন্য কাজ করে না। আমি যখন এটি সমাধান করতে পারি তখন এটি আপডেট করব)

প্রথম বাইটের জন্য আমরা পাঁচটি বিট ব্যবহার করি:

  • প্রথম বিট: প্লেয়ারের পালা, 1 = সাদা
  • দ্বিতীয় বিট: কালো রাজা পাশের দুর্গ, 1 = কাসল করতে পারেন
  • তৃতীয় বিট: কালো রানী পাশের দুর্গ, 1 = ক্যাসল করতে পারেন
  • চতুর্থ বিট: সাদা রাজা পার্শ্ব দুর্গ, 1 = ক্যাসল করতে পারেন
  • পঞ্চম বিট: সাদা কুইন সাইড ক্যাসেল, 1 = ক্যাসল করতে পারেন

পরবর্তী 32 বাইটগুলি প্রতিটি দাবা টুকরোকে পূর্বনির্ধারিত ক্রমে প্রতিনিধিত্ব করতে ব্যবহৃত হয়

  • 3-বিট: সারি প্রতিনিধিত্ব করুন
  • 3-বিট: কলাম উপস্থাপন
  • 1-বিট: এন-পাসেন্টকে প্রতিনিধিত্ব করুন, 1 = এন-পাসেন্ট করতে পারবেন
  • 1-বিট: "এন-পাসেন্ট" বিটটি 1 হলে বিটটি 1: কোন দিকে নির্দেশ করে, 0 = বাম
    অন্যটি এটি ধরা হয়েছে কিনা তা উপস্থাপন করে। 0 = ক্যাপচার করা হয়নি
    (এটি যদি উত্তীর্ণ হতে পারে তবে তা অবশ্যই ধরা পড়ে না)

এই ধারণাকে উপস্থাপন করার জন্য কিছু সি কোড (যা আসলে কাজ করে না)

int main() {
    char b, c[32], i;

    //decode:

    FILE *p=fopen("/path/to/file.csv","r");
    fscanf(p,"%d,",&b);
    for(i=0;i<31;i++) fscanf(p,"%d,",&c[i]);
    fscanf(p,"%d",&c[31]);
    fclose(p);
    if(b&16) /* white's turn */
    else /* black's turn */
    if(b&8) /* black king side can castle */
    if(b&4) /* black queen side can castle */
    if(b&2) /* white king side can castle */
    if(b&1) /* white queen side can castle */

    for(i=0;i<32;i++) {
        int row, column;
        row=c[i]&7;
        column=c[i]&56;
        if(c[i]&64 && isPawn(c[i])) { //can en-passant
            if(c[i]&128) //can en-passant to the right
            else //can en-passant to the left
        }
        if(!(c[i]&64)) {
            if(c[i]&128) //captured
            else //not captured
        }
    }

    //encode:

    p=fopen("/path/to/file.csv","w");

    if(b&16) b&=239;
    else b|=16;
    if(black_king_side_cannot_castle) b&=247;
    if(black_queen_side_cannot_castle) b&=251;
    if(white_king_side_cannot_castle) b&=253;
    if(white_queen_side_cannot_castle) b&=254;

    for(i=0;i<32;i++) {
        c[i]=row;
        c[i]+=column*8;
        if(isPawn(c[i]) && can_en_Passant) {
            c[i]|=64;
            if(can_en_Passant_left) c[i]&=127;
            else c[i]|=128;
        }
        if(!(c[i]&64)) {
            if(isCaptured(c[i])) c[i]|=128;
            else c[i]&=127;
        }
    }
    fprintf(p,"%d,",b);
    for(i=0;i<31;i++) fprintf(p,"%d,",c[i]);
    fprintf(p,"%d",c[31]);
    fclose(p);
    return 0;
}

-1, এটি কোনও উত্তর নয় ...
ডোরকনব

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

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

আচ্ছা তাহলে আপনার যদি সমাধান না থাকে তবে আপনি কেন এটি পোস্ট করলেন?
Doorknob

3
যদি আপনি লোকেরা এখনও মনে করেন যে এই উত্তরটি ফাঁকি দেওয়া এবং এখানে কোনও মূল্য নেই তবে এগিয়ে যান এবং এটি মোছার পক্ষে ভোট দিন এবং এটি ডাউনওয়েট করুন এবং আপনি আমার অ্যাকাউন্টটি এখানেও মুছতে পারেন। আমি কেবল যা ভাবতে পারি তা ভাগ করে নিতে চাই, কেন তোমরা লোকেরা এতটাই নির্দোষ হতে হবে?
পেস্টবিন.কম 0mr8spkT

4

256 242 বিট

এখানে একটি বেসিক সংক্ষেপণ অ্যালগরিদম যা সম্ভবত উন্নত করা যেতে পারে কারণ এটি নির্দিষ্ট অবৈধ অবস্থানগুলিকে প্রতিনিধিত্ব করা থেকে বাদ দেয় না।

বোর্ডটি হেডার তথ্যের 5 টি বিট দিয়ে শুরু করে:

0 1 1 1 1
---------
1 2 3 4 5

1: Turn (black = 1, white = 0)
2: Black can castle queen-side
3: Black can castle king-side
4: White can castle queen-side
5: White can castle king-side

তারপরে, 12 বিটের একটি স্ট্রিং রাজাদের অবস্থান উপস্থাপন করে।

0 0 0 1 0 0 1 1 1 1 0 0
-----------------------
0 0 0 0 0 0 0 0 0 1 1 1
1 2 3 4 5 6 7 8 9 0 1 2

01 - 03: white king's rank
04 - 06: white king's file
07 - 09: white king's rank
10 - 12: white king's file

তারপরে, বেস ১১-এ একটি বিশাল -৪-সংখ্যার সংখ্যা, যা পরে 9 দ্বারা গুণিত হয়ে এন-পাসেন্টের অবস্থা উপস্থাপন করে এমন একটি অন্য সংখ্যা যুক্ত করবে। বেস 11-এ প্রতিটি অঙ্ক বোর্ডের একটি বর্গক্ষেত্রকে নিম্নলিখিত সম্ভাব্য মানগুলির সাথে উপস্থাপন করে:

0: empty

1: white pawn
2: white knight
3: white bishop
4: white rook
5: white queen

For the black equivalent of each white piece, add 5.

9 বেসে অঙ্কগুলি:

0: no en-passant possible
1 - 8: en-passant on rank 1 - 8

11 64 × 9 প্রায় 2 224.57 , যার এনকোডে 225 বিট প্রয়োজন। শীর্ষে 17 টি শিরোনাম বিট, মোট 242 বিট।


উন্নতির জন্য ugoren ধন্যবাদ।


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

আপনি এন-পাসেন্টকে 0 এবং 8 এর মধ্যে একটি নম্বর হিসাবে সংরক্ষণ করতে পারেন (কোন প্লেটে বর্তমান প্লেয়ার এন-পাসেন্টকে ক্যাপচার করতে পারে?) 13^64 * 9239.99 হয়, 11 বিট সাশ্রয় করে। আলাদা আলাদাভাবে কিং পজিশনগুলি এনকোড করে আরও সংরক্ষণ করুন।
ugoren

আমার পোস্টে মন্তব্য করা স্নোয়ের ডোরকনবের মতে, এই জাতীয় উত্তর "উত্তর নয়"। কথা মাত্র. আমার উত্তরটিতে সি কোড যুক্ত করার আগে এফওয়াইআই তার মন্তব্য পোস্ট করেছিল।
পেস্টবিন.কম 0mr8spkT

@ ইউগোরেন: আমি সে সম্পর্কে ভুলে গেছি। আপনি ঠিক বলেছেন, আমি ভুলে গিয়েছিলাম যে একই সময়ে কেবলমাত্র একটি পয়দা এন-পাসেন্ট হতে পারে।
জো জেড

@ace: আপনার উত্তরটি অবৈধ নয় কারণ এতে এনকোডিং এবং ডিকোডিং কোড অন্তর্ভুক্ত নয়; এটি অবৈধ কারণ এটি মহিমা-প্রচারের ক্ষেত্রে অ্যাকাউন্ট করে না (যে ক্ষেত্রে আপনার পূর্বনির্ধারিত ক্রমের টুকরোগুলি কিছুই করে না)। সমস্যাটি এর মূল বিষয়বস্তুতে একটি ডেটা-এনকোডিং প্রকল্পের জন্য জিজ্ঞাসা করে। প্রোগ্রামটি এর সাথে ইন্টারফেস করার মতো কিছু।
জো জেড

3

? বিট

(217 ডলার সবচেয়ে খারাপ ক্ষেত্রে, 17 সেরা ক্ষেত্রে, প্রাথমিক বোর্ডের জন্য 179)


এনকোডিংয়ের বর্ণনা

অতিরিক্ত মেটাডাটাতে যার মোড় (এক বিট) এবং ক্যাসলিং রয়েছে (চার বিট, অর্থাৎ রাজাদের পক্ষে সাদা ক্যাসল? রাণীদের পাশে? এবং একইভাবে কালো রঙের জন্য) সমন্বিত।

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

আকর্ষণীয় অংশটি এখানে: কোনও টুকরোটির অবস্থানটি এনকোড করার জন্য, এটি স্থানাঙ্ক হিসাবে সংরক্ষণের পরিবর্তে, টুকরাগুলি বাম-থেকে-ডান, শীর্ষ-থেকে-ডাউন ক্রমে (যেমন A8) গণনা করার সময় আমরা শেষ টুকরা থেকে এর তুলনামূলক দূরত্ব সঞ্চয় করি , বি 8, ..., জি 1, এইচ 1) অতিরিক্ত হিসাবে, আমরা দূরত্বটি একটি চলক-দৈর্ঘ্যের সংখ্যা হিসাবে সংরক্ষণ করি, 1এই অর্থটি ব্যবহার করে যে এই টুকরাটি ঠিক আগেরটির 0xxপাশেই রয়েছে, 1-3 টুকরা 000xxxএড়িয়ে যাওয়ার জন্য , 4-10 টুকরা বাদ দেওয়ার 000000xxxxজন্য, 11-25 এর 0000000000xxxxxজন্য, 26-26 এর জন্য এবং অবশেষে 000000000000000xxx57-62 এর জন্য।

উদাহরণ

আমি তৈরি একটি সারকথা এই এনকোডিং এর সাথে কোডেড কিছু পজিশনের, এবং কিছু মন্তব্য সহ প্রাথমিক পদের জন্য এক সটীক।

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


ডিকোডার বাস্তবায়ন

নীচে এই এনকোডিংয়ের জন্য দ্রুত এবং নোংরা ডিকোডার রয়েছে (উপরে বর্ণিত উদাহরণ হিসাবে টেক্সটে এনকোড করা বাইনারি ডেটা গ্রহণ করা এবং '0' বা '1' নয় এমন জিনিসগুলি এড়িয়ে যাওয়া) is স্টেডআউটে একটি ইউনিকোড দাবা বোর্ড তৈরি করে।

#include <assert.h>
#include <stdbool.h>
#include <stdio.h>
#include <string.h>

char buf[1024];
int wi = 0, ri = 0;

int read_n(int n) {
  int res = 0;
  for (int i = 0; i < n; i++) {
    res = res << 1 | (buf[ri++] == '1');
  }
  return res;
}

int read_varnum() {
  int v, c = 0;

  for (int i = 1; i <= 5; i++) {
    v = read_n(i);
    if (v != 0) return c + v;
    c += (1 << i) - 1;
  }

  assert(false); /* Shouldn't happen */
}

char *piece_to_str(int piece, int color) {       /* ↓ pawn that may be taken with en passant */
  char *pieces[] = { "♙", "♘", "♗", "♖", "♕", "♔", "♙",
                     "♟", "♞", "♝", "♜", "♛", "♚", "♟" };
  return pieces[color * 7 + piece];
}

int main(void) {
  int ch;
  while (ch = getchar(), ch != EOF) {
    if (ch == '0' || ch == '1') buf[wi++] = ch;
  }

  int board[64];
  memset(board, -1, 64 * sizeof(int));

  /* Read metadata */
  int is_white = read_n(1);
  int castling = read_n(4);

  /* Read the board state */
  int bi = -1;
  while (ri != wi) {
    int color = read_n(1);
    int kind  = read_n(3);
    int delta = read_varnum();
    board[bi + delta] = color << 8 | kind;
    bi += delta;
  }

  /* Print metadata */
  printf("  Current turn: %s's turn to play.\n", is_white? "white" : "black");
  printf("  Castling: White may castle? %s %s\n",
         castling & 0x8? "left" : "", castling & 0x4? "right" : "");
  printf("            Black may castle? %s %s\n",
         castling & 0x2? "left" : "", castling & 0x1? "right" : "");
  printf("\n");

  /* Print the board out */
  printf("+");
  for (int x = 0; x < 8; x++) printf("--");
  printf("-+\n");

  for (int y = 0; y < 8; y++) {
    printf("|");
    for (int x = 0; x < 8; x++) {
      int piece = board[y*8 + x],
          color = piece >> 8,
          kind  = piece & 0xFF;

      if (piece == -1) printf("  ");
      else printf(" %s", piece_to_str(kind, color));
    }
    printf(" |\n");
  }

  printf("+");
  for (int x = 0; x < 8; x++) printf("--");
  printf("-+\n");

  return 0;
}

আপনার নিকৃষ্টতম বিট গণনাটি আমার কোন ধারণা নেই তবে আমি সন্দেহ করি এটি 179 বিটের চেয়ে বেশি। উদাহরণস্বরূপ, আপনার অ্যালগরিদম কীভাবে এই বিন্যাসটি পরিচালনা করবে ? (এটা হল বৈধ, প্রণালী দ্বারা; আমি এটাকে সম্পাদক ব্যবহার করে তৈরি করা chess.com )
খুঁতখুঁতে ossifrage

@ স্ক্যোয়ামিশোসিফ্রেজে যে মনে হয় যে এটির জন্য 217 বিট লাগবে : gist.github.com/FireyFly/8639791 (পরীক্ষা-মামলার জন্য ধন্যবাদ, আমি এটি একটি কৌশলযুক্ত দিয়ে চেষ্টা করতে চেয়েছিলাম!)
ফায়ারফ্লাই

আরে, এটা খারাপ না চোলতে থাকা!
চটজলদি ossifrage

2

সর্বাধিক: 184 বিট, ন্যূনতম: 75 বিট

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

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

 Piece Class                | Frequency Per Team | Encoding
============================+====================+==========
 Pawn, normal               | 0 - 8              | 0
 Pawn, jumped two last turn | 0 - 1              | 1111
 Knight                     | 0 - 2              | 1000
 Bishop                     | 0 - 2              | 1001
 Queen-side rook, unmoved   | 0 - 1              | 10100
 Queen-side rook, moved     | 0 - 1              | 10101
 King-side rook, unmoved    | 0 - 1              | 10110
 King-side rook, moved      | 0 - 1              | 10111
 Queen                      | 0 - 1              | 1110
 King, unmoved              | 0 - 1              | 1100
 King, moved                | 0 - 1              | 1101

প্রতিটি টুকরাটির কোডটি আগে দুটি বিট দিয়ে তৈরি করতে পারে যা এটি কোন দলের ( 10হোয়াইটের 11জন্য, কালো জন্য) অন্তর্ভুক্ত show 0খালি স্থানগুলি এনকোড করতে ব্যবহার করা যেতে পারে। এই ধারণাগুলি আমাদের যা প্রয়োজন পদ্ধতি ব্যবহার করে পুরো বোর্ডের জন্য স্কয়ার বাই স্কোয়ার এনকোডিং তৈরি করার অনুমতি দেয়। আমি পুনরাবৃত্তির ক্রমটি ধরে নেব a1, b1, c1, ... f8, g8, h8। এর অর্থ হল যে এই কোডগুলি কেবল উপরে বর্ণিত হিসাবে তালিকাভুক্ত করা হচ্ছে যার পালা সে ব্যতীত সমস্ত তথ্য এনকোড করে। একটি খুব সাধারণ দাবা ইঞ্জিন মহোদয়, রুকস এবং রাজাদের জন্য "শ্রেণি" ব্যবহার করে নির্ধারণ করতে পারে যে কাস্টলিং এবং পাস পাসেন্ট বৈধ কিনা determine তদ্ব্যতীত, এই স্কিমটি সহজেই বোকে প্রচারগুলি পরিচালনা করে। কোনও খেলোয়াড় যদি কোন জালকে কোনও জালকে উন্নীত করে, তবে "চালিত" বৈকল্পিক চয়ন হওয়ার পরে রাজা বা রানী-পাশের কোডগুলি এতক্ষণ ব্যবহার করা যেতে পারে।

প্যাথলজিকাল অবস্থানগুলি বাদে যা আমি কখনই ঘটতে পারে বলে মনে করি না, এই এনকোডিংয়ের জন্য সবচেয়ে খারাপ পরিস্থিতিটি যখন সমস্ত টুকরা বোর্ডে থাকে এবং পূর্ববর্তী প্লেয়ার দুটি ভাঁজ স্থানকে সামনে রেখে যান। উদাহরণ হিসাবে, নীচের বোর্ডটি এনকোড করে 1. e4:

1101010010100010100110111010110010100110100010101101001001001100100100100000000000000101111000000000000000000011011011011011011011011011101001110001110011111101111001110011110001110110
===========================================================================
                              Black's move
1110100 111000 111001 111110 111100 111001 111000 1110110 | r n b q k b n r
    110    110    110    110    110    110    110     110 | p p p p p p p p
      0      0      0      0      0      0      0       0 | . . . . . . . .
      0      0      0      0      0      0      0       0 | . . . . . . . .
      0      0      0      0 101111      0      0       0 | . . . . P . . .
      0      0      0      0      0      0      0       0 | . . . . . . . .
    100    100    100    110      0    100    100     100 | P P P P . P P P
1010100 101000 101001 101110 101100 101001 101000 1010110 | R N B Q K B N R

এর অর্থ হ'ল সবচেয়ে খারাপ ক্ষেত্রে এনকোডিংটিতে 184 বিট রয়েছে: খেলোয়াড়ের ইঙ্গিত দেওয়ার জন্য 1, খালি জায়গাগুলির জন্য 32, আনমভেড প্যাডগুলির জন্য 45, দুটি স্পেস-জাম্পিং প্যাডের জন্য 6, নাইটের জন্য 24, বিশপদের জন্য 24, দুর্বৃত্তদের জন্য ২৮, রানির জন্য ১২ জন এবং রাজাদের জন্য ১২ জন।

টুকরোগুলি সরানো এবং ক্যাপচার করা হিসাবে, এনকোডিংয়ের আকারটি নামবে। সেরা কেস দৃশ্যটি কেবল দু'জন বাদশাহই বোর্ডে উপস্থাপন করেন: খেলোয়াড় + 62 বিট ইঙ্গিত করার জন্য 1 বিট খালি স্কোয়ার + 12 বিট রাজাদের ইঙ্গিত করার জন্য ন্যূনতম দৈর্ঘ্য 75 বিট দেয় bit

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


1
আপনি দুর্বৃত্তদের উপর বিট সংরক্ষণ করতে পারেন। আপনি অবস্থানের ভিত্তিতে রানী- এবং রাজা-পক্ষ নির্ধারণ করতে পারেন, এবং কোনও স্থানান্তর-রুক কোন দিক থেকে এসেছে তা আপনার জানা দরকার না। সুতরাং আপনার কেবল রস সম্পর্কিত একটি বিট তথ্য প্রয়োজন - সরানো বা অযথিত।
চার্লস

... এবং প্রকৃতপক্ষে, টুকরা স্তরে সেই ডেটা সংরক্ষণ করা এনকোড / ডিকোড করা সহজ, তবে আপনি যদি শুরুতে কোনও মার্কার সঞ্চিত করেন তবে আপনি বিটগুলি সামগ্রিক খারাপ ক্ষেত্রে সংরক্ষণ করতে পারেন (উদাহরণস্বরূপ, চিহ্নিতকারীটির 11001অর্থ B'S MOVE W CAN KSC W CANT QSC B CANT KSC B CAN QSC)। এটি আপনার এনকোডিংয়ের পাশের প্রতি 5 টি বিটের পরিবর্তে 4 বিট বা আপনি যদি পাশের পাশের মার্কারটি বাদ দেন তবে প্রতি বিট 3 বিট। ( KSC= কিং-সাইড ক্যাসেল। QSC= কুইনের পাশের দুর্গ)
চার্লস

এছাড়াও, পদোন্নতির কারণে, 9 কুইন্স বা 10 নাইট (বা অন্য কোনও নন-রেগাল, নন-প্যাড পিস) পর্যন্ত পাওয়া বেশ সম্ভব
চার্লস

1

184 বিট = 23 বাইট সবচেয়ে খারাপ ক্ষেত্রে, এবং খুব জটিল নয়:

উ: কোন স্কোয়ারগুলি দখল করা হয়েছে: b৪ বিট = ৮ বাইট বি। <= 32 অধিকৃত স্কোয়ারের জন্য কোন রঙ: 32 বিট = 4 বাইট এবং এখন কেবল <= 30 স্কোয়ার অ-রাজাদের দ্বারা ব্যবহার করা হয়েছে: বি পিএনবিআরকিউ ব্যবহার করে রেডিক্সে এনকোডেড রয়েছে 5, 5 ^ 30 সম্ভাবনার জন্য; এবং 32 * 31 * 2 * 4 * 4 * 9 রাজা পজিশনের জন্য, মুভার-কালার, হোয়াইট ও ব্ল্যাক কাস্টলিং রাইটস, পাশের স্কোয়ারে (8 টি সম্ভাবনার সাথে কোনও নয়, একটি 9 ম); এই সংখ্যা 5 ^ 30 * 32 * 31 * 2 * 4 * 4 * 9 = 266075134277343750000000000 = 2 ^ 87.782 পুরো এনকোডিংয়ের জন্য মোট 64 + 32 + 88 = 184 বিটের 88 বিটগুলিতে ফিট করে।

এটি হ্রাস করা যেতে পারে, উদাহরণস্বরূপ 32 * 31 * 2 * 4 * 4 * 9 = 285696 2 * (32 * 31 + 31 * 3 + 31 * 3 + 3 * 3) * 6 = 14244 ব্যবহার করে সত্যকে ব্যবহার করে সর্বাধিক en জন পাস-ভুক্তভোগী-প্রার্থী (কিছুই না সহ), এবং কাস্টিং রাইটস এবং একই সেটের অভ্যন্তরে কিং পজিশনের এনকোডিং ফ্যাক্ট কাস্টিং রাইটস ব্যবহার করে কেবলমাত্র প্রাথমিক স্কয়ারের বাদশাহরাই গুরুত্বপূর্ণ matter এটি 4 বিট সংরক্ষণ করে।

আমার বিশ্বাস করার কারণ আছে যে 18 বাইট অর্জন করা সম্ভব নয়, অর্থাৎ আইনী দাবা পদের মোট সংখ্যা 2 ^ 144 ছাড়িয়েছে।

আপনার 160 বিট স্কিমটি খুব জ্ঞানসম্পন্ন তবে আমি মনে করি এটি সম্পর্কে সম্পূর্ণ আত্মবিশ্বাসী হওয়ার আগে এটিকে এনকোড / ডিকোড প্রোগ্রাম হিসাবে দেওয়া দরকার।


1

171 বিট সবচেয়ে খারাপ ক্ষেত্রে:

আমি বেশ কয়েকটি ধারণার পাশাপাশি আমার নিজস্ব কিছু চিন্তাও একত্রিত করেছি।

আমরা একটি 64 বিট বোর্ড দিয়ে শুরু করতে যাচ্ছি। প্রতিটি বিট বোর্ডে একটি দখল স্থান প্রতিনিধিত্ব করে। তারা সারি বরাবর পূরণ। সুতরাং শুরুটি দেখে মনে হচ্ছে:1111 1111 1111 1111 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111

এখন, প্রতিটি টুকরা 4 বিট দ্বারা প্রতিনিধিত্ব করা হবে। 1 ম বিট: রঙ ( 0=white, 1=black) 2 র্থ-চতুর্থ বিট: 8 ধরণের একটি।

0=king, 1=queen, 2=bishop0, 3=knight, 4=rook, 5=pawn0, 6=pawn1, 7=bishop1

শেষে আমরা মোড়কে কিছুটা নির্দিষ্ট করে অন্তর্ভুক্ত করব। 0=white, 1=black

4 বিট * 32 টুকরা = 128 বিট এবং ইতিমধ্যে আমার টার্ন এবং বোর্ড থেকে 64 + 1 পেয়েছে। এটি সর্বমোট 128 + 64 + 1 = 193 দেয় আমি এন পাসেন্ট বা কাস্টিং দিয়ে শুরুও করি নি। ভাল কিছুই আমার সীমা অতিক্রম - এমনকি ঘুরিয়ে না। কৌশলগুলি এখানেই শুরু হয়।

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

আমার সবচেয়ে খারাপ ক্ষেত্রে বোর্ডের সমস্ত টুকরো জড়িত, তাই 16 প্যাশন এবং 4 বিশপ দিয়ে এটি আমার 20 বিট সংরক্ষণ করে। আমি 173 এ নেমেছি।

ঠিক আছে. আমার সবচেয়ে খারাপ ক্ষেত্রে আরেকটি ক্ষেত্রে - একবার 16 টি এনকোডযুক্ত রঙ পরে আসে, আমরা রঙটি এনকোডিং বন্ধ করি - আমরা জানি যে এটি এগিয়ে চলেছে। আমার সবচেয়ে খারাপ ক্ষেত্রে এখন একটি সাদা টুকরা জড়িত যা কোনও ক্যাপচার ছাড়াই দূরের কোণে তৈরি করা হয়েছে। সেখানে আমি কেবল একটি বিট সংরক্ষণ করি। 172।

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

এখন, এক গিরির প্রচারের জন্য (যেমনটি দীর্ঘ আলোচনা করা হয়েছে) অবশ্যই একটি টুকরো ধরা উচিত। সুতরাং, যখন আমরা জানি 32 টি টুকরা রয়েছে, আমাদের কেবলমাত্র সেগুলির 31 টি বোঝাতে হবে। শেষ টুকরা অনন্য সনাক্ত করা হয়। দেখা যাচ্ছে যে, আমার কাছে এটি কেবল 2 টি বিট সাশ্রয় করে - কারণ আমার শেষ টুকরোটি প্যাড / বিশপ হতে পারে (যা সাধারণত আমার 3 বিট খরচ করে কারণ আমি পরের অংশে একটি সঞ্চয় করি) যার রঙ ইতিমধ্যে নির্ধারিত এবং কেবল তাই ছিল 2 বিট। আমি নিচে 170 বিট।

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

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

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

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

ওহ, এবং বোর্ডের সমস্ত টুকরোগুলি সবচেয়ে খারাপ অবস্থার সাথে জড়িত তা নিশ্চিত করতে সহায়তা করার জন্য, একবার আমাদের 32 টিরও কম টুকরো হয়ে গেলে, আমরা 64 টি বিট বোর্ড ব্যবহার করতে পারি 0 টি ব্যবহার করে 0 টি ব্যবহার করে টুকরোগুলি চিহ্নিত করার জন্য শখের সাদা অংশগুলি ব্যবহার করে ঘুরুন এবং যখন এটি কৃষ্ণাঙ্গগুলি পরিণত হয়।

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

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

separate = function(vec){
    #Using a boolean vector (sorry R doesn't handle bits well and this will build quickest)
    board = matrix(vec[1:64],8,8,byrow=T)
    npieces = min(sum(board),64-sum(board))
    n = length(vec)
    a = vec[65:n]
    counter = 0
    pieces = list()
    white = 0
    Letters=c(letters,LETTERS)
    for (i in 1:npieces){
        col = ifelse(a[1],"black",{white=white+1;"white"})
        typ = a[2:4]
        a=a[-(1:4)]
        num = 4*typ[1] + 2*typ[2] + typ[3]
        type = switch(letters[num+1],a="king",b="queen",c="knight",d="rook",e="bishop0",f="bishop1",g="pawn0",h="pawn1")
        if (num > 3) {
            if(num%%2){
                a = c(T,a)
            } else {
                a = c(F,a)
            }
            type = substr(type,1,nchar(type)-1)
        }
        pieces[[Letters[i]]] = list(color=col,type=type)
        if (length(pieces)==31&&npieces==32) {
            col = ifelse(16-white,{white=white+1;"white"},"black")
            type = "TBD"
            pieces[[Letters[i+1]]] = list(color=col,type=type)
            break
        }
    }

    if (npieces==32) {
        f=function(y){sum(sapply(pieces,function(x)x$type==y))}
        if (f("pawn")<16) {pieces[[32]]$type="pawn"}
        if (f("bishop")<4) {pieces[[32]]$type="bishop"}
        if (f("knight")<4) {pieces[[32]]$type="knight"}
        if (f("queen")<2)  {pieces[[32]]$type="queen"}
        if (f("king")<2)   {pieces[[32]]$type="king"}
        if (f("rook")<(6-f("king"))) {pieces[[32]]$type="rook"}
    }
    return(list(board,pieces,turn=ifelse(a[length(a)],"black","white")))
}


fillboard = function(out) {
    board = out[[1]]
    pieces = out[[2]]
    turn = out[[3]]
    lpieces = lapply(pieces,function(x) paste(substr(x$color,1,1),x$type))
    game = matrix("     ",8,8)
    #Start with corners.
    a = c(1,57,8,64)
    #Then kings
    b = c(25,32)
    #Then rooks in en passant
    c = c(4,60,5,61)
    #Then kings in en passant
    d = 28:29
    exceptions = list(a,b,c,d)
    for (places in exceptions) {
        c= which(board[places])
        if (length(c)) {
            repl = lpieces[1:length(c)]
            game[places[c]] = unlist(repl)
            board[places] = F
            lpieces = lpieces[-(1:length(c))]
        }
    }
    #Loop through rows.
    for (i in c(1:4,8:5)) {
        j = which(board[i,])
        if (length(j)) {
            repl = lpieces[1:length(j)]
            game[i,j] = unlist(repl)
            board[i,j] = F
            lpieces = lpieces[-(1:length(j))]
        }
    }
    return(matrix(unlist(game),8,8,F))
}

swapillegal = function(matr) {
    mat = matr
    if (any(mat[8,]=="b pawn")) {
        j = which(mat[8,]=="b pawn")
        mat[8,j] = mat[5,j]
        mat[5,j] = "b pawn-e"
    }
    if (any(mat[1,]=="w pawn")) {
        j = which(mat[1,]=="w pawn")
        mat[1,j] = mat[4,j]
        mat[4,j] = "w pawn-e"
    }

    if (sum(mat[8,]=="b king") > 1) {
        j = which(mat[8,-4]=="b king")
        j[j==7] = 8
        mat[8,j] = "b rook-c"
    }
    if (sum(mat[1,]=="w king") >1) {
        j = which(mat[1,-4]=="w king")
        j[j==7] = 8
        mat[1,j] = "w rook-c"
    }
    return(mat)
}

decode = function(vec) {
    a = separate(vec)
    b = fillboard(a)
    c = swapillegal(b)
    list(board=c,turn=a[[3]])
}


startboard = c(rep(T,16),rep(F,32),rep(T,16))
#Re-ordering -- first spots will be the corners. Then kings. then en passant positions of those spots
pieces = c(F,F,T,T,F,F,T,T,T,F,T,T,T,F,T,T,F,F,F,F,T,F,F,F,F,F,T,F,F,T,F,F,F,F,T,F,T,F,F,F,T,F,F,T,T,F,T,T,F,T,T,F,T,T,F,T,T,F,T,T,F,T,T,F,T,T,T,F,T,F,T,T,F,T,F,F,T,T,T,F,T,F,T,F,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,T,F)
########## w rook -w rook -B rook -B rook -W king -B king -w kni  -w bi 0 -w Q  -w Bi 0 -w kni-w p0   - 2   -   3 -  4  - 5   -  6  -  7  -w p1 -b kni-b bi1  -b q  -b bi1  -b kni-b p1   -2    - 3   - 4   - 5   - 6   - b p0- implicit b p0.
#After the kings come all the prior en passant positions. which are empty at start. Then we start at whites bottom right, and move across rows to middle. Then we go to blacks bottom left, and fill across to the middle.
#Changing start to properly encode rooks for castling
newpieces= c(F,F,F,F,F,F,F,F,T,F,F,F,T,F,F,F ,pieces[-(1:16)])
test2 = decode(c(startboard,newpieces))

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

আমি শুরুর অবস্থানের এনকোডিংটিও অন্তর্ভুক্ত করেছি (যদিও এটি দেখতে আপনাকে কল করতে হবে c(startboard,newpieces)এবং কোডটি সেই অবস্থানে মোড়ক ফাংশনটি কল করে।


এটা মজার. আমি ধারণার প্রমাণ হিসাবে একটি কার্যকরী বাস্তবায়ন দেখতে পছন্দ করব।
মেগো

বাস্তবায়ন সাধারণত ধারণার প্রমাণের বাইরে কয়েক ধাপ, তবে আমি একটি ডিকোডার যুক্ত করেছি। এটি আর-তে রয়েছে এবং সুতরাং বিটগুলির চেয়ে বুলেঁস ব্যবহার করে (দুঃখিত - খুব বেশি সময় ব্যবহার করতে চান না)। তবে আমি বিশ্বাস করি এটি ধারণার প্রমাণ হওয়া উচিত।
ব্যবহারকারী5957401

0

229/226 বিট

এটি খুব সফল না হয়ে দেখা দেয়, তবে একই পথে চলতে পারে এমন অন্যান্য ব্যক্তিকে বাঁচাতে পারে।

সহজ সংস্করণ:

  • 1 কার পালা তার জন্য বিট
  • 4 চারটি কাস্টিং সম্ভাবনার জন্য বিট
  • 3এন পাসের সম্ভাবনার জন্য বিট । এর আরও গভীরতা রয়েছে যা আমি প্রথমে বুঝতে পেরেছিলাম। এন পাসেন্ট অবশ্যই প্যাডের মতো একই র‌্যাঙ্ক (সারি) থেকে সরানো একটি পয়দা দিয়ে অবশ্যই করা উচিত। কেস বিশ্লেষণ ইঙ্গিত দেয় যে একবার যখন আমরা জানতে পারি যে শেষ বর্ণের কতগুলি প্যাণ্ডগুলি সর্বশেষ দুটি স্কোয়ারের দিকে অগ্রসর হয়েছিল, সেখানে সর্বাধিক en জন পাসেন্ট কেস থাকবে (এ ক্ষেত্রে যে পাসের পক্ষে কোনও ঝাঁকুনির ঝুঁকি নেই এমন ঘটনাও রয়েছে )। সবচেয়ে খারাপ কেসটি হ'ল 5 পাউন্ড (সম্ভাব্যরূপে সমস্ত দুর্বল: উদাহরণস্বরূপ PpPPpPPpপাঁচটি ঝুঁকিপূর্ণ রয়েছে P)। P টি পাউন্ড দিয়ে একই র‌্যাঙ্কে সর্বাধিক 2 শত্রু পাউন্ড রয়েছে, যার মধ্যে প্রতিটি পাসে পাসের জন্য কমপক্ষে 2 পাউন্ডকে হুমকি দিতে পারে । সুতরাং আমাদের ceil(lg 6) = 3এখানে বিট প্রয়োজন ।

তারপরে বোর্ড। বোর্ডটির 64৪ স্কোয়ার রয়েছে, সুতরাং একটি স্কোয়ার সূচকটি b বিটে এনকোড করা যায়। আমরা রাজার সাথে শুরু করে র‌্যাঙ্ক অনুসারে পুরুষদের তালিকাবদ্ধ করি colors

  • 6বিট: সাদা রাজার অবস্থান। (বোর্ডে থাকার গ্যারান্টিযুক্ত)।
  • 6বিট: কালো রাজার অবস্থান। (বোর্ডে থাকার গ্যারান্টিযুক্ত the শ্বেত রাজা এক কোণে সবচেয়ে খারাপ অবস্থাতেই তাঁর পক্ষে 60০ টি সম্ভাব্য জায়গা রয়েছে; সর্বোত্তম ক্ষেত্রে যে সাদা কোনও কিনারায় নেই, সেখানে 55 রয়েছে)।
  • 6বিট: সাদা রানির অবস্থান। যদি কোনও সাদা রানী না থাকে তবে সাদা রাজার অবস্থানটি সংকেত হিসাবে পুনরাবৃত্তি করুন।
  • প্রতিটি অতিরিক্ত সাদা রানির 1জন্য, অবস্থানের জন্য 6 বিট পরে কিছুটা।
  • একটি 0বিট।
  • কালো রানী (গুলি) এর জন্য ডিট্টো।
  • রুকস, বিশপ, নাইটস এবং পশমীদের জন্য অনুরূপ প্রক্রিয়া, যদিও আমরা ইতিমধ্যে যদি রঙটির 16 জন লোক রেখে থাকি তবে আমরা কোনও রঙের জন্য পতিগুলি ছেড়ে দিতে পারি।
  • চূড়ান্ত 0বিট মুছুন ।

এটি 12রাজাদের জন্য একটি নির্দিষ্ট বিট খরচ করে এবং 2*7*5-1 = 69অন্যান্য পুরুষদের জন্য বিট করে। সবচেয়ে খারাপ পরিস্থিতিতে যে সমস্ত 32 জন ব্যক্তি বোর্ডে রয়েছে, 7মোট রাজা বাদে প্রতিটি লোকের জন্য বিট খরচ করে 12 + 7*30 - 1 = 221 bits। সুতরাং 8গ্লোবাল রাষ্ট্রের জন্য প্রাথমিক বিট সহ আমাদের 229 বিট রয়েছে


উন্নত সংস্করণ:

পাটিগণিত কোডিং ব্যবহার করে আমরা এর lg num_possibilitiesপরিবর্তে চালিত করতে পারি ceil(lg num_possibilities)এবং ceilশেষে একটি নিতে পারি ।

  • 1 কার পালা তার জন্য বিট
  • 4 চারটি কাস্টিং সম্ভাবনার জন্য বিট
  • lg 6পাসের সম্ভাবনার জন্য বিট ।
  • 6 সাদা রাজার জন্য বিট
  • lg 60 বিটস (সবচেয়ে খারাপ পরিস্থিতি) কালো রাজার জন্য
  • lg 63 বিটস (কারণ আমি এটিকে চেকগুলি দেখার মাত্রায় জটিল করতে চাই না) সাদা রানির জন্য, যদি কোনও কিছু না থাকে তবে সাদা রাজার অবস্থান ব্যবহার করে
  • প্রতিটি অতিরিক্ত সাদা রাণী, একটি 1বিট দ্বারা অনুসরণ lg 62, lg 61তার পদের জন্য, ইত্যাদি বিট।
  • একটি 0বিট।
  • lg 63 কালো রানির জন্য বিটস (বা আরও কম, যদি কোনও সাদা রানী ছিল)
  • প্রভৃতি

প্রকৃতপক্ষে উপস্থিত নবম ব্যক্তির 66-nসম্ভাব্য মান রয়েছে। যদি কোনও রঙ কোনও রঙের জন্য অনুপস্থিত থাকে তবে আমরা 66-#men so farএটি রেকর্ডিংয়ে বিটগুলি ব্যয় করি (পৃথককারীটির জন্য আরও কিছুটা)। চরম ঘটনাগুলি হ'ল:

  1. প্রতিটি পক্ষ থেকে কমপক্ষে একটি অবরক্ষিত পদ্মাসহ উপস্থিত সমস্ত পুরুষ উপস্থিত রয়েছে। আমরা 5+lg 6গ্লোবাল স্টেট, 6+lg 60রাজাদের 29উপর, বিভাজক বিটগুলিতে এবং SUM_{n=32}^{63} lg nপদের বিটগুলিতে ব্যয় করি । গ্র্যান্ড টোটাল: ceil(225.82)বিটস হতাশাদায়ক।
  2. কেবল অরক্ষিত বন্ধকী বাকি। আমরা 5+lg 6বিশ্বব্যাপী রাজ্যে, 6+lg 60রাজাদের উপরে, 29বিভাজক বিটগুলিতে ব্যয় করে বলি 8*lg 63যে অন্য কোনও টুকরা নেই, এবং SUM_{n=48}^{63} lg nমহোদয়গুলির অবস্থানগুলিতে। গ্র্যান্ড টোটাল: ceil(188.94)বিটস আরও ভাল - প্রতিটি পক্ষের জন্য দ্বিতীয় রোক, নাইট এবং বিশপ সংরক্ষণ করে আমরা কিছুটা এগিয়ে এসেছি।

সুতরাং সবচেয়ে খারাপ ক্ষেত্রে 226 বিট হওয়ার সম্ভাবনা আছে , 3 এর একটি ক্ষুদ্র সঞ্চয় হিসাবে।

আমরা টুকরো টুকরো আগে পদ্মাগুলি এনকোড করে গড় ক্ষেত্রে আরও ভাল করতে পারি, যেহেতু সেগুলি পূর্ণ 64 এর চেয়ে 48 স্কোয়ারের মধ্যে সীমাবদ্ধ However এটির জন্য আরও 2 বিট ব্যয় শেষ হবে কারণ আমাদের পুরুষদের গণনা করার চেয়ে "কোন পাউন্ড" পতাকা লাগবে।


0

দাবা চেনাশোনাগুলিতে এটি একটি আলোচনার বিষয়।

164 বিট https://groups.google.com/forum/#!topic/rec.games.chess.computer/vmvI0ePH2kI 155 সহ এখানে একটি খুব সাধারণ প্রমাণ এখানে দেখানো হয়েছে http://homepages.cwi.nl/~tromp /chess/chess.html

সহজ সরল কৌশল:

  • পদ্মাগুলি সন্ধান করতে পারে এমন জায়গায় সীমাবদ্ধ করুন
  • আসল টুকরো এবং সম্ভাব্য প্যাশন প্রচারগুলি বিবেচনা করতে সেনাবাহিনীকে সীমাবদ্ধ করুন
  • পদোন্নতি এবং পরিস্থিতি যেখানে কঠোরভাবে প্রচার করা সম্ভব নয় সে সম্পর্কে কঠোর চিন্তা করুন

2
কেবল লিঙ্কযুক্ত উত্তরগুলি ভাল উত্তর নয়। উত্তরের কয়েকটি লিঙ্ক নয়, আপনার পোস্টের মধ্যে আপনার সম্পূর্ণ উত্তর সরবরাহ করা উচিত। এবং যদি আপনার উত্তরটি নিজের কাজ না হয় তবে আপনার পোস্টটি সম্ভবত একটি সম্প্রদায় উইকি করা উচিত।
পেস্টবিন.কম 0mr8spkT

পোস্টটি আসল। উত্তরে বিশদ যুক্ত করা হচ্ছে।
উইলিয়াম এন্টারিকেন

1
আপনি কেন নিজের উত্তরে বিষয়বস্তু অন্তর্ভুক্ত করবেন এটি এর একটি উদাহরণ। ২ য় লিঙ্কটি মারা গেছে। এটা কি? tromp.github.io/chess/chess.html
mbomb007

-2

ন্যূনতম: 0 বিট

সর্বোচ্চ: 1734 243 বিট (4,335 ৪.৪০১ বিট / বোর্ড মোড়িত)

প্রত্যাশিত: 351 177 বিট (4,376 ৪.৪৩০ বিট / বোর্ড মোড়িত)

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

চেষ্টা 1:

নিঃসন্দেহে আমি ভেবেছিলাম যে আমি প্রতিটি পদক্ষেপটি 12 বিট, ফর্মের 4 টি ট্রিপল (শুরু x, স্টার্ট y, শেষ x, শেষ y) যেখানে প্রতিটি 3 বিট রয়েছে সেগুলিতে এনকোড করতে পারি।

আমরা শুরুর অবস্থানটি ধরে নিব এবং সেখান থেকে টুকরো সরানো আগে সাদা হবে white বোর্ডটি এমনভাবে সাজানো আছে যে (0, 0) সাদা নীচের বাম কোণে।

উদাহরণস্বরূপ গেম:

  e4    e5
 Nf3    f6
Nxe5  fxe5
...    ...

হিসাবে এনকোড করা হবে:

100001 100010 100110 100100
110000 101010 101110 101101
101010 100100 101101 100100
...

12 একজন এনকোডিং এই বিশালাকার মি বিট যেখানে মি তৈরি প্যাচসমূহ সংখ্যা

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

চেষ্টা 2:

আমি বুঝতে পারি যে পূর্ববর্তী প্রয়াসের প্রতিটি পদক্ষেপ অনেকগুলি অবৈধ চালকে এনকোড করে। সুতরাং আমি কেবল আইনী পদক্ষেপগুলি এনকোড করার সিদ্ধান্ত নিয়েছি। আমরা নিম্নলিখিত চলনগুলি নিম্নরূপে গণনা করব, প্রতিটি বর্গকে এমন নম্বর দিন (0, 0) → 0, (1, 0) → 1, (x, y) → x + 8 y। টাইলগুলির মধ্য দিয়ে পরীক্ষা করুন এবং কোনও টুকরো আছে কিনা তা পরীক্ষা করে দেখুন এবং এটি স্থানান্তরিত হতে পারে কিনা। যদি তাই হয় অবস্থানগুলি যোগ করুন এটি একটি তালিকায় যেতে পারে। আপনি যে তালিকাটি তৈরি করতে চান সেই তালিকা সূচকটি চয়ন করুন। চলমান মোট চলনগুলির 1 টি দ্বারা 1 টি আরও জোড় এবং সম্ভাব্য পদক্ষেপের সংখ্যা যোগ করুন।

উপরের উদাহরণ হিসাবে: প্রথম অবস্থান থেকে প্রথম টুকরা যে স্থানান্তর করতে পারে তা হল বর্গাকার 1 নাইট, এটি স্কোয়ার 16 বা 18 এ যেতে পারে, সুতরাং তালিকায় সেগুলি যুক্ত করুন [(1,16),(1,18)]। এর পরে। নম্বরের নাইট, এটি চালগুলি যুক্ত করুন। সামগ্রিকভাবে আমরা পাই:

[(1,16),(1,18),(6,21),(6,23),(8,16),(8,24),(9,17),(9,25),(10,18),(10,26),(11,19),(11,27),(12,20),(12,28),(13,21),(13,29),(14,22),(14,30),(15,23),(15,31)]

যেহেতু আমরা মুভটি চাই (12, 28), তাই 20 সম্ভাব্য পদক্ষেপ রয়েছে বলে আমরা এটিকে 13 বেস হিসাবে এনকোড করেছি।

সুতরাং এখন আমরা গেম নম্বর জি 0 = 13 পেয়েছি

এরপরে আমরা কালোগুলির জন্যও একই কাজ করি কেবলমাত্র চলনগুলির তালিকা পাওয়ার জন্য আমরা বিপরীতে টাইলগুলি সংখ্যা (এটি সহজ করার জন্য, প্রয়োজনীয় নয়) ব্যতীত:

[(1,16),(1,18),(6,21),(6,23),(8,16),(8,24),(9,17),(9,25),(10,18),(10,26),(11,19),(11,27),(12,20),(12,28),(13,21),(13,29),(14,22),(14,30),(15,23),(15,31)]

যেহেতু আমরা মুভটি চাই (11, 27), তাই 20 সম্ভাব্য পদক্ষেপ রয়েছে বলে আমরা এটিকে 11 বেস হিসাবে এনকোড করি।

সুতরাং এখন আমরা গেম নম্বরটি পেয়েছি g 1 = (11 ⋅ 20) + 13 = 233

এরপরে আমরা সাদাগুলির জন্য নিম্নলিখিত পদক্ষেপের তালিকা পাই:

[(1,16),(1,18),(3,12),(3,21),(3,30),(3,39),(4,12),(5,12),(5,19),(5,26),(5,33),(5,40),(6,12),(6,21),(6,23),(8,16),(8,24),(9,17),(9,25),(10,18),(10,26),(11,19),(11,27)(13,21),(13,29),(14,22),(14,30),(15,23),(15,31)]

যেহেতু আমরা চলাটি (6, 21) চাই, আমরা 29 টি বেস হিসাবে 29 হিসাবে এনকোড করব যেহেতু 29 টি সম্ভাবনা রয়েছে।

সুতরাং এখন আমরা গেম নম্বরটি পেয়েছি জি 2 = ((13 ⋅ 20) + 11) 20 + 13 = 5433

এর পরে আমরা কালোগুলির জন্য নিম্নলিখিত পদক্ষেপের তালিকা পাই: [(1,11),(1,16),(1,18),(2,11),(2,20),(2,29),(2,38),(2,47),(3,11),(4,11),(4,18),(4,25),(4,32),(6,21),(6,23),(8,16),(8,24),(9,17),(9,25),(10,18),(10,26),(12,20),(12,28),(13,21),(13,29),(14,22),(14,30),(15,23),(15,31)]

যেহেতু আমরা পদক্ষেপটি চাই 10 (10, 18) $ (10, 18)

সুতরাং এখন আমরা গেম নম্বরটি পেয়েছি জি 3 = (((19 ⋅ 29 + 13) 20) + 11) 20 + 13 = 225833

এবং বাকি সমস্ত পদক্ষেপের জন্য এই প্রক্রিয়াটি চালিয়ে যান। আপনি g কে ফাংশন g (x, y, z) = x y + z হিসাবে ভাবতে পারেন । সুতরাং g 0 = g (1, 1, 13), g 1 = g (g (1, 1, 11), 20, 13), g 2 = g (g (g (1, 1, 13)), 20, 11), 20, 13), জি 3 = জি (জি (ছ (জি (1, 1, 19), 29, 13), 20, 11), 20, 13)

একটি গেম নম্বর জি 0 ডিকোড করতে , আমরা প্রাথমিক অবস্থান থেকে শুরু করি এবং সমস্ত সম্ভাব্য পদক্ষেপ গণনা করি। তারপরে আমরা g 1 = g 0 // l , m 0 = g 0 % l গণনা করব , যেখানে l সম্ভাব্য চলনের সংখ্যা, '//' হল পূর্ণসংখ্যা বিভাগ অপারেটর এবং '%' হল মডুলাস অপারেটর। এটি জি 0 = জি 1 + মি 0 ধরে রাখা উচিত । এরপরে আমরা মুভিটি মি 0 করব এবং পুনরাবৃত্তি করব।

উপরের উদাহরণ থেকে যদি g 0 = 225833 তবে জি 1 = 225833 // 20 = 11291 এবং মি 0 = 225833% 20 = 13. পরবর্তী জি 2 = 11291 // 20 = 564 এবং মি 1 = 11291% 20 = 11. তারপরে g 3 = 11291 // 20 = 564 এবং এম 2 = 11291% 20 = 11. অতএব g 4 = 564 // 29 = 19 এবং_ মি_ 3 = 564% 29 = 13. পরিশেষে জি 5 = 19 // 29 = 0 এবং মি 4 = 19% 29 = 19।

তাহলে কোন গেমটি এভাবে এনকোড করতে কতগুলি বিট ব্যবহৃত হয়?

সরলতার জন্য, ধরা যাক যে সর্বদা 20 টি পরিবর্তন রয়েছে এবং সবচেয়ে খারাপ অবস্থার জন্য আমরা সর্বদা সবচেয়ে বড়টিকে বেছে নিয়েছি, 19। আমরা যে সংখ্যাটি পাব তা 19 ⋅ 20 মি

+ 19 ⋅ 20 মি -1 + 19 ⋅ 20 মি -2 + ⋯ + 19 ⋅ 20 + 19 = 20 মি + 1 - 1 যেখানে _ মি চলার সংখ্যা। 20 মি + 1 - 1 এনকোড করতে আমাদের লগ 2 (20 মি + 1 ) বিটগুলি প্রয়োজন যা প্রায় (এম + 1) ∗ লগ 2 (20) = 4.3219 ∗ (এম + 1)

গড়ে মি = 80 (প্রতি প্লেয়ারে 40 টি চাল) তাই এনকোড করতে 351 বিট লাগবে। আমরা যদি অনেকগুলি গেম রেকর্ড করতাম তবে আমাদের একটি সার্বজনীন এনকোডিং লাগবে যেহেতু আমরা জানি না যে প্রতিটি সংখ্যার জন্য কত বিট লাগবে

সবচেয়ে খারাপ ক্ষেত্রে যখন এম = 400 (প্রতি খেলোয়াড়ের জন্য 200 চালান) তাই এনকোড করতে 1734 বিট লাগবে।

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

দ্রুত গণনা:

এখানে 12 টি অনন্য টুকরা রয়েছে বা স্কোয়ারটি খালি থাকতে পারে যাতে দাবাবোর্ডে তাদের অবস্থান নির্ধারণ করতে 13 64 হয় । এটি একটি বিশাল পর্যালোচনা কারণ এটিতে অনেকগুলি অবৈধ অবস্থান অন্তর্ভুক্ত। আমরা যখন হয় মি আমরা 20 সম্পর্কে তৈরি করেছেন খেলা মধ্যে প্যাচসমূহ মি অবস্থান। সুতরাং আমরা যখন 20 মি = 13 64 খুঁজছি । এম = 64 * লগ 20 (13) = 54.797 পেতে উভয় পক্ষের লগইন করুন । এটি দেখায় যে 55 টি পদক্ষেপে আমাদের যে কোনও অবস্থানে যেতে সক্ষম হওয়া উচিত।

এখন যেহেতু আমি m = 55 নয় মি = 400 বলে সবচেয়ে খারাপ পরিস্থিতি গণনা করেছি আমি আমার ফলাফলগুলি সম্পাদনা করব। এমন একটি অবস্থান এনকোড করতে যেখানে এম = 55 243 বিট নেয়। আমি আরও বলতে চাই যে গড় কেসটি এম = 40 এর কাছাকাছি যা এনকোড করতে 177 বিট লাগে।

যদি আমরা পূর্ব থেকে ইমোরটাইজেশন আর্গুমেন্টটি ব্যবহার করি তবে আমরা 1734 বিটগুলিতে 400 "দাবা বোর্ড" এনকোড করছি যাতে আমরা পাই যে প্রতিটি "দাবা বোর্ড" সবচেয়ে খারাপ ক্ষেত্রে 4.335 বিট গ্রহণ করে।

নোট করুন যে জি = 0 একটি বৈধ গেমকে বোঝায়, এটি সর্বনিম্ন বর্গের টুকরোটি সর্বনিম্ন স্কোয়ারে চলে যায়।

অতিরিক্ত নোট:

আপনি যদি গেমের একটি নির্দিষ্ট অবস্থান উল্লেখ করতে চান তবে আপনাকে সূচকটি এনকোড করতে হতে পারে। এটি ম্যানুয়ালি যোগ করা যেতে পারে যেমন গেমটিতে সূচককে একত্রিত করুন বা প্রতিটি বাঁককে শেষ সম্ভাব্য পদক্ষেপ হিসাবে একটি অতিরিক্ত "শেষ" পদক্ষেপ যুক্ত করুন। এটি এখন খেলোয়াড়দের সম্মতি জানাতে বা টানা ২ টি খেলোয়াড়কে ড্রয়ের জন্য সম্মত হতে বোঝাতে পারে। এটি কেবল তখনই প্রয়োজনীয় যদি গেমটি অবস্থানের ভিত্তিতে চেকমেট বা অচলাবস্থায় শেষ না হয়, এই ক্ষেত্রে এটি অন্তর্ভুক্ত থাকে। এক্ষেত্রে এটি গড় বিটগুলির সংখ্যা গড়ে 356 এ নিয়ে আসে এবং সবচেয়ে খারাপ ক্ষেত্রে 1762।


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

@ অ্যান্ডারস ক্যাসরগ: খুব সত্য। এটি সত্যই উদ্দেশ্য উপর নির্ভর করে। আপনি যদি অন্য সমস্ত অ্যালগরিদমের সাথে একটি সম্পূর্ণ গেমটি সংরক্ষণ করার চেষ্টা করছেন তবে এটি এম * সি বাইট নিতে হবে যেখানে এম চালগুলির সংখ্যা এবং সি তাদের আউটপুটটির আকার। সুতরাং আপনি যদি 160 বিট সলিউশন ব্যবহার করে পুরো 80 মুভ গেমটি সংরক্ষণ করার চেষ্টা করছেন তবে এটি 12800 বিট নিতে হবে এবং আমার কেবল 351 লাগবে the প্রতিযোগিতার পক্ষে আমি স্বীকার করি যে আপনি সঠিক, এটি উল্লেখ করা যেহেতু পুরো গেমগুলি সঞ্চয় করতে চান কেবল বোর্ডগুলি নয় এটি খুব সাধারণ।
খুব ভাল

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

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

একটি সংক্ষিপ্ত সমমানের গেমটি ব্যবহার করা ভাল, যদি আপনি বাস্তবে প্রমাণ করতে পারেন যে প্রতিটি অবস্থান 200 টার্ন বা তারও কম সময়ে পৌঁছানো যায় (এখনই এটি কেবল অনুমানের মতো দেখায়)। 100 টিরও বেশি আইনী পদক্ষেপের সাথে আপনার দাবা পদের জন্য অ্যাকাউন্টও করতে হবে, যদি না আপনি প্রমাণ করতে পারেন যে তারা আপনার নির্মাণের মধ্যে উঠে না। গেমের চালগুলির সংখ্যা দ্বারা আপনার ফলাফলকে ভাগ করে নেওয়া এখনও এই চ্যালেঞ্জের নিয়মগুলির দ্বারা অনুমোদিত নয়।
অ্যান্ডারস কাসের্গ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.