सबसे छोटा शतरंज बोर्ड संपीड़न


39

एक एल्गोरिथ्म या प्रोग्राम लिखें जो एक शतरंज बोर्ड को एन्कोड और डिकोड कर सकता है। लक्ष्य उस मोड़ पर एक खिलाड़ी के लिए सभी आंदोलन की संभावनाओं को निर्धारित करने के लिए इस्तेमाल किया जा सकने वाला शतरंज का सबसे छोटा प्रतिनिधित्व है (एक बार डिकोड किया गया)।

एन्कोडिंग दिखाने में सक्षम होना चाहिए:

  • किसकी बारी है।
  • खिलाड़ी प्रत्येक पक्ष पर महल कर सकते हैं या नहीं।
  • क्या खिलाड़ी एन-पास कर सकता है, और यदि हां, तो उनके कौन से प्यादे?
  • सभी टुकड़ों की स्थिति।

कास्टिंग पर महत्वपूर्ण ध्यान दें: यदि सफेद अपने राजा को एक मोड़ देता है, और फिर इसे वापस ले जाता है, तो यह स्पष्ट होना चाहिए कि वे उसके बाद दोनों तरफ महल नहीं कर सकते। अगर वे अपने बाएं या दाएं बदमाश चले गए तो भी वही होगा। हालाँकि बोर्ड नेत्रहीन रूप से उसी स्थिति में है जैसा कि दो साल पहले था, खेल राज्य बदल गया है। अधिक जानकारी यहाँ: http://en.wikipedia.org/wiki/Chess#Castling

एन-पासेंट पर महत्वपूर्ण नोट: यह भी एक मोड़-संवेदनशील कदम है। अधिक जानकारी के लिए नियम पढ़ें। http://en.wikipedia.org/wiki/Chess#En_passant

आवश्यकतानुसार इनपुट और आउटपुट का निर्धारण करें। जो भी इसे सबसे अधिक संपीड़ित कर सकता है, उसके लिए प्रमुख सहारा!

आपका स्कोर सबसे खराब स्थिति निर्धारित किया जाता है - बिट्स में अधिकतम संभव आकार। सुनिश्चित करें कि आप यह दिखाते हैं कि आपने उस संख्या की गणना कैसे की और आपने क्या हिसाब लगाया। सबसे छोटी सबसे खराब स्थिति के लिए गोली मारो!


"बिटवाइज़" से आपका क्या मतलब है?
पीटर टेलर

क्या यह सबसे छोटा कोड है या सबसे संकुचित है? अधिकांश-संपीड़ित अधिक दिलचस्प है।
जस्टिन

स्पष्ट नहीं करने के लिए क्षमा करें। बिटवाइस इस अर्थ में कि आप इसे केवल संपीड़ित कर सकते हैं यदि आप इसे बिट्स के रूप में प्रतिनिधित्व करना शुरू करते हैं, जिसके लिए कुछ बिटवाइज़ ऑपरेशन की आवश्यकता होगी। मेरी ओर से खराब उपयोग। इसके अलावा सबसे संकुचित, सबसे छोटा कोड नहीं।
जर्मनी का रासायनिक जल

2
@GeekWithALife हां, एक ही समय में बोर्ड पर 18 रानियां होना संभव है। इस लिंक का अनुसरण करें और उदाहरण के लिए प्लेबैक बटन पर क्लिक करें।
स्क्वीश ossifrage

1
@AJMansfield, जो लगभग 28 पुरुषों के साथ बोर्डों के लिए उपयोगी हो सकता है, लेकिन मैं गणना करता हूं कि सभी 32 पुरुषों के साथ 117 बिट्स बोर्ड के लिए बहुत हैं, जो लक्ष्य से लगभग 50 बिट्स कम है। जटिलता यह है कि एक बार जब आप 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 बिट्स का एक प्रभावशाली आकार है !

तो K +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 बिट्स


रेव ३

न्यूनतम: 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) v1 न्यूनतम आकार 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 के बीच किसी भी जगह से सबसे अधिक बार होता है। अगले पंजे हैं, फिर रूक्स, नाइट्स, बिशप और सबसे कम बार रानी और राजा हैं।

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 बाइट्स) में एन्कोड किया जा सकता है

तो कुल 187 बिट (23.375 बाइट) में।

ख़ाका

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

अभी तक कोई कोड नहीं लिखा है।

ध्यान दें कि 3 बिट्स जो अप्रयुक्त हैं। तो अधिकतम 213बिट्स है


संभव सुधार

1) हेडर ब्लॉक फॉर्म को 24 से 8 बिट्स (@Peter टेलर सुझाव के साथ) घटाएं

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 बिट्स है


3) बोर्ड पर क्या टुकड़े बचे हैं, इसके आधार पर एक अलग एन्कोडिंग योजना का उपयोग करें।

बोर्ड और वहाँ आवृत्ति पर क्या टुकड़े के आधार पर पेड़ एन्कोडिंग को बदलकर।

एक अंत खेल राज्य के लिए एक संभव एन्कोडिंग (कोई पंजे)

        /\            
       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.

याद रखें कि खाली वर्गों और रंग के लिए अतिरिक्त बिट्स हैं।


उदाहरण

आइए केवल QK बचे हुए का एक उदाहरण दें

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 बिट) में बोर्ड के लिए सबसे छोटी एन्कोडिंग की गणना करता हूं

फिर भी यह गणना करना कि यह कोडिंग योजना अधिकतम आकार को कैसे प्रभावित करती है।


सुधार ४

कास्टिंग के लिए बिट्स की संख्या घटाकर सिर्फ 2 बिट करें। जिस खिलाड़ी की बारी है, उसके लिए बस कास्ट करना है।

 0 Castling possible (from header block)
 LR 
 00

इसके बारे में सोचकर, हेडर ब्लॉक के अंदर 2 बिट्स को शामिल करना बेहतर होगा।


आपको एन पास करने वाले के लिए 16 बिट्स की आवश्यकता नहीं है। अधिकांश एक मोहरे में अंतिम मोड़ आया, इसलिए चार बिट्स पर्याप्त हैं (उदाहरण के 1111लिए "एन एन पासेंट संभव" या कॉलम बाइनरी के रूप में अन्यथा)।
पीटर टेलर

पेड़ में प्यादों को बेहतर स्थिति क्यों मिलती है? आम मामले में वे सबसे आम हैं, लेकिन चरम मामलों में आर / बी / एन 10 बार दिखाई दे सकते हैं।
21

@PeterTaylor, वास्तव में एन पास के लिए 3 बिट्स पर्याप्त हैं। यदि आप केवल काले रंग के 5 वें रैंक वाले मोहरे (सफेद चाल को मानते हुए) को गिनते हैं, तो 8 अमान्य हो जाते हैं।
21

1
ध्यान दें कि आपका सबसे खराब मामला वास्तव में संभव नहीं है। कैद के बिना पदोन्नति असंभव है (कम से कम एक कब्जा प्रति 2 पदोन्नति की आवश्यकता है)।
बदसूरत

2
64 पदों (सफेद या काले राजा के लिए) को एनकोड करने के लिए आपको 6 बिट्स (2 ** 6 = 64) की आवश्यकता है।
लैम्बब्रुस्कोअइडो

17

192 बिट्स (सबसे खराब स्थिति)

यहाँ एक बहुत ही सरल भंडारण योजना है जिसे मनमाने मोहरे के साथ सामना करना चाहिए, और कभी भी 64 + 4 × 32 = 192 बिट्स की आवश्यकता नहीं होती है:

  • पहले 64 बिट्स एक बिटबोर्ड को स्टोर करते हैं जो बताता है कि टुकड़े कहाँ हैं (लेकिन वे क्या हैं) नहीं। यही है, हम शतरंज के प्रत्येक वर्ग के लिए एक बिट को स्टोर करते हैं (वर्ग ए 1 से शुरू होता है, फिर बी 1, सी 1, आदि वर्ग एच 8 तक) जैसे कि एक खाली वर्ग को 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 (पंक्तियों 1 और 8 पर) = एक किश्ती जो कभी स्थानांतरित नहीं हुई है, और जिसका राजा भी कभी नहीं चला है, और जो इसलिए कास्ट करने के लिए पात्र है
    7 (पंक्तियों 4 और 5 पर) = एक मोहरा जिसमें सिर्फ दो वर्ग उन्नत हैं, और इसलिए प्रवेशार्थी को पकड़ा जा सकता है

यह सब एक साथ डालें:

     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 तक राउंडिंग यह राज्यों 6 और 7 का उपयोग करके 13 बिट्स की बचत कर रहा है, और आप केवल 8 बिट्स में उसी जानकारी को एन्कोड कर सकते हैं।
पीटर टेलर

धन्यवाद, @FireFly! मैंने आपके सुझाव पर अमल किया है। (पीटर टेलर का सुझाव और भी अधिक कुशल है, निश्चित रूप से, लेकिन मैंने अभी तक इसका उपयोग नहीं किया है क्योंकि मुझे वर्तमान योजना की सरल द्विआधारी एन्कोडिंग पसंद है। आप इसे हमेशा एक अलग प्रविष्टि के रूप में प्रस्तुत कर सकते हैं ...)
इल्मरी करोनेंन 27'14

ठीक है - यह हल्के से जटिल है। लेकिन मेरी बात सुनो। यदि आप टर्न इंडिकेटर पर केवल 1 बिट मारते हैं, तो आप किंग को मोहरे के साथ बदल सकते हैं जिसे मैं pawn1 कहता हूं। प्यादा बदलना pawn0। अब, जब भी कोई (पास नहीं होने वाला कमजोर) मोहरा - आप अगले टुकड़े पर एक बिट जानकारी प्राप्त करते हैं (या तो प्यादा 0 के लिए 0 या प्यादा 1 के लिए 1)। क्योंकि 16 पंजे हैं, आप टर्न इंडिकेटर के लिए 16 बिट्स कम 1 प्राप्त करते हैं। जब भी कोई मोहरा होता है जो एन पास करने के लिए कमजोर होता है तो आपको इसके बाद एक बिट वापस जोड़ना होगा। लेकिन जैसे ही एन पासेंट को तुरंत होना चाहिए, आपके न्यूनतम लाभ 14 बिट्स हैं।
185 बजे user5957401

आप बिशप जैसी चीज के साथ भी एक समान काम कर सकते हैं। मान लीजिए कि आपके पास 'विशेष क्षेत्र' में बिशप नहीं है (इसके कोनों में 10 धब्बे और इसके किनारे पर केंद्र पंक्ति) विशेष के रूप में चिह्नित है। क्योंकि आप इसका स्थान जानते हैं - आप इसका बिशप जानते हैं। अब आपके पास दो बिशप हैं और उनमें से प्रत्येक को अगले टुकड़े पर 0 या 1 दे सकते हैं। यह एक और 4 बिट्स को देता है - लेकिन सबसे खराब स्थिति में सभी विशेष क्षेत्रों में बिशप हैं, और कोई लाभ नहीं है।
user5957401

14

160 बिट सबसे खराब स्थिति

मेरे पिछले जवाब को 22 बाइट्स पोस्ट करने के बाद, मुझे आश्चर्य होने लगा कि क्या हम 21 बाइट्स में उतर सकते हैं। हालाँकि जब मैंने पीटर टेलर के अद्भुत 166 बाइट्स को देखा तो मुझे लगा कि "रुको, ऐसा लगता है कि पाँच 32-बिट शब्द संभव हो सकते हैं!"

तो काफी विचार के बाद, मैं इस के साथ आया: 159.91936391 बाइट्स (एक बहुत तंग फिट!) इस स्तर के संपीड़न को काफी जटिल कार्यक्रम की आवश्यकता होगी लेकिन मैंने सोचा है कि इसे उचित समय में कैसे चलाया जाए।

यह एक लंबी पोस्ट होने जा रही है, इसलिए कृपया मेरे साथ सहन करें, मैं आज जो कुछ भी कर सकता हूं उसे पोस्ट करूंगा और जल्द ही कुछ बिट्स कोड जोड़ूंगा।

तो, यह कैसे करना है:

एन पजेशन और कास्टलिंग अवैध पदों द्वारा एन्कोडेड (0 बिट्स)

एन पास

जैसा कि अन्य उत्तरों में उल्लेख किया गया है, अधिकतम 5 संभावित वर्ग हैं जिन पर एन पासेंट के लिए कमजोर मोहरा खड़ा हो सकता है। ये खिलाड़ी के पंजे के आगे के वर्ग हैं, जिनकी बारी है।

इसे एनकोड करने के लिए, पहले या अंतिम पंक्ति में किसी एक वर्ग पर जो कुछ भी है, पास करने के लिए संवेदनशील मोहरा का आदान-प्रदान किया जाता है। यह या तो एक आदमी या एक खाली वर्ग हो सकता है। यह अवैध स्थिति पैदा करता है, क्योंकि पंजे इन पंक्तियों पर नहीं हो सकते। डिकोडर को एन पास करने वाले की जानकारी निकालकर, प्यादा को उसकी सही स्थिति में लौटना चाहिए।

इसके लिए क्रॉलिंग एन्कोडिंग के साथ हस्तक्षेप न करने के लिए, यह महत्वपूर्ण है कि जिन चौकों पर राजा खेल की शुरुआत में खड़े होते हैं, वे परेशान न हों, और एन पासिंग एन्कोडिंग प्रक्रिया राजाओं को एक-दूसरे के बगल में नहीं रखती है। जो एक अवैध राजा की स्थिति होगी। इन बिंदुओं में से दूसरे को संतुष्ट करने के लिए, एनकोडर के पास दो विकल्प होते हैं कि वह किस वर्ग में एन पास प्यादा का आदान-प्रदान करता है। 5 प्यादों में से प्रत्येक के लिए पहली पसंद वर्ग ए 8, बी 8, सी 8, जी 8, एच 8 हैं। दूसरी पसंद: A1, B1, C1, G1, H1।

कैसलिंग

एक राजा जिसे महल में जाने की अनुमति है, वह अभी भी अपने प्रारंभिक वर्ग पर है। अपने शुरुआती वर्ग पर सफेद राजा के साथ, कुल 63 वर्ग हैं जहाँ काले राजा खड़े हो सकते हैं, जिनमें से 58 वैध हैं (उन्हें सफ़ेद राजा के ठीक बगल में जाने की अनुमति नहीं है क्योंकि वे खुद को जाँच में लगाएंगे।) यदि श्वेत राजा को महल में जाने की अनुमति दी जाती है, तो उसे या तो उसके बाएं बदमाश, उसके दाहिने हाथ, या दोनों के साथ महल की अनुमति दी जाती है। इस प्रकार 3x58 = 174 संभावनाएं हैं जहां सफेद राजा महल कर सकते हैं, एक और 174 जहां काला राजा महल कर सकते हैं, और एक और 3x3 = 9 जहां दोनों महल कर सकते हैं, कुल 357।

दो राजाओं के 420 अवैध इंतजाम हैं, जहां वे बगल के चौकों पर हैं: 3x4 = 12 जब कोने में सफेद राजा होता है, तो 5x24 = 120 जब वह किनारे पर होता है, और 8x36 = 288 जब वह दूसरे वर्ग में होता है। इसलिए सभी संभावित कालिंग संभावनाओं को एनकोड करने के लिए आसानी से पर्याप्त अवैध पद हैं।

यदि कम से कम एक राजा को महल में जाने की अनुमति है, तो एनकोडर कास्टलिंग डेटा और उन राजाओं के डेटा को एक तालिका में महल में जाने की अनुमति नहीं देगा (या वैकल्पिक रूप से, एक एल्गोरिथ्म का उपयोग करें जो मैं यहां निर्दिष्ट नहीं करूंगा) और एक अवैध उत्पादन दो राजाओं की स्थिति। इसके बाद इन चौकों पर जो कुछ भी हुआ, उसके साथ राजाओं का आदान-प्रदान होगा।

यह महत्वपूर्ण है कि एन पास करने वाले के बाद इसे डिकोड किया जाए और उसे हटा दिया जाए, अन्यथा कुछ संभावित हस्तक्षेप होते हैं।

तुलना

इसलिए, अब तक मैंने बिट्स का उपयोग नहीं किया है! पीटर के जवाब को देखते हुए, मुझे अभी भी सांकेतिक शब्दों में बदलना है:

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 पुरुषों के सबसे खराब मामले के लिए है (पीटर का उत्तर देखें।) नीचे मैं दिखाऊंगा कि मैं ** में चिह्नित दोनों बिंदुओं पर मामूली सुधार (कम से कम 29 पुरुषों के मामले में) कैसे करता हूं।

किन चौकों पर कब्ज़ा है / किसकी बारी है?

जिन चौकों पर कब्जा है, उन्हें एनकोड करने का आसान तरीका 64 बिट ग्रिड के साथ है। इससे हमें यह भी पता चलता है कि कितने वर्ग हैं। हालांकि यह कुछ हद तक बेकार है क्योंकि वहां 32 से अधिक वर्गों का कब्जा होना संभव नहीं है। मेरा समाधान 1 के कब्जे वाले वर्गों के लिए सांकेतिक शब्दों में बदलना का उपयोग करना है जब यह व्हाइट की बारी है और 0 के कब्जे वाले वर्गों के लिए सांकेतिक शब्दों में बदलना है जब यह ब्लैक की बारी है। अब सभी संयोजनों का उपयोग किया जाता है और कोई अपशिष्ट नहीं है।

इस प्रकार हम मोड़ को संचय करने के लिए थोड़ा सा बचाते हैं: 32 1 से कम, यह सफेद बारी है, 32 1 से अधिक है, यह काले रंग की बारी है। एकमात्र अस्पष्ट मामला तब है जब सभी पुरुष बोर्ड पर हैं और 32 1 और 32 0 के हैं। इसलिए केवल इस मामले के लिए एक अतिरिक्त बिट की आवश्यकता है। जब तक कोई कब्जा नहीं हुआ है तब तक कोई पदोन्नति नहीं हो सकती है, यह अतिरिक्त बिट समग्र रूप से सबसे खराब स्थिति को प्रभावित नहीं करता है (जो कि 3 पुरुषों और 29 शेष लोगों के साथ होता है।)

चौकों पर कब्जा करने वाले पुरुषों का रंग

हम ऊपर से जानते हैं कि कितने आदमी हैं। पास्कल के त्रिकोण का निम्न अर्क बताता है कि काले और सफेद रंग के विभिन्न वितरणों के लिए कितनी संभावनाएं हैं। उदाहरण के लिए, 3 पुरुषों के लिए, संभावनाएं हैं: 3 काले पुरुष (1 क्रमपरिवर्तन) 2 काले, 1 सफेद, (3 क्रमपरिवर्तन), 1 काले, 2 सफेद (3 क्रमपरिवर्तन), 3 श्वेत (1 क्रमपरिवर्तन) कुल 2 है। 3 = 8। सामान्य तौर पर, पुरुषों की कम संख्या के लिए 2 एन संभावनाएं हैं। हालांकि सभी काले और सभी सफेद संभावनाएं अवैध हैं (कम से कम प्रत्येक पक्ष के राजा को बोर्ड पर होना चाहिए) इसलिए कानूनी क्रमपरिवर्तन की वास्तविक संख्या 2 n -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

हम देख सकते हैं कि p प्यादे, १५ पुरुष, ० पदोन्नति जैसे मामले के लिए, क्रमपरिवर्तन की संख्या less प्यादों के लिए १६ पुरुषों, ० पदोन्नति की तुलना में थोड़ी कम है। हालाँकि अगर हम 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
मेरे दशमलव अल्पविराम को दशमलव बिंदुओं में बदलने के लिए @Einacio को बहुत धन्यवाद। मैंने एक स्पैनिश कंप्यूटर पर एक्सेल पर अपनी कई टेबलें लगाई थीं, और इसे पोस्ट करना एक बड़ा काम था, इसलिए इसे ठीक करना कुछ ऐसा था जिसे मैंने बाद के लिए छोड़ दिया था। जैसा कि मैंने कहा, मैंने अभी तक इस पद को समाप्त नहीं किया है, मैं अपने क्रमपरिवर्तन गिनती कार्यक्रम और कोड के कुछ टुकड़े एन्कोडिंग / डिकोडिंग के बारे में जोड़ूंगा जब मेरे पास समय होगा। पुनश्च। मुझे पता नहीं था कि बहुत से लोग इसे पढ़ रहे हैं :-)
लेवल रिवर सेंट

अंत में आप बिट्स के बजाय बाइट्स को लेने में कामयाब रहे, जो कि आपके मतलब की चीज़ है, जिससे पाठकों को कुछ सिचुएशन हो सकती है
MasterX244

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 ^ 31 <2 ^ 72 हो सकते हैं। उसी तरह जैसे कि आप उन्हें एनगैजेंट (13) और नॉन-एनजेंट (59) में विभाजित करते हैं, लेकिन अतिरिक्त जटिलता के बिना।
Alin Stoian

ऐसा करना वास्तव में 1 अतिरिक्त बिट का उपयोग करेगा। कारण यह है कि (सबसे खराब स्थिति) 5 अलग-अलग संभावनाएं हो सकती हैं, लेकिन मुझे अभी भी "कोई भी", 6 वें राज्य के लिए संभावना को घोषित करने की आवश्यकता नहीं है। इस मामले में 1 अतिरिक्त बिट समाप्‍त घोषित करने में संभव होगा या नहीं (और इस दृष्टिकोण के साथ मैं 30 ब्लॉक को समेटने वाले एन्कोन्टेंट ब्लॉक को एन्कोडिंग के साथ एक और भी सरल दृष्टिकोण का उपयोग कर सकता हूं, और 3 बिट्स का उपयोग करने के लिए अलग से जांच के लिए उपयोग करूंगा, जो कि होगा यह भी +1 बिट उपयोग का नेतृत्व करता है)। निम्न 5 वीं पंक्ति 5 संभावित समर्थकों (श्वेत की बारी) को सक्षम करेगी: BWBBWBBW
FIQ

हाँ तुम सही हो।
Alin Stoian

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 पदोन्नति हैं और हम अभी भी सबसे खराब स्थिति से बेहतर कर रहे हैं, जो 68.613 बिट्स है जब एक में 14 पुरुष और दूसरे में 15 पुरुष हैं।

ध्यान दें कि यह अभी भी एक संपूर्ण प्रतिनिधित्व होने से लंबा रास्ता है, क्योंकि यह कई अवैध पदों की अनुमति देता है।

क्रमचय तालिका की गणना के लिए कोड:

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 पुरुषों का उपयोग करते हैं और राजा के पदों के लिए कोई विशेष बिट नहीं करते हैं।
एलिन स्टोयियन

@AlinStoian, उफ़। मेरे पास मेरे प्रोग्राम के आउटपुट लूप के <बजाय था <=। इस पर ध्यान दिलाने के लिए धन्यवाद। मैं अभी भी बोर्ड पर होने वाले सभी 32 पुरुषों को विशेष-केसिंग करके पिछले स्कोर को पुनर्प्राप्त कर सकता था, लेकिन मैं अभी ऐसा नहीं करूंगा।
पीटर टेलर

दिलचस्प डेटा! 3 पुरुषों के साथ सैद्धांतिक सबसे खराब स्थिति
लेवल रिवर सेंट

@steveverrill, जो मैं वास्तव में करना चाहूंगा, वह है "एक" ब्लॉक और फिर टुकड़ा पदों और मूल्यों में पदोन्नति के पद और संख्या को सांकेतिक शब्दों में बदलना। हालांकि, वहाँ कम से कम 2 ^ 38 पद पदों को ध्यान में रखते हुए पदोन्नति के बिना हैं, और उन्हें कुशलतापूर्वक मानने से अब तक मुझे बचा लिया गया है।
पीटर टेलर

@petertaylor यदि आपके पास बोर्ड पर केवल 16 प्यादे हैं, जो 48 चौकों तक सीमित है, तो आपके पास 48! / 32 /! / 8/8! = 29019905518636890 संभावनाएं हैं। 2 ^ 54 से थोड़ा अधिक! इनमें से, कुछ अवैध हैं, आप बोर्ड के एक तरफ एक रंग के सभी प्यादे नहीं रख सकते।
लेवल रिवर सेंट

5

178 बिट्स (एक चुटकी पर 174!) सबसे खराब स्थिति

नमस्ते, बस कोडिंग में वापस आ रहा हूं, जो मैंने कॉलेज के बाद से वास्तव में नहीं किया है। मैंने इस साइट को देखा और सोचा कि यह दिलचस्प है। मैंने थोड़ी चिकित्सीय जाँच की और यह प्रतीत होता है कि एक पूर्ण एल्गोरिथ्म के लिए कम से कम 146 बिट्स की आवश्यकता होती है, शायद काफी अधिक (मैं एक पल होने पर टिप्पणियों में समझाऊंगा।)

वैसे भी, यह वह तरीका है जिससे मैं डेटा की संरचना करता हूं। मूल अवधारणा 178 बिट्स पर आती है, लेकिन कुछ गुड़ पोकरी के साथ इसे 174 (यानी 21 3/4 बाइट्स) तक लाया जा सकता है। 175 कार्यक्रम के लिए थोड़ा आसान है, अधिक मानव पठनीय है, और अभी भी 22 बाइट्स के भीतर है।

ए) दोनों राजाओं की स्थिति: सफेद और काले 12 बिट्स के लिए 6 बिट्स

ब) शेष 62 वर्गों पर, जिनका कब्जा है? 62 बिट्स का एक मैट्रिक्स

ग) किसकी बारी है? 1 बी.आई.टी.

कुल सो एफएआर: 75 बिट्स

डी) एन पास। यदि इसे स्थानांतरित करने के लिए सफेद की बारी है, तो 5 काले पंजे लग सकते हैं जैसे कि उन्हें एन पासंट पर कब्जा किया जा सकता है। काले मोहरे को पंक्ति 5 पर होना चाहिए (नीचे से ऊपर की ओर शून्य से शुरू), और इसके आगे एक सफेद मोहरा होना चाहिए। संभव कैप्चर की अधिकतम संख्या के साथ एक स्थिति इस तरह दिखती है:

BWBBWBBW

यदि पंक्ति 5 पर 6 काले प्यादे होते हैं, तो सफ़ेद के पास खड़े होने के लिए केवल 2 वर्ग होंगे और केवल 4 काले प्यादों को धमकी दे सकते हैं, इसलिए एक ही समय में एन पास से खतरे में 5 से अधिक काले मोहरे होना संभव नहीं है। इसलिए हमें नंबर 1 से 5 की आवश्यकता है, जो यह दर्शाता है कि (5 तक) पंक्ति 5 पर पंजे हैं जिनके पास एक शत्रुतापूर्ण है (इस मामले में सफेद) अगले मोहरे पर अंतिम मोड़ पर उन्नत 2 वर्ग थे ( या, शून्य यदि कोई सुबह नहीं इस स्थिति में अंतिम मोड़ पर इस तरह से स्थानांतरित किया गया था।)

ई) अप करने के लिए 30 कब्जे वाले वर्गों (राजाओं सहित नहीं) वे क्या शामिल हैं?

10 संभावनाएं हैं, प्रत्येक को दशमलव संख्या द्वारा दर्शाया गया है।

कम से कम महत्वपूर्ण बिट रंग का प्रतिनिधित्व करता है।

इसलिए भी संख्याएँ सफेद हैं, विषम संख्याएँ काली हैं।

सफेद काला

प्यादा 0/1 (या महल को अनुमति दी गई रूक)

नाइट 2/3

बिशप 4/5

6/7 पर पहुंच गया

रानी 8/9

* एक किश्ती जिसे महल में जाने की अनुमति है (और इसलिए पहली या अंतिम पंक्ति से कभी नहीं ले जाया गया है) 6 या 7. के बजाय 0 या 1 से दर्शाया गया है। इसे मोहरे के साथ भ्रमित नहीं किया जा सकता है, क्योंकि पहले पर पंजे नहीं मिल सकते हैं या अंतिम पंक्ति।

यह 30 अंकों तक की एक दशमलव संख्या देता है, जिसे हम 6 से गुणा कर सकते हैं और फिर एन पास के लिए कोड जोड़ सकते हैं। परिणामी संख्या 103 बिट्स में फिट होगी, जो ऊपर उल्लिखित 75 में जोड़े जाने पर 103 + 75 = 178 बिट्स है । वास्तव में, यदि हम 6 के बजाय केवल 10 से गुणा करते हैं, तो इसका उपयोग किए गए बिट्स की संख्या पर कोई फर्क नहीं पड़ता है, और डिकोडिंग आसान है।

यह 22 बाइट्स से सिर्फ 2 बिट अधिक है। हालाँकि हम इसे 174 बिट्स तक नीचे धकेल सकते हैं, जैसा कि नीचे बताया गया है।

यदि कोई टुकड़ा नहीं पकड़ा गया है, तो एक मोहरे को बढ़ावा दिया जाना असंभव है

प्रमाण इस प्रकार है। कल्पना कीजिए कि सफ़ेद खेल के प्रारंभ से ही (उदाहरण के लिए) कॉलम ई पर अपने मोहरे को बढ़ावा देने के लिए जुनूनी है। इस मोहरे के विपरीत एक काला मोहरा है जो रास्ते में है। इसलिए इस मोहरे को बढ़ावा देने के लिए, निम्न में से एक होना चाहिए:

1) काले मोहरे को पकड़ लिया जाता है।

2) काला मोहरा एक और टुकड़ा पकड़ता है और इसलिए रास्ते से हट जाता है।

3) सफेद मोहरा एक निकटवर्ती स्तंभ जैसे स्तंभ D पर एक मोहरे को पकड़ता है।

4) सफ़ेद मोहरा पास (या पास से गुजरता है) एक निकटवर्ती स्तंभ पर एक काला मोहरा होता है और फिर उसी आसन्न स्तंभ पर एक टुकड़े को पकड़ता है, जिससे सफेद मोहरा स्तंभ बदल जाता है।

केस 4 सबसे दिलचस्प है, क्योंकि यह स्तंभ ई पर शुरू होने वाला सिर्फ सफेद मोहरा नहीं है जो अब प्रचार का एक स्पष्ट रास्ता है। कॉलम E पर बने रहने वाले काले मोहरे को भी बढ़ावा दे सकता है। इसलिए एक एकल कैप्चर को बढ़ावा देने के लिए प्रत्येक रंग के एक मोहरे का रास्ता साफ हो सकता है।

वैसे भी, यह तथ्य कि कोई मोहरा तब तक प्रचार नहीं कर सकता जब तक कि एक टुकड़ा पकड़ा नहीं जाता है इसका मतलब है कि हमें 30 वें टुकड़े को संग्रहीत करने की आवश्यकता नहीं है। हम इसे समाप्त करके (या घटाव द्वारा, क्योंकि खेल की शुरुआत में टुकड़ा कोड का पूरा सेट हमेशा एक ही राशि = 80 तक जोड़ता है) कर सकते हैं। एक मामूली बात यह है कि हमें यह सुनिश्चित करना होगा कि वर्ग जहां बदमाश हैं। खेल की शुरुआत में खड़े पहले स्कैन में से एक हैं (क्योंकि यदि वे अंतिम थे, तो हमें नहीं पता होगा कि बदमाश महल है या नहीं।) यह आसानी से पंक्ति 0 को स्कैन करके किया जाता है और फिर 7 से 1: पंक्तियों के लिए r = के लिए 8 से 1 स्कैन पंक्ति [r mod 8]।

तो, (बी) में बिट्स का मैट्रिक्स हमें बताएगा कि कितने टुकड़े हैं (राजाओं को छोड़कर।) यदि पूर्ण 30 हैं, तो एन्कोडिंग करते समय अंतिम टुकड़े को अनदेखा करें, डिकोडर काम करेगा कि यह क्या था। अब हमारे पास 29 अंकों की दशमलव संख्या है, जिसे हम 6 से गुणा करते हैं और En Passant कोड में जोड़ते हैं। परिणामी संख्या केवल 99 बिट्स में निचोड़ देगी, कुल 99 + 75 = 174 बिट्स देगी।

एक उदाहरण के रूप में यहां एक वास्तविक स्थिति है। व्हाइट ने अपनी पहली चाल (उन्नत राजा का मोहरा) बना ली है और यह ब्लैक की बारी है।

rnbqkbnr
pppppppp


    P

PPPP PPP
RNBQKBNR

ए) राजाओं की स्थिति ( अष्टकोणीय में सफेद / काला, 12 बिट्स ): 03 73 = 000011 111011

ख) किन चौकों पर कब्जे हैं? पंक्ति शून्य (नीचे पंक्ति) से शुरू करें और फिर राजाओं को छोड़ कर ऊपर से नीचे तक अन्य सभी पंक्तियाँ:

1111 111

1111 111
11111111
00000000
00000000
00001000
00000000
11110111 

C) ब्लैक की बारी: बिट बिट = 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)

एन्कोडिंग करते समय डिकोडिंग से और बाएं से दाएं (रिवर्स ऑर्डर) पर स्कैन करना सबसे अच्छा है। इसका मतलब यह है कि जब कम टुकड़े होते हैं, तो हमारे पास एक छोटी संख्या होगी, जबकि अधिकतम स्थिरता बनाए रखना (यानी हम चाहते हैं कि खाली जगह / शून्य अग्रणी हो, न कि पीछे, कम से कम कब्जे वाले बोर्डों के संपीड़न को सक्षम करने के लिए।) जब हमारे पास दो राजा होते हैं। बोर्ड पर, हमारे पास ऊपर बताए गए 75 बिट्स होंगे, साथ ही सबसे अच्छे मामले में एन पासेंट डेटा = 78 बिट्स स्टोर करने के लिए 3 बिट्स होंगे। प्रत्येक अतिरिक्त टुकड़ा 3.5 बिट्स के नीचे आता है (2 टुकड़े 7 बिट्स में संग्रहीत किए जा सकते हैं, क्योंकि 100 <128)।

इसमें एक व्यावहारिक समस्या यह है कि 64 बिट पूर्णांक चर में फिट होने के लिए 99 बिट पूर्णांक बहुत बड़ा है, जिसका अर्थ है कि कई प्रोग्रामिंग भाषाएं इसके लिए समर्थन प्रदान नहीं करती हैं (आप केवल 29-30 अंकों के एक स्ट्रिंग प्रतिनिधित्व को बदल नहीं सकते हैं संख्या एक पूर्णांक में।) 22 बाइट्स के लिए एन्कोडिंग का एक आसान तरीका के रूप में, हम 30 अंकों की संख्या (29 टुकड़ा कोड + एन पास कोड) को दो 15 अंकों की संख्या में तोड़ सकते हैं, जिनमें से प्रत्येक 50 बिट्स में फिट होगा (कुल 100 बिट्स प्लस 75 ऊपर उल्लिखित 175 बिट्स को सबसे खराब स्थिति बनाता है।)

अधिकतम संपीड़न के लिए, जैसा कि ऊपर कहा गया है, 29 दशमलव अंक और एन पास कोड (6 संभावित मान), केवल 99 बिट्स (कुल 174 बिट्स) में फिट होंगे, लेकिन इस आकार के पूर्णांक के लिए भाषा से समर्थन के बिना यह है। कार्यक्रम के लिए जटिल। 29 रंग बिट्स को अलग करना और टुकड़ों-प्रकार कोड (5 संभावनाएं) और एन पास कोड (6 संभावनाएं) को रंगों से अलग करना आसान हो सकता है (70 बिट, लगभग 64 बिट चर में फिट होता है।)


आखिरी आदमी के साथ अच्छी चाल।
पीटर टेलर

5

यहां एक पूर्ण समाधान है, वास्तविक सबसे खराब मामला 181 बिट्स

यहां ध्यान एक सरल कार्यक्रम है जिसे आप आसानी से समझ सकते हैं

इनपुट एफईएन है, यहां खुलने की स्थिति है, इसके छह क्षेत्र हैं (5 और 6 पर ध्यान नहीं दिया गया):

rnbqkbnr / pppppppp / 8/8/8/8 / PPPPPPPP / RNBQKBNR w KQkq - 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 बिट
  • Castling - 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 बिट्स

FIQ इस सरल योजना में दो सुधार दिखाता है , लेकिन उन्हें कोड करना कठिन है:

  • 1 और 8 पंक्तियों पर टुकड़ा एन्कोडिंग से बिट 2 निकालें क्योंकि पंजे वहां नहीं जा सकते (16 बिट बचत तक)
  • पंजे का उपयोग करने योग्य काक को सांकेतिक शब्दों में बदलना (4 बिट बचत)

इस उत्तर (संक्षिप्तता के लिए) में दिखाया गया एकमात्र शेष कोड नहीं है: फ़ील्ड ( split /\s/) और चर असाइनमेंट में इनपुट FEN को तोड़ना ।


एक खिलाड़ी अपने सभी प्यादों को बढ़ावा दे सकता है (यह देखते हुए कि वह दुश्मन के प्यादों को पकड़ने में सक्षम है); Qn4QQ / Qb6 / Qq1k4 / Qr6 / Qb6 / Qr6 / Qn4NK / RNB2B1R b - 0
Krzysztof Szewczyk

@KrzysztofSzewczyk, हाँ जो ऊपर PPpp=> पर नोट किया गया हैQQq_
विलियम एंट्रीकेन

4

कुल डेटा को 33 बाइट चाहिए

(टिप्पणी में किसी को धन्यवाद मुझे एहसास हुआ कि यह मोहरे के प्रचार के लिए काम नहीं करता है। जब मैं इसे हल कर सकता हूं, तो यह अपडेट करेगा)

पहले बाइट के लिए हम पाँच बिट्स का उपयोग करते हैं:

  • पहला बिट: खिलाड़ी की बारी, 1 = सफेद
  • दूसरा बिट: काला राजा पक्ष महल, 1 = महल
  • तीसरा बिट: काली रानी साइड महल, 1 = महल कर सकते हैं
  • चौथा सा: सफेद राजा पक्ष महल, 1 = महल
  • पांचवें बिट: सफेद रानी पक्ष महल, 1 = महल कर सकते हैं

अगले 32 बाइट्स का उपयोग प्रत्येक शतरंज के टुकड़े का प्रतिनिधित्व करने के लिए किया जाता है, पूर्वनिर्धारित क्रम में

  • 3-बिट्स: पंक्ति का प्रतिनिधित्व करते हैं
  • 3-बिट्स: कॉलम का प्रतिनिधित्व करते हैं
  • 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
जब एक मोहरा आठवीं रैंक तक पहुँच जाता है और एक नाइट, बिशप, किश्ती या रानी को बढ़ावा दिया जाता है, तो आपके पूर्वनिर्धारित आदेश का अधिक उपयोग नहीं होगा ।
स्क्वीश ossifrage

@ स्नो ओके नोर्कनोब ओके मैं अल्गोरिथम पर काम कर रहा हूं, यह सिर्फ देर रात को है और मैं थका हुआ हूं, इसलिए मैं इसे थोड़ा धीमा कर रहा हूं
ace_HongKongIndependence

अगर आप भी एक समाधान नहीं है तो ठीक है, तो आपने यह क्यों पोस्ट किया?
दरवाज़े

3
यदि आप लोग अभी भी सोचते हैं कि यह उत्तर बकवास है और यहाँ कोई मूल्य नहीं है तो आगे बढ़ें और इसे हटाने के लिए मतदान करें और इसे डाउनवोट करें और आप यहां मेरा खाता भी हटा सकते हैं। मैं सिर्फ वही साझा करना चाहता हूं जो मैं सोच सकता था, आप लोगों को इतना मतलबी क्यों होना चाहिए?
ace_HongKongInd डिपेंडेंस

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

फिर, बेस 11 में एक विशाल 64-अंकीय संख्या, जो तब एन-पासेंट की स्थिति का प्रतिनिधित्व करने वाले अंत में एक और अंक जोड़ने के लिए 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 बिट्स है।


सुधार के लिए बदसूरत करने के लिए धन्यवाद।


यह इक्का के एल्गोरिथ्म के समान है, लेकिन यह पूर्व निर्धारित क्रम में टुकड़ों के बजाय बोर्ड की स्थिति का उपयोग करता है, जो दोनों इसे प्यादा प्रचार समस्या होने से बाहर रखता है और डेटा को थोड़ा काट दिया जाता है।
जो।

आप 0 और 8 के बीच एक संख्या के रूप में एन-पास को बचा सकते हैं (किस स्तंभ पर वर्तमान खिलाड़ी एन-पास को पकड़ सकता है)। 13^64 * 9239.99, 11 बिट्स की बचत है। अलग से राजा पदों एन्कोडिंग द्वारा अधिक सहेजें।
ugoren

मेरे पोस्ट पर टिप्पणी करने वाले स्नो के डॉर्कनोब के अनुसार, इस तरह का उत्तर "उत्तर नहीं" है। बस केह रहा हू। मेरे जवाब में C कोड जोड़ने से पहले FYI उनकी टिप्पणी पोस्ट किया गया था।
ace_HongKongIndependence 16

@ यूगोरेन: मैं उस के बारे में भूल गया। आप सही कह रहे हैं, मैं भूल गया कि केवल एक मोहरा एक ही समय में एन-पास हो सकता है।
जो जे।

@ace: आपका उत्तर अमान्य नहीं है क्योंकि इसमें एन्कोडिंग और डिकोडिंग कोड शामिल नहीं है; यह अमान्य है क्योंकि यह मोहरे-प्रचार के मामले में नहीं है (जिस स्थिति में आपके पूर्वनिर्धारित आदेश कुछ भी नहीं करते हैं)। समस्या, इसके मूल में, एक डेटा-एन्कोडिंग योजना के लिए पूछता है। यह कार्यक्रम केवल उसके साथ इंटरफेस करने के लिए कुछ है।
जो जेड

3

? बिट्स

(179 217 सबसे खराब स्थिति, 17 सर्वश्रेष्ठ मामले, प्रारंभिक बोर्ड के लिए 179)


विवरण एन्कोडिंग

अतिरिक्त मेटाडाटा में किसकी बारी होती है (एक बिट) और कास्टलिंग (चार बिट्स, अर्थात राजाओं की तरफ सफेद महल? क्वीन्स की तरफ? और इसी तरह काले रंग के होते हैं)।

बोर्ड की स्थिति के लिए, हम इसे सक्रिय टुकड़ों के एक सेट के रूप में कूटबद्ध करते हैं। ठीक है, वास्तव में, हम उन टुकड़ों के लिए एक विशेष क्रम में गणना करना सुनिश्चित करते हैं जो मैं थोड़ा समझाता हूं। प्रत्येक टुकड़े के लिए हम इसका रंग (एक बिट), इसकी किस्म (6 बिट्स को शामिल करने के लिए तीन बिट्स, प्लस "मोहरा द्वारा लिया जा सकता है" के लिए एक अतिरिक्त प्रकार), साथ ही साथ इसकी स्थिति भी संग्रहीत करते हैं।

यहां दिलचस्प हिस्सा है: एक टुकड़े की स्थिति को सांकेतिक शब्दों में बदलना, इसे एक समन्वय के रूप में संग्रहीत करने के बजाय, हम पिछले टुकड़े से इसकी सापेक्ष दूरी को संग्रहीत करते हैं जब टुकड़ों को बाएं से दाएं, ऊपर से नीचे के क्रम में गणना करते हैं (यानी 8) , बी 8, ..., जी 1, एच 1)। इसके अलावा, हम दूरी को एक चर-लंबाई की संख्या के रूप में संग्रहीत करते हैं, 1जिसका अर्थ है कि यह टुकड़ा पिछले के ठीक बगल में है, 0xx1-3 टुकड़ों 000xxxको छोड़ने के लिए , 4-10 टुकड़ों को छोड़ने के 000000xxxxलिए, 11-25 के लिए, 0000000000xxxxx26-56 के लिए और अंत 000000000000000xxxमें 57-62 के लिए।

उदाहरण

मैंने बनाया एक सार यह एन्कोडिंग के साथ कोडित कुछ पदों में से, और कुछ टिप्पणियों के साथ प्रारंभिक स्थिति के लिए एक टिप्पणी किए गए।

मुझे नहीं पता कि सबसे खराब स्थिति के आकार का विश्लेषण कैसे किया जाए, लेकिन उदाहरण के तौर पर जीआईटी में जाना, मेरा मानना ​​है कि एल्गोरिदम कम से कम कुछ हद तक कुशल होना चाहिए।


डिकोडर का कार्यान्वयन

इस एन्कोडिंग के लिए नीचे एक त्वरित और गंदा डिकोडर है (इनपुट के रूप में द्विआधारी डेटा को पाठ में एन्कोड किया गया है, जैसा कि ऊपर एनोटेट उदाहरण में दिया गया है, और उन चीजों पर स्किप कर रहा है जो '0' या '1' नहीं हैं)। स्टिकआउट करने के लिए एक यूनिकोड शतरंज बोर्ड का निर्माण करता है।

#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

@squeamishossifrage कि किसी को 217 बिट्स की आवश्यकता प्रतीत होती है: gist.github.com/FireyFly/8639791 (परीक्षण-मामले के लिए धन्यवाद, मैं इसे एक ट्रिक के साथ आज़माना चाहता था!)
फायरली

अरे, यह बुरा नहीं है। बढ़ा चल!
स्क्विश ओशरीफेज

2

अधिकतम: 184 बिट्स, न्यूनतम: 75 बिट्स

मैं अपनी योजना को तैयार करने के लिए टुकड़ों के लिए कोडिंग के लिए @ AdamSpeight के हफ़मैन से प्रेरित था। मुझे संदेह है कि यह जीत जाएगा, लेकिन इसकी गणना योग्य सीमाएं हैं।

यह योजना शतरंज के टुकड़ों को मानती है जैसे कि 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ब्लैक के लिए)। 0खाली स्थानों को एनकोड करने के लिए इस्तेमाल किया जा सकता है। ये विचार हमें पूरी प्रक्रिया के लिए एक वर्ग-दर-वर्ग एन्कोडिंग बनाने की अनुमति देते हैं, जो भी प्रक्रिया हम चाहते हैं। मैं पुनरावृति आदेश मान लूंगा a1, b1, c1, ... f8, g8, h8। इसका मतलब यह है कि इन कोडों को सूचीबद्ध करने के लिए जैसा कि ऊपर दिया गया है, यह जानकारी को छोड़ देता है कि यह किसकी बारी है। एक बहुत ही सरल शतरंज इंजन पंजे, किश्ती और राजाओं के लिए "कक्षाएं" का उपयोग कर सकता है, यह निर्धारित करने के लिए कि क्या कास्टिंग और एन पासेंट कानूनी हैं। इसके अलावा, यह योजना आसानी से मोहरे के प्रचार को संभालती है। यदि कोई खिलाड़ी एक बदमाश को मोहरा देता है, तो या तो राजा या रानी-पक्ष कोड का उपयोग तब तक किया जा सकता है जब तक "स्थानांतरित" संस्करण चुना जाता है।

पैथोलॉजिकल पदों को छोड़कर जो मुझे नहीं लगता कि कभी भी हो सकता है, इस एन्कोडिंग के लिए सबसे खराब स्थिति तब है जब सभी टुकड़े अभी भी बोर्ड पर हैं और पिछले खिलाड़ी ने मोहरे को दो स्थानों पर आगे बढ़ाया। एक उदाहरण के रूप में, नीचे का बोर्ड एन्कोड करता है 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 बिशप के लिए, किलों के लिए 28, रानियों के लिए 12 और राजाओं के लिए 12।

जैसे-जैसे टुकड़े बढ़ते गए और कैप्चर होते गए, एन्कोडिंग का आकार गिरता जाएगा। सबसे अच्छा मामला परिदृश्य बोर्ड पर अकेले दो राजाओं द्वारा दर्शाया गया है: खिलाड़ी को इंगित करने के लिए 1 बिट + 62 बिट्स इंगित करने के लिए खाली वर्ग + 12 बिट्स राजाओं को इंगित करने के लिए 75 बिट्स की न्यूनतम लंबाई देता है।

मैं वापस आऊंगा और इस प्रतिक्रिया को कुछ कोड के साथ संपादित करूंगा जो आज या कल बाद में इस एन्कोडिंग को प्रदर्शित करता है। अभी के लिए, मैं यह देखने के लिए उत्सुक हूं कि अन्य लोग इस एन्कोडिंग के बारे में क्या सोचते हैं।


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 बाइट्स सबसे खराब स्थिति, और बहुत जटिल नहीं:

A. कौन से वर्ग ने कब्जा किया: 64 बिट्स = 8 बाइट्स बी। किस रंग के लिए <= 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 * 4 * 9 = 285696 को घटाकर 2 * (32 * 31 + 31 * 3 + 31 * 3 + 3 * 3) * 6 = 14244 किया जा सकता है। अधिक से अधिक 6 एन पास पीडि़त अभ्यर्थी (कोई नहीं सहित), और एक ही सेट के अंदर कास्टलिंग अधिकार और किंग पोजिशन को एन्कोडिंग करते हैं, जो कि शुरुआती वर्ग में राजा होने पर केवल कास्टलिंग अधिकार का उपयोग करते हैं। यह 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-4th बिट्स: 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? Pawn0 और pawn1? वे प्रकार इतने निर्दिष्ट हैं, क्योंकि वे हमें इस टुकड़े के बाद सम्मिलित करने के लिए थोड़ा सा बताते हैं। तो बिशप ० का अर्थ है कि इसके बाद, ० होगा - यानी कि अगला टुकड़ा सफेद है। बिशप 1 हमें बताता है कि अगला टुकड़ा काला है, और मोहरा 0 और प्यादा 1 एक ही काम करते हैं। (यदि यह टुकड़ा अंतिम टुकड़ा है, तो यह हमें इसके बजाय अगले मोड़ के बारे में बताता है)।

मेरे सबसे खराब मामले में बोर्ड पर सभी टुकड़े शामिल हैं, इसलिए 16 प्यादे और 4 बिशप के साथ, यह मुझे 20 बिट बचाता है। मैं 173 से नीचे हूँ।

ठीक है। मेरे सबसे बुरे मामले में एक और बिट के लिए - एक बार जब एक रंग के 16 एन्कोडेड होते हैं, तो हम रंग को एन्कोडिंग करना बंद कर देते हैं - जैसा कि हम जानते हैं कि यह आगे की ओर जा रहा है। मेरे सबसे खराब मामले में अब एक सफेद टुकड़ा शामिल है जो इसे दूर के कोने पर बनाता है जिसमें कोई कब्जा नहीं है। वहां, मैं केवल एक बिट बचा लेता हूं। 172।

मैं अब उस क्रम को बदलने जा रहा हूं जिसमें मैं टुकड़ों का नाम देता हूं। हम उन्हें बाहर की ओर बढ़ते हुए स्तंभों के साथ नाम देंगे। शुरुआत में नामित बोर्ड वही रहेगा, लेकिन जब मैं उस पर टुकड़े डालता हूं, तो मैं नीचे दाईं ओर से शुरू करता हूं, और उस स्तंभ पर ऊपर जाता हूं। फिर मैं काले रंग के नीचे दाएं कूदता हूं, और उस कॉलम के ऊपर जाता हूं। मैं व्हाइट के निचले दाएं अज्ञात सेल में कूदता हूं, और आगे - इसका मतलब है कि मेरा सबसे खराब मामला फिर से शुरुआत है। मेरा कारण मेरी एन पास करने की चाल के साथ है, अगले दो बिट्स मैं खो देता हूं, और कास्टिंग करता हूं।

अब, एक मोहरे को बढ़ावा देने के लिए (जैसा कि लंबाई में चर्चा की गई है) एक टुकड़ा पर कब्जा करना होगा। इस प्रकार, जब हम जानते हैं कि 32 टुकड़े हैं, तो हमें केवल उनमें से 31 को निरूपित करना होगा। अंतिम टुकड़ा विशिष्ट रूप से पहचाना जाता है। जैसा कि यह पता चला है, मेरे लिए, यह केवल 2 बिट्स बचाता है - क्योंकि मेरा आखिरी टुकड़ा एक मोहरा / बिशप हो सकता है (जो आम तौर पर मुझे 3 बिट्स की लागत देता है क्योंकि मैं अगले टुकड़े पर एक बचाता हूं) जो पहले से ही निर्धारित किया गया है और इसलिए केवल 2 बिट्स। मैं 170 बिट्स तक नीचे हूं।

जब प्यादों को बढ़ावा मिलता है, तो वे बस अपना प्रकार बदलते हैं। प्रत्येक टुकड़े के लिए जो बोर्ड से दूर जाता है मैं अपने आप को (न्यूनतम) 3 बिट्स से छुटकारा दिलाता हूं, और दो मोहरे प्रमोशन ने मुझे 2 बिट्स की लागत दी है, इसलिए मैं पदोन्नति में (धीरे) कम कर रहा हूं।

कैसलिंग। ऐसा होने के लिए, न तो राजा और न ही प्रासंगिक बदमाश चले गए। इस प्रकार, जब एक बदमाश इसे कास्ट करने में सक्षम होता है और राजा अपने मूल स्थानों पर होगा। तो, कास्ट करने में सक्षम बदमाशों को उसी रंग के राजाओं के रूप में सूचीबद्ध किया जाएगा। जैसा कि यह अवैध है (बोर्ड पर एक ही रंग के दो राजा या तीन राजा) और केवल प्रत्येक रंग के लिए तीन संभावित सेटअप में हो सकता है (बाएं, दाएं, दोनों बदमाश राजा के रूप में सूचीबद्ध हैं) - डिकोडिंग पूरी तरह से संभव है। इसलिए, बिना किसी काट-छाँट के हमने कास्टिंग कास्ट किया है।

En Passant यहां हम अवैध पदों का भी उपयोग करेंगे। एक समय में केवल एक मोहरा एन पास होने का खतरा हो सकता है। यह इसकी चौथी पंक्ति में होना चाहिए। जो मोहरा असुरक्षित है वह अपनी घरेलू पंक्ति में 'फ़्लिप' हो जाएगा - जो कुछ भी है उसके साथ स्विच किया गया। जैसा कि प्यादा अपनी पहली पंक्ति में है - एक अवैध स्थिति, डिकोडर के लिए स्थिति स्पष्ट होगी - यह पदों को उल्टा कर देगा, और मोहरा के रूप में कमजोर के रूप में मोहरे को चिह्नित करेगा।

हमें आदेश के बारे में बताने की जरूरत थी क्योंकि आखिरी टुकड़े की 'विशिष्ट पहचान' होनी चाहिए। एक मानक क्रम में, हम यह नहीं बता पाएंगे कि पीछे के कोने में बदमाश महल में घुस सकते हैं - यह ज्ञात नहीं है। जब हम बाहर से काम करते हैं, तो हम गारंटी देते हैं कि जहाँ कहीं भी यह बदमाश 'लिस्टेड' है, तो इसे अपने ही कोने में या बोर्ड के बीच में रखें क्योंकि इसे एक एन पासिंग कमजोर मोहरे के साथ बदल दिया गया था, उसके बाद एक लिस्ट होगी। यह - तो हम बदमाश के प्रकार कहा जाता है। हम जानते हैं कि इसके बाद एक टुकड़ा होगा क्योंकि, एक मोहरा के लिए कमजोर होने के लिए इसके अंदर एक मोहरा होना चाहिए (जो ऊपर दिए गए निर्देशों के अनुसार बाद में एन्कोड किया जाएगा)।

ओह, और यह सुनिश्चित करने में मदद करने के लिए कि सबसे खराब स्थिति में बोर्ड पर सभी टुकड़े शामिल हैं, एक बार जब हमारे पास 32 से कम टुकड़े होते हैं, तो हम 64 बिट बोर्ड का उपयोग कर सकते हैं ताकि सफेद होने पर टुकड़ों का प्रतिनिधित्व करने के लिए 0 के उपयोग से पदों पर कब्जा कर सकें। बारी है और जब यह अश्वेतों की बारी है।

इसलिए हम पास और मुफ्त के लिए कास्टिंग कर रहे हैं। हमने अंतिम टुकड़ा मुफ्त में उठाया, हालांकि एन पासेंट और कास्टलिंग नियमों के साथ उस खेल को अच्छा बनाने के लिए इसे कुछ परिश्रम के साथ लिया। हमने मानक टुकड़ों पर 20 बिट्स खोदा। मेरा मानना ​​है कि यहां सबसे खराब स्थिति में एक सफेद सफेद मोहरा शामिल है, जो आगे और उसकी रानी के बीच में एक काला टुकड़ा है, जबकि सभी टुकड़े बोर्ड पर हैं। त्वरित डबल चेक: पहला टुकड़ा कैप्चर किया गया है - इसे मोहरा कहें, प्यादा में बोर्ड से 3 बिट्स, अंतिम टुकड़े के रूप में बोर्ड पर 3 बिट्स, टर्न मार्कर गायब होने में एक बिट बंद। बोर्ड पर दो प्यादे 2 बिट्स को बढ़ावा दें। आह, मैं 171 पर हूं।

EDIT मैंने एक (वर्किंग?) डिकोडर के लिए R - नीचे में कोड जोड़ा है। यह इनपुट के रूप में बूलियन्स के वैक्टर लेता है - (क्षमा करें - मैं किसी भी चीज में अच्छी तरह से कोडिंग करने में सक्षम नहीं हूं जो मुझे वास्तव में बिट्स का उपयोग करने देगा) मैंने शुरुआत की स्थिति भी शामिल की है।

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 कार्यों का निर्माण करता है। एक जो टुकड़ों और बोर्ड संरचना के कुछ बुनियादी पृथक्करण करता है, साथ ही साथ टुकड़े के प्रकार और किसी भी 'अंतर्निहित' टुकड़े का पता लगाता है। अगला कार्य बोर्ड संरचना में उन टुकड़ों के साथ थोड़ा विचित्र (और मेरे प्रारंभिक एल्गोरिथ्म से अलग) क्रम [कोड टिप्पणियों में समझाया गया] से भरता है। अगला फ़ंक्शन बोर्ड में भरा हुआ लेता है और किसी भी अवैध स्थिति का पता लगाता है - यह फिर उन्हें ठीक करता है और प्यादे का नाम बदल देता है जो कि निष्क्रिय "x प्यादा-ई" और किसी भी बदमाश को "x rook-c" को महल में रख सकते हैं। अंतिम फ़ंक्शन एक आवरण है जो उन कार्यों को क्रम में चलाता है और एक आउटपुट देता है जो वर्तमान बोर्ड के साथ-साथ मोड़ भी है।

मैंने प्रारंभ स्थिति के एन्कोडिंग को भी शामिल किया है (हालांकि यह देखने के लिए आपको कॉल करना होगा c(startboard,newpieces)और कोड उस स्थिति में आवरण फ़ंक्शन को कॉल करेगा।


यह दिलचस्प है। मैं अवधारणा के प्रमाण के रूप में एक कार्यान्‍वयन देखना पसंद करूंगा।
मेगो

कार्यान्वयन आमतौर पर अवधारणा के प्रमाण से परे कुछ कदम है, लेकिन मैंने एक डिकोडर जोड़ा है। यह R में है और इस प्रकार बिट्स के बजाय बुलियन का उपयोग करता है (क्षमा करें - बहुत अधिक समय का उपयोग नहीं करना चाहता था)। लेकिन मेरा मानना ​​है कि यह अवधारणा का प्रमाण होना चाहिए।
user5957401

0

229/226 बिट्स

यह बहुत सफल नहीं निकला, लेकिन अन्य लोगों को उसी रास्ते से नीचे जाने से बचा सकता है।

सरल संस्करण:

  • 1 बिट किसके लिए है
  • 4 चार कास्टिंग संभावनाओं के लिए बिट्स
  • 3एन पास होने की संभावनाओं के लिए बिट्स । इसकी और अधिक गहराई है जिसे मैंने पहले समझा था। एन पैंसेंट को मोहरे के रूप में उसी रैंक (पंक्ति) से आगे बढ़ने वाले प्यादा द्वारा किया जाना चाहिए जो कि कब्जा कर लिया गया है। मामले विश्लेषण दर्शाता है कि एक बार हम जानते हैं कि रंग के कई प्यादे जो पिछले चले गए उन्नत कैसे ठीक दो वर्गों, वहाँ ज्यादा से ज्यादा 6 हो जाएगा passant एन मामलों (मामले कोई प्यादा की चपेट में है कि वहाँ सहित अंपैसां )। इससे भी बदतर स्थिति 5 प्यादों की है (संभावित रूप से सभी संवेदनशील: जैसे PpPPpPPpकि पांच संवेदनशील Pएस)। 6 प्यादे के साथ वहाँ एक ही रैंक में अधिक से अधिक 2 दुश्मन प्यादे, जिनमें से प्रत्येक में अधिक से अधिक 2 प्यादे धमकी कर सकते हैं कर रहे हैं अंपैसां । इसलिए हमें ceil(lg 6) = 3यहां बिट्स की जरूरत है।

फिर बोर्ड। बोर्ड में 64 वर्ग हैं, इसलिए एक वर्ग सूचकांक 6 बिट्स में एन्कोड किया जा सकता है। हम पुरुषों को रैंक, बारी-बारी से रंगों को सूचीबद्ध करते हैं, राजा के साथ शुरू करते हैं।

  • 6बिट्स: सफेद राजा की स्थिति। (बोर्ड पर होने की गारंटी)।
  • 6बिट्स: ब्लैक किंग की स्थिति। (बोर्ड पर होने की गारंटी। सबसे खराब स्थिति में कि सफेद राजा एक कोने में है, 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 काली रानी के लिए बिट्स (या कम, अगर कोई सफेद रानी थीं)।
  • आदि।

Nth आदमी जो वास्तव में मौजूद है उसके 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पर यह कहते हुए खर्च करते हैं कि कोई अन्य टुकड़े नहीं हैं, और प्यादों के पदों पर। भव्य कुल: बिट्स। बेहतर - प्रत्येक पक्ष के लिए दूसरे बदमाश, शूरवीर और बिशप को बचाकर हमने थोड़ा आगे बढ़ा दिया।298*lg 63SUM_{n=48}^{63} lg nceil(188.94)

तो सबसे खराब स्थिति 226 बिट्स होने की संभावना है , 3 की समय पर बचत के लिए।

हम निश्चित रूप से टुकड़ों से पहले प्यादों को एन्कोडिंग करके औसत मामले में बेहतर कर सकते हैं, क्योंकि वे पूर्ण 64 के बजाय 48 वर्गों तक सीमित हैं। हालांकि, सबसे खराब स्थिति में कि सभी पुरुष बोर्ड पर हैं और सभी प्यादों को बढ़ावा दिया गया है, मुझे लगता है। इससे 2 बिट्स अधिक खर्च होंगे क्योंकि हमें पुरुषों की गिनती करने में सक्षम होने के बजाय "नो पावन्स" ध्वज की आवश्यकता होगी।


0

यह शतरंज के हलकों में चर्चा का विषय है।

यहाँ 164 बिट्स के साथ एक बहुत ही सरल प्रमाण है https://groups.google.com/forum/# .topic / rec.games.chess.computer / vmvI0ePH2kI 155 यहाँ दिखाया गया है http://homepages.cwi.nl.ntromp /chess/chess.html

सरलीकृत रणनीति पर:

  • प्यादों को उस स्थान पर सीमित करें जहां प्यादे मिल सकते हैं
  • सेनाओं को मूल टुकड़ों और संभावित मोहरे के प्रचार पर विचार करने के लिए सीमित करें
  • पदोन्नति और उन स्थितियों के बारे में सोचें जहां पदोन्नति संभव नहीं है

2
लिंक-ओनली उत्तर अच्छे उत्तर नहीं हैं। आपको अपने पोस्ट के भीतर पूरा उत्तर प्रदान करना चाहिए, न कि केवल उत्तर के कुछ लिंक। और अगर आपका जवाब आपका अपना काम नहीं है, तो आपको शायद अपने पोस्ट को एक सामुदायिक विकी बनाना चाहिए।
ace_HongKongInd डिपेंडेंस

पोस्ट मूल है। उत्तर देने के लिए विवरण जोड़ना।
विलियम एंट्रीकेन

1
यह इस बात का उदाहरण है कि आप अपने उत्तर में सामग्री को क्यों शामिल करते हैं। दूसरा लिंक मृत है। यही है क्या? tromp.github.io/chess/chess.html
mbomb007

-2

न्यूनतम: 0 बिट्स

मैक्स: 1734 243 बिट्स (4.335 4.401 बिट्स / बोर्ड परिशोधन)

अपेक्षित होना: 351 177 बिट्स (4.376 4.430 बिट्स / बोर्ड परिशोधन)

चूंकि मैं इनपुट और आउटपुट निर्धारित कर सकता हूं, लेकिन मैं चाहता हूं कि मैंने इस बिंदु तक गेम के इतिहास को एन्कोडिंग के साथ जाने का फैसला किया। एक फायदा यह है कि यह किसकी बारी की अतिरिक्त जानकारी है, एन-पासेंट, और जिसके पास महल की क्षमता है, जहां व्युत्पन्न किया जा सकता है और एन्कोड नहीं किया जा सकता है।

प्रयास 1:

Naively मैंने सोचा कि मैं प्रत्येक कदम को 12 बिट्स, फ़ॉर्म के 4 ट्रिपल (प्रारंभ x, प्रारंभ y, अंत x, अंत y) में शामिल कर सकता हूं, जहां प्रत्येक 3 बिट्स है।

हम शुरुआती स्थिति को मान लेंगे और पहले सफेद होने के साथ टुकड़ों को वहां से स्थानांतरित करेंगे। बोर्ड को इस तरह से व्यवस्थित किया गया है कि (0, 0) सफेद रंग के निचले बाएं कोने में है।

उदाहरण के लिए खेल:

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

इनकोड किया जाएगा:

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

यह 12 मीटर बिट्स की एन्कोडिंग की ओर जाता है जहां मीटर की गई चालों की संख्या होती है

एक ओर यह वास्तव में बड़ी मिल सकता है, दूसरे हाथ पर आप इसे खुद खेल है इसलिए प्रत्येक एन्कोडिंग वास्तव में encodes होने के लिए प्रत्येक चाल पर विचार कर सकते m "शतरंज बोर्ड"। यदि आप इसे परिशोधित करते हैं तो आपको लगता है कि प्रत्येक "शतरंज बोर्ड" 12 बिट्स है। लेकिन मुझे लगता है कि यह थोड़ा धोखा है ...

प्रयास 2:

मैंने महसूस किया कि पिछले प्रयास में प्रत्येक कदम कई अवैध चालों को कूटबद्ध करता है। इसलिए मैंने केवल कानूनी कदमों को एनकोड करने का फैसला किया। हम इस प्रकार के संभावित कदमों की गणना करते हैं, प्रत्येक वर्ग की संख्या (0, 0) → 0, (1, 0) → 1, (x, y) → x + 8 y। टाइल्स के माध्यम से इरेट करें और जांचें कि क्या कोई टुकड़ा है और अगर वह चल सकता है। यदि ऐसा है तो पदों को जोड़ें यह एक सूची में जा सकता है। सूची सूचकांक चुनें जो वह कदम है जिसे आप बनाना चाहते हैं। उस संख्या को मूव्स के रनिंग टोटल में 1 प्लस की संभावित चालों की संख्या से जोड़ें।

ऊपर के रूप में उदाहरण: प्रारंभिक स्थिति से जो पहला टुकड़ा चल सकता है वह वर्ग 1 पर शूरवीर है, यह वर्ग 16 या 18 में स्थानांतरित हो सकता है, इसलिए उन लोगों को सूची में जोड़ें [(1,16),(1,18)]। अगला वर्ग 6 पर शूरवीर है, इसे जोड़ें। कुल मिलाकर हमें मिलता है:

[(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 मानते हैं क्योंकि 20 संभावित चालें हैं।

तो अब हम गेम नंबर जी 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 मानते हैं क्योंकि 20 संभावित चालें हैं।

तो अब हम गेम नंबर जी 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 में 13 मानते हैं क्योंकि 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, 18) $ (10, 18) कदम चाहते हैं

तो अब हम खेल संख्या जी 3 = (((19 13 29 + 13) 20) + 11) 20 + 13 = 225833 प्राप्त करते हैं।

और सभी शेष चालों के लिए इस प्रक्रिया को जारी रखें। आप g को फंक्शन g (x, y, z) = x y + z के रूप में सोच सकते हैं । इस प्रकार जी 0 = जी (1, 1, 13), जी 1 = जी (जी (1, 1, 11), 20, 13), जी 2 = जी (जी (जी (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 संभव चालों की संख्या है, '//' पूर्णांक विभाजन ऑपरेटर है और '%' मापांक ऑपरेटर है। यह उस g 0 = g 1 + m 0 को पकड़ना चाहिए । अगला हम मूव एम 0 बनाते हैं और दोहराते हैं।

उपरोक्त उदाहरण से यदि g 0 = 225833 तब g 1 = 225833 // 20 = 11291 और m 0 = 225833% 20 = 13. अगला g 2 = 11291 // 20 = 564 और m 1 = 11291% 20 = 11. तब g 3 = 11291 // 20 = 564 और m 2 = 11291% 20 = 11. इसलिए g 4 = 564 // 29 = 19 और_m_ 3 = 564% 29 = 13. अंत में g 5 = 19 // 29 = 0 और m 4 = 19% 29 = 19।

तो इस तरह से गेम को एनकोड करने के लिए कितने बिट्स का उपयोग किया जाता है?

सादगी के लिए, मान लें कि प्रत्येक मोड़ पर हमेशा 20 चालें होती हैं और सबसे खराब स्थिति के लिए हम हमेशा सबसे बड़ा एक चुनते हैं, 19. हमें जो संख्या मिलेगी वह 19 ⋅ 20 मीटर होगी

+ 19 m 20 m-1 + 19-20 m-2 + 19 + 19 + 20 + 19 = 20 m + 1 - 1 जहाँ _m चाल की संख्या है। 20 m + 1 - 1 को एनकोड करने के लिए हमें log 2 (20 m + 1 ) बिट्स की आवश्यकता होती है जो लगभग (m + 1)) log 2 (20) = 4.3219 + (m + 1) है।

औसतन m = 80 (प्रति खिलाड़ी 40 चाल) तो इससे 351 बिट्स को एनकोड करना होगा। यदि हम कई गेम रिकॉर्ड कर रहे थे तो हमें एक सार्वभौमिक एन्कोडिंग की आवश्यकता होगी क्योंकि हमें नहीं पता है कि प्रत्येक नंबर को कितने बिट्स की आवश्यकता होगी

सबसे खराब स्थिति जब m = 400 (प्रति खिलाड़ी 200 चाल) तो इससे 1734 बिट्स को एनकोड करना होगा।

ध्यान दें कि जिस स्थिति को हम एनकोड करना चाहते हैं, उसे नियमों का पालन करते हुए वहां तक ​​पहुंचने के लिए सबसे छोटे रास्ते से जाना चाहिए। उदाहरण के लिए गेम को यहाँ पर वर्गीकृत करने के लिए m = 11741 की आवश्यकता नहीं है जो कि अंतिम स्थिति को एनकोड करता है। इसके बजाय हम उस स्थिति के लिए सबसे छोटा रास्ता खोजने के लिए एक ब्रेड-फ़र्स्ट सर्च चलाते हैं और इसके बजाय उसे एनकोड करते हैं। मुझे नहीं पता कि सभी शतरंज पदों पर जाने के लिए हमें कितनी गहराई तक जाने की आवश्यकता होगी, लेकिन मुझे संदेह है कि 400 एक overestimate है।

त्वरित गणना:

12 अद्वितीय टुकड़े हैं या चौकोर खाली हो सकता है ताकि उन्हें शतरंज की चौकी पर रखने के लिए 13 64 हो । यह एक विशाल overestimate है क्योंकि इसमें कई अमान्य पद शामिल हैं। जब हम गेम में एम मूव करते हैं तो हमने लगभग 20 मीटर पोजीशन बनाई है । तो हम देख रहे हैं कि कब 20 मीटर = 13 64M = 64 * लॉग 20 (13) = 54.797 प्राप्त करने के लिए दोनों पक्षों को लॉग इन करें । इससे पता चलता है कि हमें 55 चालों में किसी भी स्थिति में पहुंचने में सक्षम होना चाहिए।

अब जब मैंने सबसे खराब स्थिति की गणना m = 55 नहीं m = 400 की है तो मैं अपने परिणाम संपादित करूंगा। ऐसी स्थिति को सांकेतिक शब्दों में बदलना जहां एम = 55 243 बिट्स लेता है। मैं यह भी कहने जा रहा हूं कि औसत मामला लगभग m = 40 है जो एन्कोड करने के लिए 177 बिट्स लेता है।

यदि हम पहले से परिशोधन तर्क का उपयोग करते हैं तो हम 1734 बिट्स में 400 "शतरंज बोर्ड" को एन्कोडिंग कर रहे हैं ताकि हम प्राप्त करें कि प्रत्येक "शतरंज बोर्ड" सबसे खराब स्थिति में 4.335 बिट्स लेता है।

ध्यान दें कि जी = 0 एक वैध खेल को दर्शाता है, वह स्थान जहां सबसे कम वर्ग का टुकड़ा सबसे कम वर्ग तक जाता है।

अतिरिक्त नोट्स:

यदि आप खेल में एक विशिष्ट स्थिति को संदर्भित करना चाहते हैं तो आपको सूचकांक को एनकोड करना पड़ सकता है। यह या तो मैन्युअल रूप से जोड़ा जा सकता है जैसे कि खेल के लिए सूचकांक को संक्षिप्त करें, या प्रत्येक मोड़ पर अंतिम संभव कदम के रूप में एक अतिरिक्त "अंत" चाल जोड़ें। यह अब खिलाडियों के लिए, या एक पंक्ति में 2 खिलाड़ियों को आकर्षित करने के लिए सहमत करने के लिए जिम्मेदार हो सकता है। यह केवल तभी आवश्यक है जब खेल स्थिति के आधार पर एक चेकमेट या गतिरोध में समाप्त नहीं हुआ था, इस मामले में यह निहित है। इस मामले में यह औसतन 356 और सबसे खराब स्थिति 1762 में आवश्यक बिट्स की संख्या लाता है।


1
आपका "परिशोधन" तर्क काम नहीं करता है। लक्ष्य उपयोगकर्ता द्वारा दिए गए बोर्ड को एनकोड करना है। आपको इस बोर्ड को 400 सहायक बोर्डों के बीच एन्कोडिंग की लागत को विभाजित करने के लिए नहीं मिलता है जो आप रास्ते में उत्पन्न कर सकते हैं। (यह केवल तभी ठीक होगा जब उन 400 बोर्डों को उपयोगकर्ता द्वारा स्वतंत्र रूप से चुने जाने की अनुमति दी गई थी, और शतरंज के खेल को बनाने के लिए आवश्यकता से विवश नहीं किया गया था।) इसके अलावा, एक शतरंज का खेल सैद्धांतिक रूप से कई हजारों चालें ले सकता है , और ओपी। सबसे खराब स्थिति में रुचि रखने के बारे में स्पष्ट।
एंडर्स कासोर्ग

@AndersKaseorg: बहुत सही। यह वास्तव में उद्देश्य पर निर्भर करता है। यदि आप अन्य सभी एल्गोरिदम के साथ एक पूरे गेम को स्टोर करने की कोशिश कर रहे हैं तो यह m * c बाइट्स ले जाएगा जहाँ m मूव की संख्या है और c उनके आउटपुट का आकार है। तो अगर आप 160 बिट समाधान का उपयोग करके एक पूरे 80 चाल खेल को स्टोर करने की कोशिश कर रहे हैं, तो यह 12800 बिट्स ले जाएगा, जबकि मेरा केवल 351 लगेगा। प्रतियोगिता के लिए मैं मानता हूं कि आप सही हैं, लेकिन मुझे लगा कि यह एक अच्छी संपत्ति थी यह इंगित करने के लिए कि यह बहुत ही आम है कि पूरे खेल को स्टोर करना है और न केवल बोर्ड।
edggy

उद्देश्य असंदिग्ध है। “लक्ष्य उस मोड़ पर एक खिलाड़ी के लिए सभी आंदोलन की संभावनाओं को निर्धारित करने के लिए इस्तेमाल किया जा सकता है (एक बार डिकोड किया गया) शतरंज की सबसे छोटी प्रतिनिधित्व करने के लिए है। ... आपका स्कोर सबसे खराब स्थिति में निर्धारित किया गया है - बिट्स में अधिकतम संभव आकार। "
एंडर्स केसोर्ग

@AndersKaseorg: मैंने कभी यह दावा नहीं किया कि यह अस्पष्ट था। मैंने अभी एक अलग तरीका अपनाने का फैसला किया है। ध्यान देने वाली एक बात यह है कि मेरे एल्गोरिथ्म का उपयोग करते हुए सबसे छोटा बोर्ड खोजने के लिए मुझे इस पद पर पहुंचने के लिए सबसे छोटे रास्ते की आवश्यकता है। उदाहरण के लिए 11741 टर्न गेम में जिसे आपने एक ही बोर्ड पोजीशन में लाने के लिए लिंक किया था, मुझे उस रास्ते पर चलने की जरूरत नहीं है अगर हम सभी को बोर्ड की परवाह है। इसलिए लिंक किए गए गेम को एनकोड करने के लिए मैं सिर्फ सबसे छोटा गेम ढूंढता हूं, जो उन चौकों पर 2 राजाओं के साथ छोड़ दिया जाता है जो केवल 200 मोड़ या उससे कम हो सकते हैं। यह गहराई-पहली खोज के साथ किया जा सकता है।
edggy

एक छोटे समकक्ष खेल का उपयोग करना ठीक है, यदि आप वास्तव में यह साबित कर सकते हैं कि हर स्थिति 200 मोड़ या उससे कम में उपलब्ध है (अभी यह सिर्फ एक अनुमान की तरह दिखता है)। आपको 100 से अधिक कानूनी चालों के साथ शतरंज पदों के लिए भी खाते की आवश्यकता होगी , जब तक कि आप यह साबित नहीं कर सकते कि वे आपके निर्माण के भीतर पैदा नहीं हुए हैं। खेल में चालों की संख्या से अपना परिणाम विभाजित करना अभी भी इस चुनौती के नियमों द्वारा अनुमति नहीं है।
एंडर्स केसॉर्ग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.