प्रोग्रामर पहेली: एक खेल के दौरान एक शतरंज बोर्ड राज्य को एन्कोड करना


95

कड़ाई से नहीं, एक पहेली से अधिक ...

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

अक्सर परिणाम काफी दिलचस्प - गलत, लेकिन दिलचस्प होंगे - और व्यक्ति को अभी भी मेरी सिफारिश मिलेगी यदि वे बता सकते हैं कि उन्होंने एक विशेष दृष्टिकोण क्यों लिया।

इसलिए मैंने सोचा कि मैं अपने एक सवाल को स्टैक ओवरफ्लो दर्शकों के लिए बाहर फेंक दूंगा।

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

उत्तर के लिए कोई कोड आवश्यक नहीं है, केवल उस एल्गोरिथ्म का वर्णन जो आप उपयोग करेंगे।

संपादित करें: जैसा कि पोस्टरों में से एक ने बताया है, मैंने चालों के बीच समय अंतराल पर विचार नहीं किया। एक वैकल्पिक अतिरिक्त के रूप में भी इसके लिए स्वतंत्र महसूस करें :)

EDIT2: अतिरिक्त स्पष्टीकरण के लिए ... याद रखें, एनकोडर / डिकोडर नियम-जागरूक है। केवल चीजें जिन्हें वास्तव में संग्रहीत करने की आवश्यकता होती है, वे खिलाड़ी की पसंद हैं - कुछ भी जो एनकोडर / डिकोडर द्वारा जाना जा सकता है।

EDIT3: यहाँ एक विजेता को चुनना मुश्किल हो रहा है :) बहुत बढ़िया जवाब!


4
एक शतरंज के खेल की प्रारंभिक स्थिति अच्छी तरह से परिभाषित नहीं है? इसे कूटबद्ध क्यों करना पड़ता है? मुझे लगता है कि केवल प्रत्येक टर्न (= मूव) के बीच अंतर को एनकोड करने के लिए पर्याप्त होना चाहिए।
tanascius 8

1
वह मानता है कि खेल किसी भी कानूनी प्रारंभिक सेटअप के साथ शुरू हो सकता है (ठीक उसी तरह जैसे शतरंज के खेल पहेली आप समाचार पत्रों में पा सकते हैं)।
आरोन दिगुल्ला

6
सख्त होने के लिए, आपको सभी पिछली स्थितियों को भी एनकोड करना होगा, क्योंकि यदि एक ही स्थिति तीन बार दिखाई देती है तो यह एक ड्रा है। enikw.org.org
Threefold_repetition

4
सुझाव: इसे एक वास्तविक प्रतियोगिता बनाएं जहां लोग अपनी प्रविष्टियां कार्यक्रमों के रूप में प्रस्तुत करते हैं। एक कार्यक्रम शतरंज के खेल को अपने इनपुट के रूप में लेगा (आप इसके लिए कुछ बुनियादी, मानव-पठनीय, गैर-अनुकूलित प्रारूप को परिभाषित कर सकते हैं) और संपीड़ित गेम को आउटपुट करेंगे। फिर, एक पैरामीटर के साथ, यह संपीड़ित गेम लेता है और मूल इनपुट को पुन: उत्पन्न करता है जिसे मिलान करना होगा।
विल्क्स-

2
इस बिंदु पर अधिक, यह प्रदर्शित करेगा कि आप निर्देशों का पालन नहीं कर सकते ... यहां तक ​​कि सबसे ubercoder को कुछ बिंदुओं पर निर्देशों का पालन करने की आवश्यकता है। मैंने उन स्थितियों में भाग लिया है जहां मुझे कुछ निश्चित तरीके से लागू करने के लिए कहा गया है, भले ही मैंने सोचा हो (और कहा) यह एक बेवकूफ कार्यान्वयन था, केवल मेरे चेहरे पर अंडे के साथ छोड़ दिया जाना चाहिए जब यह निकला वहाँ एक बहुत अच्छा कारण था (कि मुझे नहीं पता था या समझ नहीं था) इस तरह से इसे लागू किया था।
एंड्रयू रोलिंग

जवाबों:


132

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

समस्या

यह छवि आरंभिक शतरंज स्थिति को दर्शाती है। शतरंज 8x8 के बोर्ड पर होता है, जिसमें प्रत्येक खिलाड़ी 8 टुकड़ों, समानों, 2 शूरवीरों, 2 शूरवीरों, 2 बिशपों, 1 रानी और 1 राजा के समान सेट से शुरू होता है।

शतरंज की स्थिति शुरू करना

पदों को आम तौर पर स्तंभ के लिए एक पत्र के रूप में दर्ज किया जाता है, जिसके बाद पंक्ति के लिए संख्या होती है इसलिए व्हाइट की रानी d1 पर है। मूव्स को अक्सर बीजीय संकेतन में संग्रहित किया जाता है , जो अस्पष्ट है और आम तौर पर केवल आवश्यक न्यूनतम जानकारी को निर्दिष्ट करता है। इस उद्घाटन पर विचार करें:

  1. e4 e5
  2. एनएफ 3 एनसी 6
  3. ...

जिसका अनुवाद है:

  1. व्हाइट ई 2 से ई 4 तक किंग्स प्यादा चलता है (यह एकमात्र ऐसा टुकड़ा है जो ई 4 को प्राप्त कर सकता है इसलिए "ई 4");
  2. ब्लैक ई 7 से ई 5 तक राजा के मोहरे को स्थानांतरित करता है;
  3. व्हाइट नाइट के लिए नाइट (N) ले जाता है;
  4. ब्लैक नाइट को c6 में ले जाता है।
  5. ...

बोर्ड इस तरह दिखता है:

जल्दी खुलने वाला

किसी भी प्रोग्रामर के लिए एक महत्वपूर्ण क्षमता सही ढंग से और स्पष्ट रूप से समस्या को निर्दिष्ट करने में सक्षम होना है

तो क्या याद आ रही है या अस्पष्ट है? बहुत कुछ बदल जाता है।

बोर्ड राज्य बनाम खेल राज्य

पहली बात यह निर्धारित करने की आवश्यकता है कि क्या आप किसी खेल की स्थिति या बोर्ड पर टुकड़ों की स्थिति का भंडारण कर रहे हैं। बस टुकड़ों की स्थिति को एन्कोड करना एक बात है लेकिन समस्या "सभी बाद की कानूनी चाल" कहती है। समस्या यह भी है कि इस बिंदु पर जाने के बारे में कुछ भी नहीं कहा जाता है। यह वास्तव में एक समस्या है जैसा कि मैं समझाता हूँ।

कैसलिंग

खेल इस प्रकार आगे बढ़ा है:

  1. e4 e5
  2. एनएफ 3 एनसी 6
  3. Bb5 a6
  4. Ba4 Bc5

बोर्ड इस प्रकार है:

बाद में खोलना

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

ऐसी कई रणनीतियाँ हैं जिनका उपयोग इस समस्या से निपटने के लिए किया जा सकता है।

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

एन पास

शतरंज में एक और अजीबोगरीब और अक्सर उपेक्षित शासन एन पासेंट है

en passant

खेल में प्रगति हुई है।

  1. e4 e5
  2. एनएफ 3 एनसी 6
  3. Bb5 a6
  4. Ba4 Bc5
  5. OO b5
  6. Bb3 b4
  7. सी 4

B4 पर ब्लैक का प्यादा अब c4 पर व्हाइट प्यादा ले कर b4 से c3 पर अपने प्यादा को स्थानांतरित करने का विकल्प रखता है। यह केवल पहले अवसर पर होता है यदि विकल्प पर ब्लैक पास करता है तो वह इसे अगले कदम पर नहीं ले जा सकता है। इसलिए हमें इसे स्टोर करने की आवश्यकता है।

यदि हम पिछली चाल को जानते हैं तो हम निश्चित रूप से उत्तर दे सकते हैं कि क्या En Passant संभव है। वैकल्पिक रूप से हम स्टोर कर सकते हैं कि क्या इसकी 4 वीं रैंक पर प्रत्येक मोहरा सिर्फ एक दोहरे कदम के साथ वहां चला गया है। या हम बोर्ड पर प्रत्येक संभावित एन पासेंट स्थिति को देख सकते हैं और यह इंगित करने के लिए एक झंडा है कि क्या यह संभव है या नहीं।

पदोन्नति

प्यादा प्रचार

यह व्हाइट की चाल है। अगर व्हाइट h7 से h8 पर अपने मोहरे को आगे बढ़ाता है तो इसे किसी अन्य टुकड़े (लेकिन राजा नहीं) को बढ़ावा दिया जा सकता है। 99% यह एक रानी को पदोन्नत किया जाता है, लेकिन कभी-कभी ऐसा नहीं होता है, आमतौर पर क्योंकि यह तब गतिरोध पैदा कर सकता है जब आप जीतेंगे। यह इस प्रकार लिखा गया है:

  1. H8 = Q

यह हमारी समस्या में महत्वपूर्ण है क्योंकि इसका मतलब है कि हम प्रत्येक पक्ष पर निश्चित संख्या में टुकड़ों की गणना नहीं कर सकते हैं। एक तरफ से 9 रानियों, 10 बदमाशों, 10 बिशपों या 10 शूरवीरों के साथ पूरी तरह से संभव (लेकिन अविश्वसनीय रूप से संभावना नहीं है) यदि सभी 8 प्यादों को बढ़ावा मिलता है।

गतिरोध

जब आप जिस स्थिति से अपनी सर्वश्रेष्ठ रणनीति नहीं जीत सकते हैं वह गतिरोध के लिए प्रयास करना है । सबसे अधिक संभावना वाला संस्करण वह जगह है जहां आप एक कानूनी कदम नहीं उठा सकते हैं (आमतौर पर क्योंकि कोई भी कदम जब आपके राजा को जांच में रखा जाता है)। इस मामले में आप ड्रॉ का दावा कर सकते हैं। यह एक के लिए पूरा करने के लिए आसान है।

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

अंत में, पचास चाल नियम है । एक खिलाड़ी ड्रॉ का दावा कर सकता है अगर कोई मोहरा नहीं चला गया है और पिछले पचास लगातार चालों में कोई टुकड़ा नहीं लिया गया है, तो हमें यह संग्रहीत करने की आवश्यकता होगी कि एक मोहरा ले जाने के बाद से कितने चाल चले गए या एक टुकड़ा लिया गया (दो के नवीनतम)। 6 बिट्स (0-63)।

यह किसकी बारी है?

निश्चित रूप से हमें यह भी जानना होगा कि यह किसकी बारी है और यह जानकारी का एक सा है।

दो समस्याएं

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

टुकड़ा लेआउट को मोटे तौर पर दो तरीकों में से एक में संभाला जा सकता है: प्रत्येक वर्ग की सामग्री को स्टोर करके या प्रत्येक टुकड़े की स्थिति को स्टोर करके।

सरल सामग्री

छह टुकड़े प्रकार (प्यादा, किश्ती, शूरवीर, बिशप, रानी और राजा) हैं। प्रत्येक टुकड़ा सफेद या काला हो सकता है इसलिए एक वर्ग में 12 संभावित टुकड़ों में से एक हो सकता है या यह खाली हो सकता है इसलिए 13 संभावनाएं हैं। 13 को 4 बिट्स (0-15) में संग्रहित किया जा सकता है, इसलिए सबसे सरल उपाय है कि प्रत्येक वर्ग के लिए 4 बिट्स को 64 वर्ग या 256 बिट्स की जानकारी के लिए स्टोर किया जाए।

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

लेकिन हम बेहतर कर सकते हैं।

बेस 13 एनकोडिंग

बोर्ड की स्थिति को बहुत बड़ी संख्या के रूप में सोचना अक्सर सहायक होता है। यह अक्सर कंप्यूटर विज्ञान में किया जाता है। उदाहरण के लिए, हॉल्टिंग समस्या एक कंप्यूटर प्रोग्राम (सही तरीके से) को एक बड़ी संख्या के रूप में मानती है।

पहला समाधान स्थिति को 64 अंकों के आधार 16 नंबर के रूप में मानता है लेकिन जैसा कि प्रदर्शित किया गया है कि इस जानकारी में अतिरेक है (प्रति अंक 3 अप्रयुक्त संभावनाएं हैं) इसलिए हम संख्या स्थान को 64 आधार 13 अंकों तक कम कर सकते हैं। बेशक, यह कुशलतापूर्वक आधार 16 के रूप में नहीं किया जा सकता है, लेकिन यह भंडारण आवश्यकताओं (और भंडारण स्थान को कम करना हमारा लक्ष्य है) पर बचाएगा।

आधार 10 में संख्या 234 2 x 10 2 + 3 x 10 1 + 4 x 10 0 के बराबर है ।

आधार 16 में संख्या 0xA50 10 x 16 2 + 5 x 16 1 + 0 x 16 0 = 2640 (दशमलव) के बराबर है ।

इसलिए हम अपनी स्थिति को p 0 x 13 63 + p 1 x 13 62 + ... + p 63 के रूप में एन्कोड कर सकते हैं x 13 0 जहां पी मैं वर्ग की सामग्री का प्रतिनिधित्व करता है मैं

2 256 लगभग 1.16e77 के बराबर है। 13 64 लगभग 1.96e71 के बराबर है, जिसमें 237 बिट्स स्टोरेज स्पेस की आवश्यकता होती है। महज 7.5% की बचत से हेरफेर की लागत काफी बढ़ जाती है।

परिवर्तनीय आधार एनकोडिंग

कानूनी बोर्डों में कुछ निश्चित वर्गों में कुछ टुकड़े दिखाई नहीं दे सकते हैं। उदाहरण के लिए, प्यादे पहली या आठवीं रैंक पर नहीं हो सकते हैं, उन चौकों के लिए संभावनाओं को कम करके 11. 11 कि संभावित बोर्ड को कम कर देता है 11 16 x 13 48 = 1.35e70 (लगभग), भंडारण स्थान के 233 बिट्स की आवश्यकता होती है।

वास्तव में और दशमलव (या बाइनरी) से ऐसे मूल्यों को एन्कोडिंग और डिकोड करना थोड़ा अधिक दृढ़ है, लेकिन यह मज़बूती से किया जा सकता है और पाठक को एक अभ्यास के रूप में छोड़ दिया जाता है।

चर चौड़ाई अक्षर

पिछले दो तरीकों को निश्चित-चौड़ाई वाले अल्फाबेटिक एन्कोडिंग के रूप में वर्णित किया जा सकता है । वर्णमाला के 11, 13 या 16 सदस्यों में से प्रत्येक को दूसरे मूल्य के लिए प्रतिस्थापित किया जाता है। प्रत्येक "वर्ण" समान चौड़ाई है, लेकिन दक्षता में सुधार किया जा सकता है जब आप समझते हैं कि प्रत्येक वर्ण समान रूप से संभव नहीं है।

मोर्स कोड

मोर्स कोड पर विचार करें (ऊपर चित्रित) । किसी संदेश में वर्ण डैश और डॉट्स के अनुक्रम के रूप में एन्कोड किए गए हैं। उन डैश और डॉट्स को रेडियो (आम तौर पर) पर स्थानांतरित कर दिया जाता है और उनके बीच एक विराम होता है।

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

इस तरह की स्कीम का आकार काफी कम कर सकता है अपेक्षित संदेश लेकिन एक यादृच्छिक चरित्र अनुक्रम के आकार को बढ़ाने की लागत पर आती है।

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

अंत में, मोर्स कोड में दो प्रकार के आराम होते हैं। एक छोटे आराम (डॉट की लंबाई) का उपयोग डॉट्स और डैश के बीच अंतर करने के लिए किया जाता है। वर्णों को परिसीमित करने के लिए एक लंबे अंतराल (डैश की लंबाई) का उपयोग किया जाता है।

तो यह हमारी समस्या पर कैसे लागू होता है?

हफमैन कोडिंग

हफमैन कोडिंग नामक चर लंबाई कोड से निपटने के लिए एक एल्गोरिथ्म है । हफ़मैन कोडिंग एक चर लंबाई कोड प्रतिस्थापन बनाता है, आमतौर पर प्रतीकों की अपेक्षित आवृत्ति का उपयोग करता है ताकि अधिक सामान्य प्रतीकों को छोटे मान निर्दिष्ट किए जा सकें।

हफमैन कोड ट्री

उपरोक्त पेड़ में, E को 000 के रूप में एन्कोड किया गया है (या बाएं-बाएं-बाएं) और S 1011 है। यह स्पष्ट होना चाहिए कि यह एन्कोडिंग योजना अस्पष्ट है

यह मोर्स कोड से एक महत्वपूर्ण अंतर है। मोर्स कोड में वर्ण विभाजक होता है, इसलिए यह अन्यथा अस्पष्ट प्रतिस्थापन कर सकता है (जैसे 4 डॉट्स H या 2 Is हो सकते हैं) लेकिन हमारे पास केवल 1s और 0s हैं, इसलिए हम इसके बजाय एक अस्पष्ट प्रतिस्थापन का चयन करते हैं।

नीचे एक सरल कार्यान्वयन है:

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

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

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

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

  public Node getLeft() { return left; }

  public Node getRight() { return right; }

  public String getLabel() { return label; }

  public int getWeight() { return weight; }
}

स्थैतिक डेटा के साथ:

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

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

तथा:

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

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

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

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

एक संभावित उत्पादन है:

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

एक प्रारंभिक स्थिति के लिए यह 32 x 1 + 16 x 3 + 12 x 5 + 4 x 6 = 164 बिट्स के बराबर है।

राज्य का अंतर

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

तो आप क्या करते हैं XOR 256 बिट करंट बोर्ड पोजीशन के साथ 256 बिट स्टार्टिंग पोजिशन और फिर उसको इनकोड करते हैं (हफमैन कोडिंग या, कहते हैं, रन लेंथ एन्कोडिंग की कुछ विधि )। जाहिर है कि यह (64 0 एस शायद 64 बिट्स के अनुरूप) के साथ शुरू करने के लिए बहुत कुशल होगा, लेकिन खेल में प्रगति के रूप में आवश्यक भंडारण में वृद्धि।

टुकड़ा स्थिति

जैसा कि उल्लेख किया गया है, इस समस्या पर हमला करने का एक और तरीका यह है कि प्रत्येक खिलाड़ी की स्थिति को संग्रहीत करना है। यह विशेष रूप से एंडगेम पदों के साथ अच्छी तरह से काम करता है जहां अधिकांश वर्ग खाली होंगे (लेकिन हफ़मैन कोडिंग दृष्टिकोण में खाली वर्ग केवल 1 बिट का उपयोग करते हैं)।

प्रत्येक पक्ष में एक राजा और 0-15 अन्य टुकड़े होंगे। पदोन्नति के कारण उन टुकड़ों का सटीक मेक-अप पर्याप्त हो सकता है कि आप मान नहीं सकते कि शुरुआती स्थिति के आधार पर संख्याएँ अधिकतम हैं।

इसे विभाजित करने का तार्किक तरीका दो पक्षों (सफेद और काले) से मिलकर एक स्थिति है। प्रत्येक पक्ष में है:

  • एक राजा: स्थान के लिए 6 बिट्स;
  • प्यादे हैं: 1 (हां), 0 (नहीं);
  • यदि हाँ, प्यादों की संख्या: 3 बिट्स (4-7 + 1 = 1-8);
  • यदि हाँ, प्रत्येक प्यादा का स्थान एन्कोडेड है: 45 बिट्स (नीचे देखें);
  • गैर-पंजे की संख्या: 4 बिट्स (0-15);
  • प्रत्येक टुकड़े के लिए: टाइप करें (2 बिट्स फॉर क्वीन, रोक, नाइट, बिशप) और लोकेशन (6 बिट्स)

प्यादा स्थान के लिए, प्यादे केवल 48 संभावित चौकों पर (64 अन्य की तरह नहीं) हो सकते हैं। जैसे, यह बेहतर है कि अतिरिक्त 16 मानों को बर्बाद न करें जो कि 6 बिट प्रति मोहरे का उपयोग करेंगे। तो अगर आपके पास 8 प्यादे हैं तो 48 8 संभावनाएं हैं, 28,179,280,429,056 के बराबर। आपको कई मानों को एनकोड करने के लिए 45 बिट्स की आवश्यकता है।

यह 105 बिट्स प्रति साइड या 210 बिट्स है। आरंभिक स्थिति इस पद्धति के लिए सबसे खराब स्थिति है, लेकिन टुकड़ों को हटाते ही यह काफी हद तक बेहतर हो जाएगी।

यह ध्यान दिया जाना चाहिए कि 48 से कम 8 हैं संभावनाएं हैं क्योंकि प्यादे सभी एक ही वर्ग में नहीं हो सकते हैं पहली में 48 संभावनाएं हैं, दूसरा 47 और इसी तरह। 48 x 47 x… x 41 = 1.52e13 = 44 बिट्स संग्रहण।

आप अन्य टुकड़ों (दूसरे पक्ष सहित) पर कब्जे वाले वर्गों को समाप्त करके इसे और बेहतर कर सकते हैं ताकि आप पहले सफेद गैर-पंजे, फिर काले गैर-पंजे, फिर सफेद पंजे और अंत में काले पंजे रख सकें। एक प्रारंभिक स्थिति पर यह स्टोरेज आवश्यकताओं को व्हाइट के लिए 44 बिट्स और ब्लैक के लिए 42 बिट्स को कम करता है।

संयुक्त दृष्टिकोण

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

ओवरहेड के साथ छोटा, यह अब तक का सबसे अच्छा तरीका होगा।

खेल राज्य

मैं एक स्थिति के बजाय एक खेल के भंडारण की समस्या पर लौटता हूं । तीन गुना पुनरावृत्ति के कारण हमें इस बिंदु पर हुई चालों की सूची संग्रहीत करनी होगी।

एनोटेशन

एक बात जो आपको निर्धारित करनी है, क्या आप केवल चाल की सूची जमा कर रहे हैं या आप खेल को एनोटेट कर रहे हैं? उदाहरण के लिए शतरंज के खेल को अक्सर एनोटेट किया जाता है:

  1. BB5 !! Nc4?

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

इसके अतिरिक्त आपको नि: शुल्क पाठ को संग्रहीत करने की भी आवश्यकता हो सकती है क्योंकि चालें वर्णित हैं।

मैं मान रहा हूं कि चालें पर्याप्त हैं, इसलिए कोई टिप्पणी नहीं होगी।

बीजगणितीय संकेतन

हम बस यहाँ ("e4", "Bxb5", आदि) के पाठ को संग्रहीत कर सकते हैं। एक टर्मिनेटिंग बाइट सहित आप प्रति चाल (सबसे खराब स्थिति) के बारे में 6 बाइट्स (48 बिट्स) देख रहे हैं। यह विशेष रूप से कुशल नहीं है।

कोशिश करने के लिए दूसरी चीज शुरुआती स्थान (6 बिट्स) और अंत स्थान (6 बिट्स) को संग्रहीत करना है ताकि प्रति कदम 12 बिट्स हो। यह काफी बेहतर है।

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

निष्कर्ष

इस सवाल का कोई बिल्कुल सही जवाब नहीं है। कई संभावित दृष्टिकोण हैं जिनमें से उपरोक्त कुछ ही हैं।

मुझे इस और इसी तरह की समस्याओं के बारे में क्या पसंद है कि यह किसी भी प्रोग्रामर के लिए क्षमताओं की मांग करता है जैसे उपयोग पैटर्न पर विचार करना, आवश्यकताओं को सही ढंग से निर्धारित करना और कोने के मामलों के बारे में सोचना।

शतरंज स्थिति ट्रेनर से स्क्रीनशॉट के रूप में लिया गया शतरंज का स्थान


3
और बाद में परिणाम प्राप्त करें (यदि शीर्ष लेख परिणाम नहीं बढ़ाएगा; ^)
तोडा

क्या आपको ब्लैक या व्हाइट को इंगित करने के लिए स्थान को दोगुना करने की आवश्यकता नहीं होगी?
डैनियल इलियट

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

9
एक नाइट को बढ़ावा देने के लिए, मैंने एक बार ऐसा किया है। वास्तव में जंगली स्थिति - वह मुझे संभोग से एक कदम था, मैं इसे रोक नहीं सकता था। उन्होंने मेरे मोहरे को नजरअंदाज कर दिया था क्योंकि जब यह बढ़ावा देगा तो यह एक कदम देर से होगा। काश मेरे पास मेरा कैमरा होता, जब मैं उसके बजाय नाइट में प्रमोट करता और उसे डेट करता!
लोरेन Pechtel

2
मुझे आश्चर्य है कि आपके लेख में [FEN] [1] का उल्लेख नहीं किया गया है, जो कास्टिंग, एन पास की उपलब्धता, आदि को संभालता है [1] en.wikipedia.org/wiki/FEN
Ross

48

शतरंज के खेल को मानव-पठनीय, मानक प्रारूप में संग्रहीत करना सबसे अच्छा है।

पोर्टेबल खेल संकेतन एक मानक प्रारंभिक स्थिति हो जाती है (हालांकि यह नहीं है ) और बस चाल को सूचीबद्ध करता है, बारी बारी से। एक कॉम्पैक्ट, मानव-पठनीय, मानक प्रारूप।

उदाहरण के लिए

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

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

यदि आप इसे छोटा करना चाहते हैं, तो बस इसे ज़िप करें । काम हो गया!


23
2 के खिलाफ मेरे बचाव में यह प्राप्त हुआ: 1) यह वही करता है जो आप 2 चाहते हैं) यह thedailywtf.com/articles/riddle-me-an-interview.aspx परीक्षण पास करता है : "... कुछ लोग जो हल कर सकते हैं ये पहेलियां ठीक उसी प्रकार की हैं जिन्हें आप प्रोग्रामर के रूप में नहीं चाहते हैं। क्या आप उस आदमी के साथ काम करना चाहते हैं जो पानी-विस्थापन का पैमाना / बजरा बना रहा है, टैक्सी को एक 747 डॉक पर ले जाता है, और उसके बाद जूम जेट का इस्तेमाल करता है, इसके बजाय पहली बार में बोइंग को बुलाने के बजाय? " आप किसी ऐसे व्यक्ति को नियुक्त नहीं करते हैं जो आपको साक्षात्कार में एक यादृच्छिक एन्कोडिंग देता है, क्योंकि वे इसे अपने कोड में भी करेंगे।
रोब ग्रांट

1
ठीक है, अगर मैं विशेष रूप से उन्हें अपनी समस्या को सुलझाने की तकनीक प्राप्त करने के लिए एक समस्या को हल करने के लिए कह रहा हूं, तो आप मान सकते हैं कि मैं अन्य सामानों को अन्य सवालों के साथ कवर करूंगा ...
एंड्रयू

7
@reinier: मैं यह नहीं कह रहा हूँ कि मैं सूचना घनत्व की समस्याओं के बारे में पूरी तरह से स्पष्ट नहीं हूँ (आपने अक्षमता के प्रवेश के रूप में मेरे उत्तर को गलत बताया)। निश्चित रूप से आप उस व्यक्ति को किराए पर लेना चाहते हैं जो किसी मौजूदा डेटा स्टोरेज मानक को कोड करता है, और जो यह मानता है कि अपने स्वयं के रोल करने के बजाय उपयुक्त मौजूदा टूल का उपयोग करना एक अच्छा विचार हो सकता है - "हमने द व्हील 2.0 का आविष्कार किया! यह अब भी राउंडर है!" आप निश्चित रूप से उस व्यक्ति को नियुक्त नहीं करना चाहते हैं जो सोचता है - विचित्र रूप से - कि पुस्तकालय के कार्यों का उपयोग करना कमजोरी का संकेत है।
रोब ग्रांट

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

2
मैं इस एक पर रॉबर्ट के साथ हूं - मौजूदा समाधान व्यावहारिक, मानव पठनीय और पर्याप्त कॉम्पैक्ट है। कस्टम डिकोड करने के लिए जटिल एल्गोरिदम के साथ की तुलना में सभी MAJOR करतब कर रहे हैं। अगर यह साक्षात्कार के बारे में है, तो मैं निश्चित रूप से व्यावहारिक पहलू पर भी विचार करूंगा! आप आश्चर्यचकित होंगे कि कितनी बार वास्तव में स्मार्ट लोग हाइपर जटिल अव्यवहारिक समाधानों के साथ आते हैं। यह आमतौर पर इस तथ्य के लिए जिम्मेदार है कि वे अपने सिर में जटिलता को संभाल सकते हैं, लेकिन फिर - हममें से बाकी के बारे में क्या ...
MaR

15

महान पहेली!

मैं देखता हूं कि ज्यादातर लोग प्रत्येक टुकड़े की स्थिति को संचय कर रहे हैं। कैसे अधिक सरल-मन के दृष्टिकोण को लेने और प्रत्येक वर्ग की सामग्री को संग्रहीत करने के बारे में ? यह प्रचार और कब्जे वाले टुकड़ों की स्वचालित रूप से देखभाल करता है।

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

प्रत्येक टुकड़े की आवृत्ति को ध्यान में रखते हुए, मैंने कागज पर एक हफमैन पेड़ का निर्माण किया, जिसे मैं यहां नहीं दोहराऊंगा। परिणाम, जहां cरंग के लिए खड़ा है (सफेद = 0, काला = 1):

  • 0 खाली वर्गों के लिए
  • 1c0 मोहरे के लिए
  • किश्ती के लिए 1 सी 100
  • नाइट के लिए 1c101
  • बिशप के लिए 1 सी110
  • रानी के लिए 1c1110
  • राजा के लिए 1c1111

अपनी प्रारंभिक स्थिति में पूरे बोर्ड के लिए, हमारे पास है

  • खाली वर्ग: 32 * 1 बिट = 32 बिट्स
  • प्यादे: 16 * 3 बिट्स = 48 बिट्स
  • बदमाश / शूरवीर / बिशप: 12 * 5 बिट्स = 60 बिट्स
  • क्वीन्स / किंग्स: 4 * 6 बिट्स = 24 बिट्स

कुल: प्रारंभिक बोर्ड राज्य के लिए 164 बिट्स । उल्लेखनीय रूप से वर्तमान में सर्वाधिक मतदान वाले उत्तर के 235 बिट्स से कम है। और यह केवल छोटा होता जा रहा है क्योंकि खेल आगे बढ़ता है (पदोन्नति के बाद) को छोड़कर।

मैंने बोर्ड पर केवल टुकड़ों की स्थिति को देखा; अतिरिक्त राज्य (जिसकी बारी, जिसने कास्ट किया है, एन पासेंट, रिपीटिंग मूव्स आदि) को अलग से एनकोड करना होगा। हो सकता है कि एक और 16 बिट्स अधिकतम पर हों, इसलिए पूरे खेल राज्य के लिए 180 बिट्स । संभावित अनुकूलन:

  • कम लगातार टुकड़ों को छोड़कर, और उनकी स्थिति को अलग से संग्रहीत करना। लेकिन यह मदद नहीं करेगा ... एक खाली वर्ग द्वारा राजा और रानी को बदलने से 5 बिट्स बचते हैं, जो कि 5 बिट्स हैं जो आपको अपनी स्थिति को दूसरे तरीके से एन्कोड करने की आवश्यकता है।
  • "पिछली पंक्तियों पर कोई पंजे" आसानी से पिछली पंक्तियों के लिए एक अलग हफ़मैन तालिका का उपयोग करके एन्कोड नहीं किया जा सकता है, लेकिन मुझे संदेह है कि यह बहुत मदद करता है। आप शायद अभी भी उसी हफमैन पेड़ के साथ समाप्त होंगे।
  • "एक सफेद, एक काला बिशप" अतिरिक्त प्रतीकों को प्रस्तुत करके एन्कोड किया जा सकता है जो कि नहीं है c जिसमें बिट , जिसे बाद में उस स्क्वायर से घटाया जा सकता है जो बिशप चालू है। (इस योजना को बाधित करने के लिए बिशप को पदोन्नत किए गए पंजे ...)
  • "एक पंक्ति में 2 खाली वर्ग" और "एक पंक्ति में 4 खाली वर्ग", के लिए अतिरिक्त चिह्नों को प्रस्तुत करके खाली वर्गों की पुनरावृत्ति को लंबाई में एन्कोड किया जा सकता है। लेकिन उन लोगों की आवृत्ति का अनुमान लगाना इतना आसान नहीं है, और यदि आप इसे गलत पाते हैं, तो यह मदद के बजाय चोट करने वाला है।

बैंक रैंकों पर कोई प्यादे थोड़ी सी भी बचत नहीं करता है - आप सभी अन्य पैटर्न से बिट # 3 को काट सकते हैं। इस प्रकार आप एक टुकड़ा प्रति वास्तव में एक बैंक रैंक पर बचा लेंगे।
लोरेन Pechtel

2
आप 64 चौकों में से प्रत्येक के लिए एक अलग हफमैन पेड़ कर सकते हैं, क्योंकि कुछ की संभावना कुछ टुकड़े दूसरों की तुलना में अधिक बार होती है।
क्लाउडीयू

9

वास्तव में बड़ा लुकअप टेबल दृष्टिकोण

स्थिति - १
is बाइट्स कानूनी पदों की अनुमानित संख्या १० ४३ है
बस उन सभी को गणना करें और स्थिति को केवल १४३ बिट्स में संग्रहीत किया जा सकता है। यह इंगित करने के लिए कि कौन सा पक्ष आगे खेलना है, 1 और बिट आवश्यक है

गणन बेशक व्यावहारिक नहीं है, लेकिन यह दर्शाता है कि कम से कम 144 बिट्स की आवश्यकता है।

चाल - 1 बाइट
आमतौर पर प्रत्येक स्थिति के लिए लगभग 30-40 कानूनी चालें होती हैं लेकिन संख्या 218 हो सकती है क्योंकि प्रत्येक स्थिति के लिए सभी कानूनी चालों की गणना करें। अब प्रत्येक चाल को एक बाइट में एन्कोड किया जा सकता है।

हमारे पास अभी भी विशेष कदमों के लिए बहुत सारे कमरे हैं जैसे कि इस्तीफा देने का प्रतिनिधित्व करने के लिए 0xFF।


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

1
मुझे एक दिलचस्प लिंक मिला कि इस तरह के शब्दकोष को बनाने में कितना समय लगेगा :) ioannis.virtualcomposer2000.com/math/EveryChess.html
एंड्रयू

शन्नोन्स का अनुमान थोड़ा पुराना है :) उन्होंने न तो पदोन्नति और न ही कैद शामिल किए, जो उचित राशि से संख्या को उड़ाते हैं। विक्टर एलिस 1994 द्वारा 5x10 ^ 52 की एक ऊपरी सीमा दी गई थी।
गैंथर पिएज़

निश्चित रूप से एक परिवर्तनीय लंबाई एन्कोडिंग के साथ केवल औसत कम से कम 10 ^ 43 है? अधिक पदों के लिए पक्षपाती एक एन्कोडिंग इसे कम करना चाहिए, विशेष रूप से कई पदों के लिए असंभव है।
फिल एच

एवरीकेस लिंक अब 'बिक्री के लिए',
आर्काइव.ऑर्ग

4

यह सबसे खराब स्थिति के बजाय, मनुष्यों द्वारा खेले जाने वाले विशिष्ट खेलों के लिए औसत-केस आकार के लिए अनुकूलन करने के लिए ब्याज जोड़ देगा । (समस्या कथन यह नहीं कहता है कि; अधिकांश प्रतिक्रियाएँ सबसे खराब स्थिति मानती हैं।)

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

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

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


इस जानकारी को पूल में संग्रहीत करने के लिए Comlexity O (n) है, मेरे संपादित उत्तर की जाँच करें।
लूका रहने

ralu, मुझे यकीन नहीं है कि आप क्या कह रहे हैं, लेकिन अगर आपका मतलब है कि चालों के अनुक्रम का प्रतिनिधित्व सबसे खराब स्थिति में इष्टतम स्थान का उपयोग करता है, तो मैं इसके विपरीत नहीं हूं। यहाँ विचार यह है कि कुछ चालों का लाभ दूसरों की तुलना में अधिक होने की संभावना है।
डेरिक बेकन

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

4

एक प्रारंभिक स्थिति एन्कोडेड होने के बाद चरणों को एन्कोडिंग के एक उपप्रकार पर हमला करना। दृष्टिकोण चरणों की "लिंक की गई सूची" बनाना है।

खेल में प्रत्येक चरण को "पुरानी स्थिति-> नई स्थिति" जोड़ी के रूप में एन्कोड किया गया है। आप शतरंज के खेल की शुरुआत में प्रारंभिक स्थिति जानते हैं; चरणों की लिंक की गई सूची को ट्रेस करके, आप एक्स चाल के बाद राज्य में पहुंच सकते हैं।

प्रत्येक चरण को एन्कोडिंग के लिए, आपको प्रारंभिक स्थिति (बोर्ड पर 64 वर्गों के लिए 6 बिट्स - 8x8 वर्गों) को एन्कोड करने के लिए 64 मानों की आवश्यकता होती है, और अंतिम स्थिति के लिए 6 बिट्स। प्रत्येक पक्ष के 1 चाल के लिए 16 बिट्स।

अंतरिक्ष की मात्रा जो किसी दिए गए गेम को एन्कोडिंग करेगी, फिर चाल की संख्या के अनुपात में होगी:

10 x (सफेद चाल की संख्या + काली चाल की संख्या) बिट्स।

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

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

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

तो काले या सफेद प्रति चाल की स्थानिक जटिलता बन जाती है

प्रारंभिक स्थिति + के लिए 6 बिट्स (जिस चीज को स्थानांतरित किया गया है उस प्रकार के आधार पर बिट्स की चर संख्या)।


बस अपडेट किया गया, मेरा मतलब था कि 128 संयोजन - स्पष्ट रूप से 128 बिट्स से कम :) :)
एलेक्स वेनस्टीन

1
एक खेल राज्य एक कदम के रूप में ही नहीं है। किसी भी स्थिति को एक शीर्ष या नोड के बारे में सोचा जा सकता है, और एक कानूनी कदम एक निर्देशित किनारे या तीर के बारे में सोचा जा सकता है, जो एक (निर्देशित एसाइक्लिक) ग्राफ बनाता है।
झबरा मेंढक

मुझे यकीन नहीं है कि नकारात्मक वोट क्यों - मैं अद्यतन विचार पर लोगों की राय सुनना पसंद करूंगा।
एलेक्स वाइंस्टीन

1
यह आपके तर्क को प्रभावित नहीं करता है, लेकिन एक छोटे से सुधार: एक मोहरे में चार चालें नहीं हो सकती हैं जिनमें पदोन्नति नहीं है, या पदोन्नति सहित 12 चालें हैं। E2 पर उदाहरण प्यादा: e3, e4, exd3, exf3। E7 पर उदाहरण प्यादा: e8Q, e8N, e8R, e8B, exd8Q, exd8N, exd8R, exd8B, exf8Q, exf8N, exf8R, exf8B।
ए रेक्स

1
एक मामूली समस्या - 5 बिट्स केवल 32 मानों को एनकोड करते हैं। बोर्ड पर किसी भी वर्ग को निर्दिष्ट करने के लिए आपको 6 बिट्स की आवश्यकता होती है।
क्रिस डोड

4

मैंने कल रात इस सवाल को देखा था और इसने मुझे परेशान कर दिया था, इसलिए मैं बिस्तर पर बैठकर उपाय सोच रहा था। मेरा अंतिम उत्तर इंट 3 के वास्तव में बहुत समान है।

मूल समाधान

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

कुल 32 टुकड़े हैं, लेकिन प्रत्येक चाल पर आप जानते हैं कि रंग क्या चल रहा है, इसलिए चिंता करने के लिए केवल 16 वर्ग हैं, जो कि 4 बिट्स है जिसके लिए यह टुकड़ा चलता है।

प्रत्येक टुकड़े में केवल एक सीमित चाल होती है, जिसे आप किसी तरह से गणना करना चाहेंगे।

  • प्यादा: 4 विकल्प, 2 बिट्स (1 कदम आगे, 2 कदम आगे, 1 प्रत्येक विकर्ण)
  • Rook: 14 विकल्प, 4 बिट्स (प्रत्येक दिशा में अधिकतम 7)
  • बिशप: 13 विकल्प, 4 बिट्स (यदि आपके पास एक विकर्ण में 7 है, तो आपके पास केवल दूसरे में 6 हैं)
  • नाइट: 8 विकल्प, 3 बिट्स
  • रानी: 27 विकल्प, 5 बिट्स (रूक + बिशप)
  • राजा: 9 विकल्प, 4 बिट्स (8 एक-चरण चाल, प्लस कास्टिंग विकल्प)

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

आगे के अनुकूलन

सबसे पहले, एक रंग के 8 टुकड़े पकड़े जाने के बाद, आप टुकड़े को 3 बिट्स तक कम कर सकते हैं, फिर 4 टुकड़ों के लिए 2 बिट्स इत्यादि।

मुख्य अनुकूलन हालांकि खेल में प्रत्येक बिंदु पर केवल संभव कदमों की गणना करना है। मान लें कि हम एक प्यादा की चाल को {00, 01, 10, 11}1 कदम आगे, 2 कदम आगे, विकर्ण बाएँ और तिरछे क्रमशः दाईं ओर रखते हैं। यदि कुछ चाल संभव नहीं हैं, तो हम उन्हें इस मोड़ के लिए एन्कोडिंग से निकाल सकते हैं।

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

संक्षेप में, प्रत्येक टुकड़े के लिए ऊपर सूचीबद्ध बिट स्टोरेज केवल एक अधिकतम है । लगभग हर चाल में कम विकल्प और अक्सर कम बिट्स होंगे।


4

प्रत्येक स्थिति में सभी संभव चालों की संख्या प्राप्त करें।

अगले कदम के रूप में उत्पन्न होता है

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

बेतरतीब ढंग से उत्पन्न खेल के भंडारण के लिए सबसे अच्छी जगह दक्षता और लगभग 5 बिट्स / मूव की आवश्यकता है क्योंकि आपके पास 30-40 संभावित चालें हैं। असेंबलिंग स्टोरेज सिर्फ रिवर्स ऑर्डर में n जेनरेट कर रहा है।

बड़े अतिरेक के कारण, भंडारण की स्थिति कठिन होती है। (एक साइट के लिए बोर्ड पर 9 रानियां हो सकती हैं, लेकिन उस स्थिति में कोई प्यादे नहीं होते हैं, और यदि बोर्ड पर विपरीत रंग के वर्गों में हैं तो बिशप), लेकिन आम तौर पर शेष वर्गों पर समान टुकड़ों के संयोजन की तरह होता है।)

संपादित करें:

सेविंग मूव्स में पॉइंट केवल मूवमेंट इंडेक्स को स्टोर करना है। Kc1-c2 को संग्रहीत करने के बजाय और इस जानकारी को कम करने की कोशिश करते हुए, हमें नियतात्मक चालकता (स्थिति) से उत्पन्न चाल के सूचकांक को जोड़ना चाहिए

प्रत्येक चाल पर हम आकार की जानकारी जोड़ते हैं

num_of_moves = get_number_of_possible_moves(postion) ;

पूल में और इस संख्या को कम नहीं किया जा सकता है

जानकारी पूल बनाना है

n=n*num_of_moves+ index_current_move

अतिरिक्त

यदि अंतिम स्थिति में केवल एक चाल उपलब्ध है, तो पहले की गई मजबूर चालों की संख्या को बचाएं। उदाहरण: यदि प्रारंभिक स्थिति में प्रत्येक पक्ष (2 चाल) के लिए 1 मजबूर चाल है और हम इसे एक चाल खेल के रूप में सहेजना चाहते हैं, तो पूल 1 में स्टोर करें।

जानकारी पूल में भंडारण का उदाहरण

मान लीजिए कि हमने शुरुआती स्थिति जान ली है और हम 3 चाल चलते हैं।

पहले कदम में 5 उपलब्ध चालें हैं, और हम चाल सूचकांक लेते हैं। दूसरी चाल में 6 उपलब्ध चालें हैं और हम स्थिति सूचकांक 3 लेते हैं और 3 वीं चाल में उस तरफ के लिए 7 चालें उपलब्ध हैं और उन्होंने चाल सूचकांक को चुनना चुना 2।

वेक्टर रूप; सूचकांक = [४,३,२] n_moves = [५,६ ],2]

हम इस जानकारी को पीछे की ओर एन्कोडिंग कर रहे हैं, इसलिए n = 4 + 5 * (3 + 6 * (2)) = 79 (7 की आवश्यकता से गुणा नहीं)

इसे कैसे अनलॉक्ड करें? पहले हमारे पास स्थिति है और हमें पता चलता है कि 5 चालें उपलब्ध हैं। इसलिए

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

हम चाल सूचकांक 4 लेते हैं और फिर से स्थिति की जांच करते हैं और इस बिंदु से हमें पता चलता है कि 6 संभावित चालें हैं।

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

और हम चाल सूचकांक 3 लेते हैं जो हमें 7 संभावित चालों के साथ एक स्थिति में ले जाता है।

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

हम अंतिम चाल सूचकांक 2 करते हैं और हम अंतिम स्थिति में पहुंच जाते हैं।

जैसा कि आप देख सकते हैं कि समय की जटिलता हे (n) है ansd अंतरिक्ष जटिलता O (n) है। संपादित करें: समय की जटिलता वास्तव में हे (n ^ 2) है क्योंकि आप जिस संख्या से गुणा करते हैं, वह बढ़ जाती है, लेकिन 10,000 चालों तक के खेल को संग्रहीत करने में कोई समस्या नहीं होनी चाहिए।


बचत की स्थिति

इष्टतम के करीब किया जा सकता है।

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

हमें क्या बचाना है: 1. प्रत्येक शांति की स्थिति 2. कास्टिग की संभावनाएं 3. एन-पास होने की संभावनाएं 4. वह पक्ष जो प्राप्य है

मान लीजिए कि हर टुकड़ा कहीं भी खड़ा हो सकता है लेकिन एक ही जगह पर 2 टुकड़े नहीं। तरीकों की संख्या बोर्ड पर एक ही रंग के 8 प्यादों की व्यवस्था की जा सकती है C (64/8) (द्विपद) जो कि 32 बिट्स है, फिर 2 किश्ती 2R-> C (56/2), 2B -> C (54/2) , 2N-> C (52/2), 1Q-> C (50/1), 1K -> C (49/1) और अन्य साइट के लिए समान लेकिन 8P -> C (48/8) और इतने पर शुरू ।

दोनों साइटों के लिए इसे एक साथ गुणा करने पर हमें संख्या 4634726695587809641192045982323285670400000 प्राप्त होती है जो लगभग 142 बिट्स है, हमें एक संभावित एन-पासेंट के लिए 8 जोड़ना होगा (एन-पासेंट मोहरा 8 स्थानों में से एक में हो सकता है), 16 (4 बिट्स) कास्टिंग सीमाएँ और उस साइट के लिए एक बिट जिसमें कदम है। हम 142 + 3 + 4 + 1 = 150 बिट्स के साथ समाप्त होते हैं

लेकिन अब चलो 32 टुकड़ों के साथ बोर्ड पर अतिरेक के शिकार पर जाएं और कोई लेना देना नहीं है।

  1. दोनों काले और सफेद प्यादे एक ही स्तंभ पर हैं और एक दूसरे का सामना कर रहे हैं। प्रत्येक प्यादा अन्य प्यादा का सामना कर रहा है, जिसका अर्थ है कि सफ़ेद मोहरा अधिकतम 6 वीं रैंक पर हो सकता है। यह हमें C (64/8) * C (48/8) के बजाय 8 * C (6/2) लाते हैं, जो 56 बिट्स द्वारा सूचना को कम करते हैं।

  2. कास्टिंग की संभावना भी बेमानी है। यदि बदमाश शुरू करने की जगह पर नहीं हैं, तो कोई किलिंग संभावना सफेद नहीं है जो कि बदमाश है। तो हम कल्पना कर सकते हैं कि अतिरिक्त जानकारी प्राप्त करने के लिए बोर्ड पर 4 वर्ग जोड़ दें यदि इस रंक को सफेद करना संभव है और 4 कास्टल बिट्स को हटा दें। इसलिए C (56/2) * C (40/2) * 16 के बजाय हमारे पास C (58/2) * C (42/2) है और हमने 3.76 बिट्स खोए (लगभग सभी 4 बिट्स)

  3. en-passant: जब हम 8 en passant possibilites में से किसी एक को स्टोर करते हैं, तो हम ब्लैक मोहरे की स्थिति को जानते हैं और सूचनात्मक रेडिंडेंसी को कम करते हैं (यदि यह सफ़ेद चाल है और 3 वाँ मोहरा en-passant है, जिसका अर्थ है कि ब्लैक मोहरा c5 पर है और सफ़ेद मोहरा या तो है c2, c3 या c4) इसलिए C (6/2) के उदाहरण में हमारे पास 3 हैं और हमने 2.3 बिट खो दिए हैं। हम कुछ अतिरेक को कम करते हैं यदि हम सफेद एन-पासेंट संख्या को भी स्टोर करते हैं, जिसमें से किया जा सकता है (3 संभावनाएं -> बाएं, दाएं, दोनों) और हम मोहरे के कब्जे को जानते हैं जो एन पास ले सकता है। (उदाहरण के लिए प्रचलित एन पैसेंट उदाहरण से सी 5 पर सफेद काला जो बाएं, दाएं या दोनों में हो सकता है। यदि यह एक साइट पर है तो हमारे पास 2 * 3 (3) साइसिबिलिट्स के भंडारण के लिए और 7 या 6 रैंक पर काले मोहरे के लिए 2 संभावित चालें हैं। ) C (6/2) की आवृत्ति और हम 1.3 बिट्स घटाते हैं और यदि दोनों तरफ हम 4.2 बिट्स घटाते हैं। इस तरह हम 2.3 + 1.3 = 3 कम कर सकते हैं।

  4. बिशप्स: बिसॉप्स केवल ओपोस्टाइट वर्गों पर हो सकते हैं, यह प्रत्येक साइट के लिए अतिरेक को 1 बिट से कम करता है।

अगर हम योग करते हैं तो हमें 150-56-4-3.6-2 = 85 बिट्स की जरूरत पड़ने पर शतरंज की स्थिति को संचय करने की आवश्यकता होती है

और शायद बहुत अधिक नहीं है अगर खाते में ली गई पदोन्नति और पदोन्नति होती है (लेकिन मैं इसके बारे में बाद में लिखूंगा कि अगर किसी को यह लंबे समय तक उपयोगी लगता है)


दिलचस्प दृष्टिकोण। कुछ और विस्तार से जोड़ें :)
एंड्रयू रोलिंग 11

मैं भी स्थिति को बचाने के लिए aproach जोड़ा। मैं 85बिट्स पर नीचे उतर गया, जो कि बिना किसी सफेदी के है और यह एक अच्छा इलस्ट्रेशन है कि कितनी दूर जाना संभव है। मुझे लगता है कि सबसे अच्छा विचार कास्टिंग संभावनाओं को बचाने में है जहां लगभग 4 बिट्स बेमानी हैं।
लुका रहाने

3

ज्यादातर लोग बोर्ड की स्थिति को एन्कोडिंग कर रहे हैं, लेकिन स्वयं चाल के बारे में .. यहाँ थोड़ा-सा एन्कोडिंग विवरण है।

प्रति टुकड़ा बिट्स:

  • टुकड़ा-आईडी: प्रति पक्ष 16 टुकड़ों की पहचान करने के लिए अधिकतम 4 बिट्स। सफेद / काले रंग का अनुमान लगाया जा सकता है। टुकड़ों पर एक आदेश दिया गया है। जैसा कि टुकड़ों की संख्या दो की संबंधित शक्तियों से नीचे है, शेष टुकड़ों का वर्णन करने के लिए कम बिट का उपयोग करें।
  • प्यादा: पहली चाल पर 3 संभावनाएँ, इसलिए +2 बिट्स (एक या दो वर्गों द्वारा आगे, एन पासेंट।) इसके बाद की चालें दो से आगे बढ़ने की अनुमति नहीं देती हैं, इसलिए +1 बिट पर्याप्त है। प्रमोशन को डिकोडिंग प्रक्रिया में अनुमान लगाया जा सकता है जब प्यादा ने आखिरी रैंक मारा है। यदि प्यादे को बढ़ावा देने के लिए जाना जाता है, तो डिकोडर को 2 अन्य बिट्स की अपेक्षा होगी जो यह दर्शाता है कि 4 प्रमुख टुकड़ों में से किसको बढ़ावा दिया गया है।
  • बिशप: प्रयुक्त विकर्ण के लिए +1 बिट, विकर्ण (16 संभावनाओं) के साथ दूरी के लिए +4 बिट्स तक। डिकोडर अधिकतम संभव दूरी का अनुमान लगा सकता है कि टुकड़ा उस विकर्ण के साथ आगे बढ़ सकता है, इसलिए यदि यह छोटा विकर्ण है, तो कम बिट्स का उपयोग करें।
  • नाइट: 8 संभव चाल, +3 बिट्स
  • Rook: लाइन के लिए दूरी के लिए क्षैतिज / ऊर्ध्वाधर, + 4 बिट्स के लिए +1 बिट।
  • राजा: 8 संभव चाल, +3 बिट्स। 'असंभव' चाल से प्रेरित कास्ट करना - चूंकि कास्ट करना केवल तभी संभव है जब राजा पहली रैंक पर हो, राजा के 'पीछे' जाने के निर्देश के साथ इस कदम को एनकोड करें - यानी बोर्ड से बाहर।
  • रानी: 8 संभावित दिशाएँ, + 3 वर्ग। लाइन / विकर्ण के साथ दूरी के लिए +4 और बिट्स (यदि विकर्ण के मामले में विकर्ण कम है, तो कम)

सभी टुकड़ों को बोर्ड पर मानते हुए, ये प्रति चाल बिट्स हैं: प्यादा - पहले कदम पर 6 बिट्स, बाद में 5। 7 को बढ़ावा दिया गया। बिशप: 9 बिट्स (अधिकतम), नाइट: 7, रूक: 9, राजा: 7, रानी: 11 (अधिकतम)।


टुकड़े की पहचान करने के लिए 32 बिट्स ??? मुझे लगता है कि आपका मतलब 5 (32 टुकड़े) था। या 6 यदि आपको एक 'अंत' राज्य को एनकोड करने की आवश्यकता है,
टॉड

एक मोहरे को किश्ती, नाइट या बिशप के रूप में भी प्रचारित किया जा सकता है। यह गतिरोध से बचने या टकराव से बचने के लिए आम है।
कोबी

यह आपके तर्क को प्रभावित नहीं करता है, लेकिन एक छोटे से सुधार: एक मोहरे में चार कदम नहीं हो सकते हैं जिनमें पदोन्नति नहीं है, या पदोन्नति सहित 12 चालें हैं। E2 पर उदाहरण प्यादा: e3, e4, exd3, exf3। E7 पर उदाहरण प्यादा: e8Q, e8N, e8R, e8B, exd8Q, exd8N, exd8R, exd8B, exf8Q, exf8N, exf8R, exf8B।
ए। रेक्स

हो सकता है कि मैं गलत बोल रहा हूं, लेकिन एक मोहरा पहले कदम पर एन पास नहीं कर सकता। वास्तव में आपको खेल के नियमों में एक विशेष "एन पास" नोटेशन की आवश्यकता नहीं है - यह सिर्फ एक विकर्ण कदम होगा। पहली चाल 4 विकल्पों में से एक है और बाद की चालें 3 विकल्पों में से हैं।
असंतुष्ट

3

क्या एन्कोडिंग देने के लिए समस्या यह है कि ठेठ शतरंज के खेल के लिए सबसे कुशल है, या सबसे कम केस एन्कोडिंग है?

उत्तरार्द्ध के लिए, सबसे कुशल तरीका भी सबसे अधिक अपारदर्शी है: सभी संभव जोड़े (प्रारंभिक बोर्ड, चाल के कानूनी अनुक्रम) की गणना करें, जो ड्रॉ-ऑन-थ्रिस-दोहराया-स्थिति और नहीं-से-अधिक के साथ अंतिम चाल-चाल-या-कब्जा नियमों के बाद से पचास-चाल, पुनरावर्ती है। फिर इस परिमित अनुक्रम में एक स्थिति का सूचकांक सबसे छोटा सबसे खराब केस एन्कोडिंग देता है, लेकिन यह भी और विशिष्ट मामलों के लिए समान रूप से लंबी एन्कोडिंग है, और, मुझे उम्मीद है, गणना करने के लिए बहुत महंगा है। सबसे लंबे समय तक संभव शतरंज का खेल 5000 से अधिक चालों वाला माना जाता है, आमतौर पर प्रत्येक खिलाड़ी के लिए प्रत्येक स्थिति में 20-30 चालें उपलब्ध होती हैं (हालांकि कम जब कुछ टुकड़े बचे होते हैं) - यह इस एन्कोडिंग के लिए आवश्यक 40000 बिट्स की तरह कुछ देता है।

अभिगम के विचार को अधिक ट्रैकेबल समाधान देने के लिए लागू किया जा सकता है, जैसा कि ऊपर दिए गए एन्कोडिंग के लिए हेंक होल्टरमैन के सुझाव में वर्णित है। मेरा सुझाव: कम से कम नहीं है, लेकिन ऊपर दिए गए उदाहरणों की तुलना में कम है जिसे मैंने देखा है, और उचित ट्रैक्टेबल:

  1. 64 बिट्स का प्रतिनिधित्व करने के लिए कि कौन से वर्ग पर कब्जा किया गया है (ऑक्यूपेंसी मैट्रिक्स), प्लस लिस्ट जिसमें से प्रत्येक के कब्जे वाले वर्ग में हैं (प्यादों के लिए 3 बिट्स हो सकते हैं, और अन्य टुकड़ों के लिए 4 बिट्स): यह शुरुआत की स्थिति के लिए 190 बिट्स देता है। चूंकि बोर्ड पर 32 से अधिक टुकड़े नहीं हो सकते हैं, अधिभोग मैट्रिक्स का एन्कोडिंग अनावश्यक है और इसलिए आम बोर्ड पदों की तरह कुछ इनकोड किया जा सकता है, जैसे कि 33 सेट बिट्स और बोर्ड के सूचकांक को आम बोर्ड सूची से कहते हैं।

  2. कहने के लिए 1 बिट जो पहली चाल है

  3. कोड हेंक के सुझाव के अनुसार चलता है: आम तौर पर सफेद / काले चाल की प्रति जोड़ी 10 बिट्स, हालांकि कुछ चालों में 0 बिट्स होंगे, जब किसी खिलाड़ी के पास कोई वैकल्पिक कदम नहीं होता है।

यह एक विशिष्ट 30-चाल वाले खेल को कोड करने के लिए 490 बिट्स का सुझाव देता है, और विशिष्ट खेलों के लिए एक उचित कुशल प्रतिनिधित्व होगा।

अंतिम-प्यादा-चाल-चाल-या-कैप्चर नियमों के बाद से ड्रॉ-ऑन-थ्रिस-दोहराया-पोजीशन और नो-मोर-पचास-चाल की एन्कोडिंग एन्कोडिंग: यदि आप थेपोड को अंतिम प्यादा चाल या कैप्चर पर वापस ले जाते हैं, तो आप यह तय करने के लिए पर्याप्त जानकारी है कि क्या ये नियम लागू होते हैं: पूरे खेल इतिहास की कोई आवश्यकता नहीं है।


मान लें कि मैं खेलों का एक बड़ा चयन करूँगा और परिणामों का औसत लूंगा।
एंड्रयू रोलिंग

3

एक बोर्ड पर स्थिति को 7 बिट्स (0-63 में परिभाषित किया जा सकता है, और 1 मान निर्दिष्ट करता है कि यह अब बोर्ड पर नहीं है)। इसलिए बोर्ड के हर टुकड़े के लिए यह निर्दिष्ट करें कि वह कहाँ स्थित है।

32 टुकड़े * 7 बिट्स = 224 बिट्स

EDIT: जैसा कि कैडरियन ने बताया ... हमारे पास 'पदोन्नत प्यादा टू क्वीन' मामला भी है। मेरा सुझाव है कि हम इंगित करने के लिए कि मोहरे को बढ़ावा दिया गया है, हम अंत में अतिरिक्त बिट्स जोड़ते हैं।

इसलिए हर मोहरे का प्रचार किया गया है, हम 5 बिट्स के साथ 224 बिट्स का पालन करते हैं जो कि प्यादे के सूचकांक को दर्शाते हैं जो कि पदोन्नत किया गया है, और 11111 यदि यह सूची का अंत है।

इतना न्यूनतम मामला (कोई पदोन्नति नहीं) 224 बिट्स + 5 (कोई पदोन्नति नहीं) है। प्रत्येक पदोन्नत मोहरे के लिए 5 बिट्स जोड़ें।

EDIT: जैसा कि झबरा मेंढक बताते हैं, हमें यह इंगित करने के लिए अंत में एक और बिट की आवश्यकता है कि यह किसकी बारी है; ^)


और बाद में परिणाम प्राप्त करें (यदि हेडर परिणाम में वृद्धि नहीं करेगा; ^)
टॉड

क्या आप इस बात को ध्यान में रखते हुए सुधार कर सकते हैं कि कुछ टुकड़े कभी निश्चित वर्ग रंगों पर नहीं मिलेंगे?
एंड्रयू रोलिंग 13

एंड्रयू: वास्तव में मैं नहीं कर सकता। मैं रानी के रूप में एक प्रचारित मोहरे को ध्यान में रखना भूल गया हूं (जैसे कैडरियन का उत्तर बताता है)। तो ऐसा लगता है कि मुझे वास्तव में एक और अतिरिक्त बिट की आवश्यकता होगी
टॉड

मैं देख सकता हूं कि काले और सफेद बिशप को एक साथ कैसे परिभाषित किया जा सकता है। मुझे आश्चर्य है कि शूरवीरों के बारे में ..
int3

1
आप गैर-रानी पदोन्नति को याद कर रहे हैं।
लोरेन Pechtel

2

मैं एक रन लंबाई एन्कोडिंग का उपयोग करता हूं। कुछ टुकड़े अद्वितीय हैं (या केवल दो बार मौजूद हैं), इसलिए मैं उनके बाद की लंबाई को छोड़ सकता हूं। क्लेटस की तरह, मुझे 13 अद्वितीय राज्यों की आवश्यकता है, इसलिए मैं टुकड़े को एनकोड करने के लिए एक नीबबल (4 बिट्स) का उपयोग कर सकता हूं। प्रारंभिक बोर्ड इस तरह दिखेगा:

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

जो मुझे 8 + 2 + 4 + 2 + 8 निबल्स = 24 निबल्स = 96 बिट्स के साथ छोड़ देता है। मैं एक कुतरना के साथ 16 सांकेतिक शब्दों में बदलना नहीं कर सकता, लेकिन "खाली, 0" से कोई मतलब नहीं है, मैं "0" को "16" के रूप में मान सकता हूं।

यदि बोर्ड खाली है, लेकिन ऊपरी बाएं कोने में एक प्यादा के लिए, मुझे "प्यादा, 1, खाली, 16, खाली, 16, खाली 16, खाली, 15" = 10 नीबल्स = 40 बिट्स मिलते हैं।

सबसे खराब स्थिति तब होती है जब मेरे पास प्रत्येक टुकड़े के बीच एक खाली वर्ग होता है। लेकिन टुकड़े के एन्कोडिंग के लिए, मुझे 16 में से 13 मूल्यों की आवश्यकता है, इसलिए शायद मैं "Empty1" कहने के लिए किसी अन्य का उपयोग कर सकता हूं। फिर, मुझे 64 निबल्स == 128 बिट्स की आवश्यकता है।

आंदोलनों के लिए, मुझे टुकड़े के लिए 3 बिट्स की आवश्यकता होती है (रंग इस तथ्य से दिया जाता है कि सफेद हमेशा आगे बढ़ता है) नई स्थिति के लिए प्लस 5 बिट्स (0..63) = प्रति आंदोलन एक बाइट। अधिकांश समय, मुझे पुरानी स्थिति की आवश्यकता नहीं है क्योंकि केवल एक टुकड़ा सीमा के भीतर होगा। विषम स्थिति के लिए, मुझे एकल अप्रयुक्त कोड का उपयोग करना चाहिए (मुझे टुकड़े को एन्कोड करने के लिए केवल 7 कोड की आवश्यकता है) और फिर पुराने के लिए 5 बिट्स और नई स्थिति के लिए 5 बिट्स।

यह मुझे 13 काटने में कास्टिंग को एन्कोड करने की अनुमति देता है (मैं राजा को रूक की ओर ले जा सकता हूं जो यह कहने के लिए पर्याप्त है कि मैं क्या इरादा रखता हूं)।

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

[EDIT2] जो प्यादा परिवर्तन को छोड़ देता है। यदि कोई प्यादा अंतिम पंक्ति तक पहुँचता है, तो मैं इसे "रूपांतरित" कहने के लिए स्थानांतरित कर सकता हूं और फिर उस टुकड़े के लिए 3 बिट्स जोड़ सकता हूं जिसे इसके साथ बदल दिया गया है (आपको एक रानी का उपयोग करने की आवश्यकता नहीं है; आप प्यादे को किसी भी चीज़ से बदल सकते हैं; लेकिन राजा)।


स्मार्ट एनकोडर यह नहीं मान सकता है कि यह एक पूरा खेल है। यह एक खेल का एक टुकड़ा हो सकता है। मुझे लगता है कि आपको अभी भी शुरुआत की स्थितियों को एनकोड करना होगा।
एंड्रयू रोलिंग ने

खैर, सबसे खराब स्थिति में, मुझे या तो 128 बिट्स की आवश्यकता है या, यदि खेल अभी भी शुरुआती चरण में है, तो मैं इसे शुरुआती स्थिति में लाने के लिए 15 चालों का उपयोग कर सकता हूं = 120 बिट्स।
आरोन दिगुल्ला

चूंकि किसी भी राज्य को एन्कोड किया जाना चाहिए, और न केवल प्रारंभिक बोर्ड राज्य, आपको टुकड़ों को भी एनकोड करना होगा। तो आपको प्रति टुकड़ा कम से कम 5 बिट्स की आवश्यकता होगी। तो यह आपको कम से कम 32 * 5 बिट्स अतिरिक्त देगा
टॉड

@ क्रेना: आप गलत हैं। मुझे बस चार टुकड़े प्रति टुकड़ा / खाली वर्ग चाहिए। और मैंने पहले ही अपने उत्तर के पहले भाग में इसे कवर कर दिया है, इसलिए कोई "32 * 5 बिट्स अतिरिक्त" नहीं है। प्रारंभिक अवस्था के लिए, मुझे 96 बिट्स की आवश्यकता होती है और किसी अन्य प्रारंभ राज्य के लिए, मुझे अधिकतम 128 बिट्स की आवश्यकता होती है।
आरोन दिगुल्ला

हारून: अभी भी जैसा कि आप कहते हैं कि इस एन्कोडिंग में सबसे खराब स्थिति वास्तव में सबसे खराब स्थिति है। स्टार्टबोर्ड से 3 या 4 चालों के बाद, आपके एन्कोडिंग को अधिक बिट्स की आवश्यकता होगी क्योंकि आप अधिक से अधिक खाली जोड़ रहे हैं
टॉड

2

जैसे वे खेल को किताबों और कागजों पर अंकित करते हैं: हर टुकड़े में एक प्रतीक होता है; चूँकि यह एक "कानूनी" खेल है, सफेद पहले चलता है - सफेद या काले रंग को अलग करने की कोई आवश्यकता नहीं है, बस चाल की संख्या को निर्धारित करें कि कौन स्थानांतरित हुआ। इसके अलावा, हर चाल को (टुकड़ा, समाप्ति की स्थिति) के रूप में एन्कोड किया गया है, जहां 'समाप्ति की स्थिति' कम से कम प्रतीकों को कम करने की अनुमति देती है जो अस्पष्टता को समझने की अनुमति देती है (शून्य हो सकती है)। खेल की लंबाई चाल की संख्या निर्धारित करती है। प्रत्येक चरण में मिनटों (अंतिम चाल के बाद) में समय को भी सांकेतिक शब्दों में बदलना कर सकते हैं।

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

कम्प्यूटेशनल न्यूरोसाइंस (एईआर) में स्पाइक ट्रेनों के लिए इसी तरह के एन्कोडिंग का उपयोग किया जाता है।

कमियां: आपको वर्तमान स्थिति पर पहुंचने के लिए पूरे गेम को फिर से खेलना और एक उप-लिंक उत्पन्न करने की आवश्यकता है, जो कि एक लिंक की गई सूची को ट्रेस करना है।


यह केवल एक खेल टुकड़ा हो सकता है। आप सफेद चाल के झगड़े को नहीं मान सकते।
एंड्रयू रोलिंग

2

64 संभावित बोर्ड स्थान हैं, इसलिए आपको प्रति स्थिति 6 बिट्स की आवश्यकता है। 32 प्रारंभिक टुकड़े हैं, इसलिए हमारे पास अब तक कुल 192 बिट्स हैं, जहां हर 6 बिट्स दिए गए टुकड़े की स्थिति को इंगित करते हैं। हम टुकड़ों में दिखाई देने वाले क्रम को पूर्व-निर्धारित कर सकते हैं, इसलिए हमें यह कहने की आवश्यकता नहीं है कि कौन सा है।

क्या होगा अगर एक टुकड़ा बोर्ड से दूर है? ठीक है, हम एक टुकड़े को उसी स्थान पर रख सकते हैं जो दूसरे टुकड़े के रूप में इंगित करता है कि यह बोर्ड से दूर है, क्योंकि यह अन्यथा अवैध होगा। लेकिन हम यह भी नहीं जानते कि पहला टुकड़ा बोर्ड पर होगा या नहीं। तो हम 5 बिट्स जोड़ते हैं जो यह दर्शाता है कि कौन सा टुकड़ा पहला है (32 संभावनाएं = 5 टुकड़े पहले टुकड़े का प्रतिनिधित्व करने के लिए)। फिर हम बाद के टुकड़ों के लिए उस जगह का उपयोग कर सकते हैं जो बोर्ड से दूर हैं। यह हमें कुल 197 बिट्स तक पहुंचाता है। बोर्ड पर कम से कम एक टुकड़ा होना चाहिए, ताकि काम हो सके।

फिर हमें एक बिट की आवश्यकता है, जिसकी बारी है - हमें 198 बिट्स पर लाता है

प्यादा प्रचार के बारे में क्या? हम इसे प्रति मिनट 3 बिट्स जोड़कर, 42 बिट्स पर जोड़कर एक बुरा तरीका कर सकते हैं। लेकिन तब हम देख सकते हैं कि अधिकांश समय, प्यादों को बढ़ावा नहीं दिया जाता है।

इसलिए, बोर्ड पर मौजूद हर मोहरे के लिए, बिट '0' इंगित करता है कि इसका प्रचार नहीं किया गया है। यदि एक मोहरा बोर्ड पर नहीं है, तो हमें थोड़ी भी ज़रूरत नहीं है। तब हम चर लंबाई बिट स्ट्रिंग का उपयोग कर सकते हैं जिसके लिए उसके पास पदोन्नति है। सबसे अधिक बार यह एक रानी होगी, इसलिए "10" का मतलब क्वीन हो सकता है। तब "110" का अर्थ है किश्ती, "1110" का अर्थ है बिशप, और "1111" का अर्थ है शूरवीर।

प्रारंभिक अवस्था 198 + 16 = 214 बिट्स ले जाएगी , क्योंकि सभी 16 प्यादे बोर्ड पर हैं और अनप्रोटेक्टेड हैं। दो पदोन्नत प्यादा-रानियों के साथ एक अंत-गेम 198 + 4 + 4 की तरह कुछ ले सकता है, जिसका अर्थ है 4 प्यादे जीवित और पदोन्नत नहीं और 2 रानी प्यादे, 206 बिट्स के लिए कुल के लिए। बहुत मजबूत लगता है!

===

हफ़मैन एन्कोडिंग, जैसा कि अन्य ने बताया है, अगला कदम होगा। यदि आप कुछ मिलियन खेलों का निरीक्षण करते हैं, तो आप देखेंगे कि प्रत्येक टुकड़ा कुछ वर्गों पर होने की अधिक संभावना है। उदाहरण के लिए, ज्यादातर समय, प्यादे एक सीधी रेखा में रहते हैं, या एक बाईं ओर / एक दाईं ओर। राजा आमतौर पर घर के आधार के आसपास रहना होगा।

इसलिए, प्रत्येक अलग स्थिति के लिए एक हफ़मैन एन्कोडिंग योजना तैयार करें। पवन की संभावना केवल 6. के बजाय औसत 3-4 बिट्स की होगी। राजा को कुछ बिट्स भी लेने चाहिए।

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

पर्याप्त डेटा के साथ इस दृष्टिकोण को वास्तव में अच्छे परिणाम प्राप्त करने चाहिए।


2
बस हटाए गए टुकड़ों को उसी वर्ग को सौंपें जो राजा के रूप में हो। चूंकि राजा को कभी हटाया नहीं जा सकता है इसलिए वह अस्पष्ट नहीं होगा
जॉन ला रोय डे

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

2

मैं हफ़मैन एन्कोडिंग का उपयोग करने की कोशिश करूँगा । इसके पीछे सिद्धांत है - हर शतरंज के खेल में कुछ ऐसे टुकड़े होंगे जो बहुत आगे बढ़ेंगे, और कुछ ऐसे हैं जो बहुत आगे नहीं बढ़ते हैं या जल्दी खत्म नहीं होते हैं। यदि शुरुआती स्थिति में कुछ टुकड़े पहले से ही हटा दिए गए हैं - सभी बेहतर। वही वर्गों के लिए जाता है - कुछ वर्गों को सभी कार्रवाई देखने को मिलती है, जबकि कुछ को बहुत अधिक स्पर्श नहीं किया जाता है।

इस प्रकार मेरे पास दो हफ़मैन टेबल होंगे - एक टुकड़ों के लिए, दूसरा चौकों के लिए। वे वास्तविक खेल को देखकर उत्पन्न होंगे। मेरे पास प्रत्येक टुकड़ा-वर्ग जोड़ी के लिए एक बड़ी तालिका हो सकती है, लेकिन मुझे लगता है कि यह बहुत अक्षम होगा क्योंकि एक ही टुकड़े के एक ही वर्ग पर फिर से चलने के कई उदाहरण नहीं हैं।

हर टुकड़े में एक निर्धारित आईडी होगी। चूंकि 32 अलग-अलग टुकड़े हैं, इसलिए मुझे आईडी आईडी के लिए सिर्फ 5 बिट्स की आवश्यकता होगी। टुकड़ा आईडी खेल से खेल में नहीं बदल रहे हैं। वही वर्ग आईडी के लिए जाता है, जिसके लिए मुझे 6 बिट्स की आवश्यकता होगी।

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

प्रारंभिक स्थिति केवल टुकड़ा-स्थान जोड़े की एक श्रृंखला द्वारा दी जाएगी। उसके बाद हर कदम के लिए एक टुकड़ा-स्थान जोड़ी होगी। आप शुरुआती स्थिति विवरणक के अंत (और चालें वर्णनकर्ता की शुरुआत) को केवल दो बार उल्लेखित पहला टुकड़ा ढूंढकर प्राप्त कर सकते हैं। यदि कोई मोहरा प्रचारित हो जाता है, तो 2 अतिरिक्त बिट्स होंगे जो निर्दिष्ट करते हैं कि यह क्या हो जाता है, लेकिन टुकड़ा आईडी नहीं बदलेगा।

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

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

इसे चित्रमय शब्दों में सम्‍मिलित करने के लिए:

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

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

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

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

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

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

हालांकि यह मूल स्थिति का प्रतिनिधित्व करने में कठिनाई पेश करेगा। प्रत्येक स्थान पर एक टुकड़ा लगाने के लिए एक चाल की एक श्रृंखला उत्पन्न हो सकती है। इस मामले में किसी भी तरह प्रारंभिक अवस्था के अंत को चिह्नित करना और चालों की शुरुआत करना आवश्यक होगा।

वैकल्पिक रूप से उन्हें असम्पीडित 6-बिट वर्ग आईडी का उपयोग करके रखा जा सकता है।

क्या यह आकार में समग्र कमी पेश करेगा - मुझे नहीं पता। शायद, लेकिन थोड़ा प्रयोग करना चाहिए।

जोड़ा गया 2: एक और विशेष मामला। यदि खेल राज्य में कोई चाल नहीं है तो यह महत्वपूर्ण है कि कौन आगे बढ़ता है। उसके लिए अंत में एक और बिट जोड़ें। :)


2

[प्रश्न को ठीक से पढ़ने के बाद संपादित किया गया] यदि आप मानते हैं कि प्रत्येक कानूनी स्थिति को प्रारंभिक स्थिति (जो "कानूनी" की एक संभावित परिभाषा है) से पहुंचा जा सकता है, तो किसी भी स्थिति को शुरू से ही चाल के अनुक्रम के रूप में व्यक्त किया जा सकता है। एक गैर-मानक स्थिति से शुरू होने वाले खेल का एक स्निप को स्टार्ट तक पहुंचने के लिए आवश्यक चाल के अनुक्रम के रूप में व्यक्त किया जा सकता है, कैमरा चालू करने के लिए एक स्विच, इसके बाद के कदम।

तो चलो प्रारंभिक बोर्ड को एकल बिट "0" कहते हैं।

किसी भी स्थिति से चालें वर्गों की संख्या के हिसाब से गणना की जा सकती हैं और पारंपरिक 2 वर्ग कूद के साथ (शुरुआत, अंत) द्वारा चालों का आदेश दिया जा सकता है। अवैध चालों को एनकोड करने की आवश्यकता नहीं है, क्योंकि बोर्ड की स्थिति और नियम हमेशा पहले से ही ज्ञात हैं। कैमरे को चालू करने के लिए ध्वज को या तो एक विशेष-बैंड चाल के रूप में व्यक्त किया जा सकता है, या अधिक समझदारी से एक आउट-ऑफ-बैंड चाल संख्या के रूप में।

दोनों ओर के लिए 24 उद्घाटन चालें हैं, जो प्रत्येक 5 बिट में फिट हो सकती हैं। बाद की चालों को कम या ज्यादा बिट्स की आवश्यकता हो सकती है, लेकिन कानूनी कदम हमेशा गणना योग्य होते हैं, इसलिए प्रत्येक चाल की चौड़ाई खुशी से बढ़ सकती है या विस्तारित हो सकती है। मैंने गणना नहीं की है, लेकिन मुझे लगता है कि 7 बिट स्थिति दुर्लभ होगी।

इस प्रणाली का उपयोग करते हुए, लगभग 500 बिट्स में 100 अर्ध-चालित गेम को इनकोड किया जा सकता है। हालांकि, एक शुरुआती पुस्तक का उपयोग करना बुद्धिमानी हो सकती है। मान लीजिए कि इसमें एक मिलियन सीक्वेंस हैं। फिर, एक प्रारंभिक 0 मानक बोर्ड से एक शुरुआत का संकेत देता है, और एक 1 जिसके बाद 20 बिट संख्या होती है, उस उद्घाटन अनुक्रम से एक शुरुआत का संकेत देता है। कुछ पारंपरिक उद्घाटन वाले खेलों को 20 अर्ध-चाल या 100 बिट्स कहकर छोटा किया जा सकता है।

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

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


प्रारंभिक स्थिति आवश्यक रूप से ज्ञात नहीं है। यह एक खेल टुकड़ा हो सकता है।
एंड्रयू रोलिंग

@ और: हाँ। मेरी गलती। मैंने खेल के टुकड़ों के लिए अनुमति देने के लिए संपादन किया है।
डगलस बैगनॉल

2

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

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

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

प्रारंभिक स्थिति सबसे कठिन है और लगभग 250 मिलियन संभावित पदों को उत्पन्न कर सकती है (मुझे लगता है) जिसके बारे में 28 बिट्स और एक अतिरिक्त बिट की आवश्यकता होगी ताकि यह निर्धारित किया जा सके कि यह किसकी चाल है।

यह मानते हुए कि यह किसकी बारी है (प्रत्येक बारी सफेद से काले रंग की हो जाती है) नियतात्मक जनरेटर कुछ इस तरह दिखाई देगा:

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

'संभावित कदमों की सूची प्राप्त करें' कुछ ऐसा करेगा:

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

यदि राजा जाँच में है तो प्रत्येक 'संभावित xxx चालों की सूची' केवल वैध चालें देता है जो जाँच स्थिति को बदल देती हैं।


यह एक डरपोक समाधान है ... इसलिए ... इस उदाहरण में, निर्धारक संख्या उत्पन्न करने के लिए अपने एल्गोरिथ्म का वर्णन करें।
एंड्रयू रोलिंग

मुझे शतरंज की बिसात पर हर स्थिति उत्पन्न करने में कितना समय लगेगा, इस पर एक दिलचस्प लिंक मिला
एंड्रयू

2

अधिकांश उत्तरों ने 3 गुना दोहराव की अनदेखी की। दुर्भाग्य से 3 गुना पुनरावृत्ति के लिए आपको अब तक खेले गए सभी पदों को संग्रहीत करना होगा ...

प्रश्न को हमें अंतरिक्ष कुशल तरीके से संग्रहीत करने की आवश्यकता है, इसलिए हमें वास्तव में स्थिति को संग्रहीत करने की आवश्यकता नहीं है क्योंकि हम इसे चालों की सूची से बना सकते हैं (बशर्ते हमारे पास मानक आरंभ करने की स्थिति हो)। हम PGN को ऑप्टिमाइज़ कर सकते हैं और इसे हम कर सकते हैं। Bellow एक सरल योजना है।

बोर्ड पर 64 वर्ग हैं, 64 = 2 ^ 6. यदि हम प्रत्येक चाल के केवल प्रारंभिक और अंतिम वर्ग को संग्रहीत करते हैं जो 12 बिट्स ले जाएगा (पदोन्नति बाद में निपटा जाएगा)। ध्यान दें कि यह योजना पहले से ही खिलाड़ी को स्थानांतरित करने के लिए कवर करती है, जोर देती है, टुकड़ा पर कब्जा कर लिया है, कास्टिंग आदि; इन के रूप में निर्माण किया जा सकता है बस सूची को फिर से खेलना से।

प्रचार के लिए हम एक अलग प्रकार के वेक्टर रख सकते हैं जो कहेंगे "एट एन एन प्रोम टू पीस एक्सवाईजेड"। हम (int, बाइट) का एक वेक्टर रख सकते हैं।

यह (To, From) वेक्टर को ऑप्टिमाइज़ करने के लिए लुभाता है, क्योंकि इनमें से कई (To, From) वैक्टर शतरंज में पॉसिबल नहीं होते हैं। जैसे। वहाँ e1 से d8 आदि के लिए एक कदम नहीं होगा, लेकिन मैं किसी भी योजना के साथ नहीं आ सका। किसी भी आगे के विचारों का सबसे अधिक स्वागत किया जाता है।


2

मैंने उस एक लंबे समय (+ - 2 घंटे) के बारे में सोचा है। और कोई स्पष्ट जवाब नहीं है।

मान लिया जाये कि:

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

... तो आधुनिक नियमों की तारीख तक यह है। पुनरावृत्ति और चालित सीमा की परवाह किए बिना पहले।

-सी 25 बाइट्स गोल (64b + 32 * 4b + 5b = 325b)

= 64 बिट्स (कुछ / कुछ नहीं) + 32 * 4 बिट्स [1bit = रंग {काला / विटाहे} + 3bit = प्रकार का टुकड़ा {राजा, रानी, ​​बिशप, kNight, Rook, प्यादा, MovedPawn} NB: चालित प्यादा ... उदाहरण के लिए, यदि यह पिछली बारी में पिछले मोहरे को इंगित करता है कि यह दर्शाता है कि 'एन पास' संभव है। ] वास्तविक स्थिति के लिए + 5bit (जो बारी है, पास करने वाले, घूमने की संभावना या प्रत्येक पक्ष पर नहीं)

अब तक सब ठीक है। शायद बढ़ाया जा सकता है लेकिन तब विचार करने के लिए चर लंबाई और पदोन्नति होगी !?

अब, निम्नलिखित नियम केवल एक ड्रा के लिए एक खिलाड़ी के आवेदन पर लागू होते हैं, यह स्वचालित नहीं है! इस पर विचार एक कब्जा या आ मोहरा कदम के बिना इस 90 चाल संभव है अगर कोई खिलाड़ी एक ड्रॉ के लिए कहता है! मतलब कि सभी चालों को रिकॉर्ड किया जाना चाहिए ... और उपलब्ध है।

-D स्थिति की पुनरावृत्ति ... उदाहरण के लिए ऊपर बताए अनुसार राज्य की स्थिति (देखें C) या नहीं ... (FIDE नियमों के बारे में निम्नलिखित देखें) -E जो 50 चालित भत्ते की जटिल समस्या को बिना कब्जा या मोहरे के स्थानांतरित करने के लिए छोड़ देता है a काउंटर आवश्यक है ... हालाँकि।

तो आप इससे कैसे निपटेंगे? ... वास्तव में कोई रास्ता नहीं है। क्योंकि न तो खिलाड़ी ड्रा करना चाहेगा, न ही यह महसूस कर सकता है कि यह हुआ है। अब यदि E एक काउंटर पर्याप्त हो सकता है ... लेकिन यहाँ ट्रिक है और यहां तक ​​कि FIDE के नियम (http://www.fide.com/component/handbook/?id=124&view=article) पढ़कर मुझे पता नहीं चला उत्तर ... रोस्टिंग की क्षमता के नुकसान के बारे में क्या। क्या वह पुनरावृत्ति है? मुझे लगता है कि नहीं लेकिन फिर यह एक धुंधला विषय है जिसे संबोधित नहीं किया गया है, स्पष्ट नहीं किया गया है।

तो यहाँ दो नियम हैं जो दो जटिल या अपरिभाषित हैं, यहां तक ​​कि सांकेतिक शब्दों में बदलना ... चीयर्स।

तो वास्तव में एक खेल को एन्कोड करने का एकमात्र तरीका है कि सभी को शुरू से रिकॉर्ड किया जाए ... जो तब "बोर्ड राज्य" प्रश्न के साथ संघर्ष (या नहीं?)।

आशा है कि यह मदद ... बहुत अधिक गणित नहीं है :-) बस यह दिखाने के लिए कि कुछ प्रश्न उतने आसान नहीं हैं, व्याख्या या पूर्व-ज्ञान के लिए सही और कुशल होने के लिए भी खुले हैं। कोई भी मैं साक्षात्कार के लिए विचार नहीं करेगा क्योंकि यह कीड़ा का एक बहुत खोल सकता है।


2

यकोबी के समाधान में शुरुआती स्थिति पर संभावित सुधार

किसी भी कानूनी स्थिति में प्रत्येक रंग के 16 से अधिक टुकड़े नहीं होते हैं। 64 वर्गों पर 16 काले और 16 सफेद टुकड़ों को रखने के तरीकों की संख्या लगभग 3.63e27 है। Log2 (3.63e27) = 91.55। इसका मतलब है कि आप 92 टुकड़ों में सभी टुकड़ों की स्थिति और रंग को एन्कोड कर सकते हैं। यह स्थिति के लिए 64 बिट्स से कम है + रंग के लिए 32 बिट्स तक जो कि याकोबी के समाधान की आवश्यकता है। एन्कोडिंग में काफी जटिलता की कीमत पर आप सबसे खराब स्थिति में 4 बिट्स बचा सकते हैं।

दूसरी ओर, यह 5 या अधिक टुकड़ों के लापता होने की स्थिति के लिए आकार बढ़ाता है। ये स्थिति सभी पदों में से केवल <4% का प्रतिनिधित्व करती है, लेकिन वे संभवतः उन मामलों में से अधिकांश हैं जहां आप प्रारंभिक स्थिति से भिन्न स्थिति दर्ज करना चाहते हैं।

इससे संपूर्ण समाधान होता है

  1. ऊपर की विधि के अनुसार टुकड़ों की स्थिति और रंग को एनकोड करें। 92 बिट्स
  2. प्रत्येक टुकड़े के प्रकार को निर्दिष्ट करने के लिए, एक हफ़मैन कोड का उपयोग करें: pawn: '0', rook: '100', नाइट: '101', बिशप: '110', रानी: '1110', किंग: '1111'। इसके लिए (16 * 1 + 12 * 3 + 4 * 4) = 68 बिट्स के एक पूरे सेट की आवश्यकता होती है। पूर्ण बोर्ड की स्थिति अधिकतम 92 + 68 = 160 बिट्स में एन्कोड की जा सकती है ।
  3. अतिरिक्त गेम स्टेट शॉड को जोड़ा जाना चाहिए: टर्न: 1 बिट, जो कास्ट करना संभव है: 4 बिट्स, "एन पासेंट" संभव: 4 बिट्स तक (1 बिट बताता है कि यह मामला है और 3 बिट्स बताते हैं कि कौन सा)। प्रारंभिक स्थिति = 160 + 9 = 169 बिट्स में एन्कोडेड है
  4. चालों की सूची के लिए, किसी दिए गए पद के लिए सभी संभव कदमों की गणना करें और सूची में कदम की स्थिति को संग्रहीत करें। चालों की सूची में सभी विशेष मामले शामिल हैं (कास्टिंग, एन पास, और इस्तीफा)। उच्चतम स्थिति को संग्रहीत करने के लिए आवश्यक के रूप में केवल कई बिट्स का उपयोग करें। औसतन यह 7 बिट्स प्रति चाल (16 संभावित टुकड़े और औसतन प्रति टुकड़े 8 कानूनी चाल) से अधिक नहीं होनी चाहिए। किसी मामले में, जब एक चाल को मजबूर किया जाता है, तो उसे केवल 1 बिट (चाल या इस्तीफा) की आवश्यकता होती है।

1

बोर्ड पर 32 टुकड़े हैं। प्रत्येक टुकड़े की एक स्थिति होती है (64 वर्गों में एक)। तो आपको बस 32 सकारात्मक पूर्णांक चाहिए।

मुझे पता है कि 64 स्थिति 6 बिट्स में है, लेकिन मैं ऐसा नहीं करूंगा। मैं कुछ झंडे (गिरा टुकड़ा, रानी का मोहरा) के लिए अंतिम बिट्स रखूंगा


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

हाँ, यह होना चाहिए, क्योंकि आप एक मोहरे की प्रारंभिक स्थिति से नहीं बता सकते हैं कि प्यादे को बढ़ावा दिया गया है या नहीं! तो यह प्रारंभिक सेटअप में एन्कोड किया जाना है
टॉड

आह, लेकिन अगर यह पहले से ही पदोन्नत किया गया है तो आपको यह जानने की आवश्यकता क्यों होगी? यह सिर्फ एक टुकड़ा है। यह पिछले राज्य इस उदाहरण में अप्रासंगिक होगा।
एंड्रयू रोलिंग 13

मुझे लगता है कि अगर एक मोहरा अभी भी एक मोहरा है या एक रानी को बढ़ावा दिया गया है तो शायद ही खेल के बाकी हिस्सों के लिए अप्रासंगिक हो। यदि आप ऐसा नहीं सोचते हैं, तो मैं आपके साथ शतरंज का खेल खेलना पसंद करूंगा; ^)
टॉड

@reinier: वह दावा कर रहा है कि यह अप्रासंगिक है यदि वर्तमान रानी मूल रूप से रानी थी या मूल रूप से मोहरा थी।
ए रेक्स

1

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

मैं एक शतरंज खिलाड़ी नहीं हूं, लेकिन मेरा मानना ​​है कि एक और कोने का मामला भी है: कितनी चालें दोहराई गई हैं। एक बार प्रत्येक खिलाड़ी तीन बार एक ही चाल चलता है, तो खेल ड्रा है, नहीं? यदि ऐसा है, तो आपको राज्य में उस जानकारी को सहेजना होगा क्योंकि तीसरे दोहराने के बाद, राज्य अब टर्मिनल है।


उस मार्ग पर जाने के लिए, आपको दोनों खिलाड़ियों के लिए खेले गए समय को जोड़ने की आवश्यकता है क्योंकि वास्तविक शतरंज के खेल में दोनों खिलाड़ी केवल 1 या 2 घंटे सोचते हैं।
टॉड

2
आपको वास्तविक डेटा में नियमों को एनकोड करना नहीं है। आप मान सकते हैं कि एनकोडर स्वयं किसी भी नियम को जानता है जो आवश्यक हैं।
एंड्रयू रोलिंग ने

आह .. मैं खेलने के समय पर विचार नहीं किया। अच्छी कॉल ... :)
एंड्रयू रोलिंग

@Andrew Rollings: नियम राज्य-आधारित है, जैसे कि, यह केवल तभी चलता है जब एक निश्चित पूर्व शर्त पूरी होती है। ट्रैकिंग उस पूर्व शर्त के राज्य का भी हिस्सा है ... अच्छी तरह से, राज्य। :)
झबरा मेंढक

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

1

जैसा कि कई अन्य लोगों ने उल्लेख किया है कि आप उन 32 टुकड़ों में से प्रत्येक के लिए रख सकते हैं जिन्हें आप स्टोर कर सकते हैं कि वे किस वर्ग में हैं और यदि वे बोर्ड पर हैं या नहीं, तो यह 32 * (log2 (64) + 1) = 224 बिट्स देता है।

हालाँकि बिशप केवल या तो काले या सफेद वर्गों पर कब्जा कर सकते हैं इसलिए इन के लिए आपको केवल स्थिति के लिए लॉग 2 (32) बिट्स की आवश्यकता होती है, जो 28 * 7 + 4 * 6 = 220 बिट्स देते हैं।

और जब से प्यादे पीठ पर शुरू नहीं होते हैं और केवल आगे बढ़ सकते हैं, वे केवल 56 पर हो सकते हैं, प्यादों के लिए आवश्यक बिट्स की संख्या को कम करने के लिए इस सीमा का उपयोग करना संभव होना चाहिए।


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

बिशप के लिए 6 बिट्स log2 (32) + 1 = 6 हैं, लेकिन यह सुनिश्चित करने के लिए एक जटिल सवाल है जब आप सभी विवरणों पर विचार करते हैं :)
एंड्रियास ब्रिंक

मैं इन लाइनों के साथ सोच रहा था, लेकिन यह मदद नहीं करता है। थॉमस के उत्तर को देखें और रिक्त स्थानों की धारणा को हटाने के लिए उसके हफ़मैन एन्कोडिंग को संशोधित करें। आप 64 बिट्स का उपयोग करते हैं, जिसके मैट्रिक्स को स्टोर करने के लिए आप पर कब्जा कर लिया गया है और आप प्रत्येक एनकोड से 1 बिट हटाते हैं - इस प्रकार ठीक उसी 64 बिट्स को रिकवर करते हैं।
लोरेन पीचटेल

1

एक बोर्ड में 64 वर्ग हैं, और 64 बिट्स द्वारा यह दर्शाया जा सकता है कि कोई वर्ग खाली है या नहीं। हमें केवल जानकारी की आवश्यकता है यदि एक वर्ग में एक टुकड़ा है। चूंकि खिलाड़ी + टुकड़ा 4 बिट्स लेता है (जैसा कि पहले दिखाया गया है) हम 64 + 4 * 32 = 192 बिट्स में वर्तमान स्थिति प्राप्त कर सकते हैं। वर्तमान मोड़ में फेंकें और आपके पास 193 बिट्स हैं।

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

प्यादा: आगे, पहले दो आगे, एन पास * 2, पदोन्नति = 7 बिट। आप पहली बारी को आगे बढ़ा सकते हैं और एक ही बिट में पदोन्नति कर सकते हैं क्योंकि वे एक ही स्थिति से नहीं हो सकते हैं, इसलिए आपके पास 6. रूक: 7 ऊर्ध्वाधर वर्ग, 7 क्षैतिज वर्ग = 14 बिट्स नाइट: 8 वर्ग = 8 बिट्स बिशप: 2 विकर्ण * 7 = 14 बिट्स क्वीन: 7 खड़ी, 7 क्षैतिज, 7 विकर्ण, 7 विकर्ण = 28 बिट राजा: 8 आसपास के वर्ग

इसका मतलब यह है कि आपको वर्तमान स्थिति के आधार पर लक्षित वर्गों को मैप करने की आवश्यकता होगी, लेकिन यह एक साधारण गणना होना चाहिए।

चूंकि हमारे पास 16 प्यादे, 4 बदमाश / शूरवीर / बिशप, और 2 रानी / राजा हैं, यह 16 * 6 + 4 * 14 + 4 * 8 + 4 * 14 + 2 * 28 + 2 * 8 * 3 = 12 बिट्स हैं, कुल 505 बिट्स।

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

लंबी कहानी छोटी: एक वर्ग के कब्जे में होने पर केवल अतिरिक्त डेटा (टुकड़ा, आदि) को स्टोर करें और प्रत्येक टुकड़े को उसकी कानूनी चालों का प्रतिनिधित्व करने के लिए केवल न्यूनतम बिट्स स्टोर करें।

EDIT1: किसी भी टुकड़े के लिए कास्टलिंग और प्यादा प्रचार के बारे में भूल गए। यह 557 चालों के लिए स्पष्ट स्थिति के साथ कुल ला सकता है (प्यादों के लिए 3 और बिट्स, राजाओं के लिए 2)


1

प्रत्येक टुकड़े को 4 बिट्स (राजा, 6 प्रकार), काले / सफेद = 12 मूल्यों द्वारा दर्शाया जा सकता है

बोर्ड पर प्रत्येक वर्ग को 6 बिट्स (x निर्देशांक, y निर्देशांक) द्वारा दर्शाया जा सकता है।

प्रारंभिक स्थिति में अधिकतम 320 बिट्स (32 टुकड़े, 4 + 6 बिट्स) की आवश्यकता होती है

प्रत्येक बाद की चाल को 16 बिट्स (स्थिति, स्थिति, टुकड़ा) द्वारा दर्शाया जा सकता है।

दोहरी चाल के कारण कास्टिंग को अतिरिक्त 16 बिट्स की आवश्यकता होगी।

कतारबद्ध प्यादों को 4 बिटों में से 4 अतिरिक्त मूल्यों में से एक द्वारा दर्शाया जा सकता है।

गणित को विस्तार से किए बिना, यह 32 * 7 बिट्स (टुकड़ों की पूर्वनिर्धारित सरणी) या 64 * 4 बिट्स (वर्गों के पूर्वनिर्धारित असाइनमेंट) के भंडारण की तुलना में पहले कदम के बाद अंतरिक्ष को बचाने के लिए शुरू होता है।

दोनों तरफ 10 चालों के बाद, आवश्यक अधिकतम स्थान 640 बिट्स है

... लेकिन फिर, यदि हम प्रत्येक टुकड़े को विशिष्ट रूप से पहचानते हैं (5 बिट्स) और कतारबद्ध पंजे को फ़्लैग करने के लिए छठे बिट को जोड़ते हैं, तो हमें प्रत्येक चाल के लिए केवल टुकड़ा-आईडी + स्थिति की आवश्यकता होती है। यह गणना में परिवर्तन करता है ...

प्रारंभिक स्थिति = अधिकतम 384 बिट्स (32 टुकड़े, 6 + 6 बिट्स) प्रत्येक चाल = 12 बिट्स (स्थिति, स्थिति-आईडी)

फिर प्रत्येक तरफ 10 चालों के बाद आवश्यक अधिकतम स्थान 624 बिट्स है


दूसरे विकल्प में अतिरिक्त लाभ है कि भंडारण को 12 बिट रिकॉर्ड, प्रत्येक रिकॉर्ड = स्थिति और टुकड़े के रूप में पढ़ा जा सकता है। पहली चाल टैक्सी का पता इस तथ्य से लगाया जाना चाहिए कि टुकड़ा में एक पूर्व प्रविष्टि है।
स्टीव डी कॉक

चाल के बीच के समय के लिए, प्रत्येक रिकॉर्ड के लिए काउंटर के लिए x बिट्स जोड़ें। सेटअप रिकॉर्ड के लिए, यह 0.
स्टीव डी कॉक डेस

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

तो, एक विशिष्ट खेल के लिए, 10 चालों के बाद आप 121 बिट्स पर होंगे, कोई प्रचार नहीं। एटिपिकल खेलों में ध्वज, टुकड़ों * 10 बिट्स के लिए 1 बिट और पहले खिलाड़ी को इंगित करने के लिए एक और बिट की आवश्यकता होगी। इसके अलावा, प्रत्येक चाल में केवल 12 बिट्स की आवश्यकता होगी, क्योंकि किसी दिए गए वर्ग पर टुकड़ा खेल में पिछली चालों से निहित है। यह संभवतः सुझाए गए कुछ तरीकों की तुलना में कम कुशल है, लेकिन "मानक" गेम के लिए बहुत साफ है, और यथोचित रूप से कुशल है।
kyoryu

@kyoro - मुझे यकीन नहीं है कि प्रति चाल 12 बिट्स को पीटा जा सकता है - मानक सेटअप के लिए अशक्त के अपने विचार का उपयोग करके (मैं अभी भी 12 बिट्स को शून्य पर सेट करूँगा) - प्रत्येक तरफ 1000 चाल के बाद यह 24012 बिट्स उर्फ ​​है 3002 बाइट्स (राउंड अप) यहां तक ​​कि अपने डिक्शनरी को हार्ड-कोडेड (या लॉजिकली डिराइवेबल, एक ही बात) घोषित करके आपको इसे हराने के लिए किसी न किसी तरह के कम्प्रेशन का इस्तेमाल करना होता है
स्टीव डी

1

रॉबर्ट जी की तरह, मैं पीजीएन का उपयोग करना चाहूंगा क्योंकि यह मानक है और इसका उपयोग कई प्रकार के उपकरणों द्वारा किया जा सकता है।

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

चालों को रिकॉर्ड करने की आवश्यकता नहीं है; डिकोडर राज्य का ट्रैक रखने के साथ ही किसी भी बिंदु पर कानूनी रूप से क्या कदम उठा सकता है। सभी चालों को रिकॉर्ड करने की आवश्यकता है जो विभिन्न कानूनी विकल्पों में से एक है। खिलाड़ियों के वैकल्पिक होने के बाद, एक चाल को खिलाड़ी के रंग को रिकॉर्ड करने की आवश्यकता नहीं होती है। चूंकि एक खिलाड़ी केवल अपने रंग के टुकड़े को स्थानांतरित कर सकता है, पहली पसंद वह है जो खिलाड़ी चलता है (मैं एक विकल्प पर वापस आऊंगा जो किसी अन्य विकल्प का उपयोग करता है)। अधिकतम 16 टुकड़ों के साथ, इसके लिए अधिकतम 4 बिट्स की आवश्यकता होती है। जैसा कि एक खिलाड़ी टुकड़ों को खो देता है, विकल्पों की संख्या कम हो जाती है। इसके अलावा, एक विशेष खेल राज्य टुकड़ों की पसंद को सीमित कर सकता है। यदि कोई राजा खुद को जांच में रखे बिना नहीं चल सकता है, तो विकल्पों की संख्या कम हो जाती है। यदि एक राजा जाँच में है, तो कोई भी टुकड़ा जो राजा को जाँच से बाहर नहीं निकाल सकता है, एक व्यवहार्य विकल्प नहीं है।

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

हम निम्नलिखित क्रम में लाइनों के साथ चौकों की संख्या द्वारा अधिकांश टुकड़ों के गंतव्य को एनकोड करते हैं: डब्ल्यू, एनडब्ल्यू, एन, एनई (ब्लैक साइड एन है)। दी गई दिशा में वर्ग फ़र्स्टेस्ट में एक लाइन शुरू होती है जो आगे बढ़ने के लिए कानूनी है और इसके लिए आगे बढ़ती है। एक अप्रभावित राजा के लिए, चालों की सूची W, E, NW, SE, N, S, NE, SW है। नाइट के लिए, हम 2W1N से शुरू करते हैं और दक्षिणावर्त आगे बढ़ते हैं; गंतव्य 0 इस क्रम में पहला वैध गंतव्य है।

  • पावन्स: एक अनमोल मोहरे के पास गंतव्य के 2 विकल्प हैं, इस प्रकार 1 बिट की आवश्यकता होती है। यदि कोई मोहरा दूसरे पर कब्जा कर सकता है, या तो सामान्य रूप से या एन पासेंट (जो डिकोडर निर्धारित कर सकता है, क्योंकि यह राज्य का ट्रैक रख रहा है), इसमें 2 या 3 विकल्प हैं। उसके अलावा, एक मोहरे में केवल 1 विकल्प हो सकता है, जिसके लिए बिट्स की आवश्यकता नहीं होती है। जब एक मोहरा अपनी 7 वीं रैंक में होता है, तो हम प्रचार की पसंद पर भी ध्यान देते हैं। चूंकि प्यादों को आमतौर पर रानियों के लिए प्रचारित किया जाता है, उनके बाद शूरवीरों को चुना जाता है, हम इन विकल्पों को इनकोड करते हैं:
    • रानी: ०
    • शूरवीर: १०
    • बिशप: 110
    • किश्ती: 111
  • बिशप: 4 बिट्स के लिए {d, e} {4,5} पर सबसे अधिक 13 गंतव्यों पर।
  • Rook: अधिकांश 14 गंतव्यों पर, 4 बिट्स।
  • शूरवीर: अधिकांश 8 स्थानों पर, 3 बिट्स।
  • किंग्स: जब कास्ट करना एक विकल्प होता है, तो राजा के पास यह एस वापस आ जाता है और नीचे की ओर नहीं जा सकता है; यह कुल 7 गंतव्य देता है। बाकी समय, एक राजा के पास अधिकतम 8 चालें होती हैं, जो अधिकतम 3 बिट्स देता है।
  • रानी: बिशप या किश्ती के लिए कुल 27 विकल्पों में से एक ही है, जो कि 5 बिट्स है

चूंकि विकल्पों की संख्या हमेशा दो की शक्ति नहीं होती है, ऊपर अभी भी बिट्स बर्बाद करता है। मान लीजिए कि विकल्पों की संख्या C है और विशेष पसंद c की संख्या है , और n = छत (lg ( C )) (पसंद को सांकेतिक शब्दों में बदलना करने के लिए आवश्यक बिट्स की संख्या)। हम अगली पसंद के पहले बिट की जांच करके इन अन्यथा बेकार मूल्यों का उपयोग करते हैं। यदि यह 0 है, तो कुछ भी न करें। यदि यह 1 और c + C <2 n है , तो C को c में जोड़ें । एक नंबर को डिकोड करना इसे उलट देता है: यदि प्राप्त सी > = सी , घटाना सी और 1. करने के लिए अगले संख्या के लिए पहली बिट सेट करते हैं<2 एन - सी , फिर अगले नंबर के लिए पहला बिट सेट करें 0. यदि 2 एन - सी <= सी < सी , तो कुछ भी न करें। इस योजना को "संतृप्ति" कहें।

एक और संभावित प्रकार की पसंद जो एन्कोडिंग को छोटा कर सकती है, वह है विरोधियों के टुकड़े को पकड़ने के लिए चुनना। यह एक कदम उठाते हुए, पहले एक अतिरिक्त भाग के लिए विकल्पों की संख्या को बढ़ाता है, एक अतिरिक्त बिट के लिए (सटीक संख्या इस बात पर निर्भर करती है कि मौजूदा खिलाड़ी कितने टुकड़े कर सकता है)। इस विकल्प का अनुसरण कैप्चरिंग पीस की पसंद से किया जाता है, जो कि किसी भी दिए गए खिलाड़ी के टुकड़ों की संख्या की तुलना में संभवतः बहुत कम है। एक टुकड़ा केवल किसी भी कार्डिनल दिशा से एक टुकड़े पर हमला किया जा सकता है और अधिक से अधिक 10 हमलावर टुकड़ों में कुल के लिए शूरवीरों; यह एक कब्जा चाल के लिए कुल 9 बिट देता है, हालांकि मैं औसतन 7 बिट की उम्मीद करूंगा। यह विशेष रूप से रानी द्वारा कब्जा करने के लिए फायदेमंद होगा, क्योंकि इसमें अक्सर कुछ कानूनी गंतव्य होंगे।

संतृप्ति के साथ, कैप्चर-एन्कोडिंग शायद एक फायदा नहीं उठा सकती है। हम दोनों विकल्पों के लिए अनुमति दे सकते हैं, प्रारंभिक अवस्था में निर्दिष्ट करते हैं जो उपयोग किए जाते हैं। यदि संतृप्ति का उपयोग नहीं किया जाता है, तो गेम एन्कोडिंग अप्रयुक्त विकल्प संख्या ( C <= c <2 n ) का उपयोग खेल के दौरान विकल्प बदलने के लिए भी कर सकती है। किसी भी समय C दो की शक्ति है, हम विकल्प नहीं बदल सकते।


1

थॉमस के पास बोर्ड को कूटने के लिए सही तरीका है। हालाँकि, इसे स्टोरिंग चाल के लिए लालू के दृष्टिकोण के साथ जोड़ा जाना चाहिए। सभी संभावित चालों की एक सूची बनाएं, इस संख्या को व्यक्त करने के लिए आवश्यक बिट्स की संख्या लिखें। चूंकि डिकोडर एक ही गणना कर रहा है, यह जानता है कि कितने संभव हैं और पता कर सकते हैं कि कितने बिट्स को पढ़ना है, कोई लंबाई कोड की आवश्यकता नहीं है।

इस प्रकार हम टुकड़ों के लिए 164 बिट्स प्राप्त करते हैं, कास्टिंग जानकारी के लिए 4 बिट्स (यह मानते हुए कि हम एक गेम का एक टुकड़ा स्टोर कर रहे हैं, अन्यथा इसे फिर से संगठित किया जा सकता है), एन पासेंट पात्रता जानकारी के लिए 3 बिट्स - बस उस कॉलम को स्टोर करें जहां कदम हुआ था अगर en passant संभव नहीं है तो एक कॉलम को स्टोर करें जहाँ यह संभव नहीं है - ऐसे कॉलम मौजूद होने चाहिए) और 1 किसके लिए चलना है।

मूव्स आमतौर पर 5 या 6 बिट्स होंगे, लेकिन 1 से 8 तक भिन्न हो सकते हैं।

एक अतिरिक्त शॉर्टकट - यदि एन्कोड 12 12 बिट्स के साथ शुरू होता है (एक अमान्य स्थिति - एक टुकड़ा भी एक तरफ दो राजा नहीं होगा) तो आप डिकोड को निरस्त करते हैं, बोर्ड को मिटाते हैं और एक नया गेम सेट करते हैं। अगला बिट एक चाल सा होगा।


1

एल्गोरिदम को प्रत्येक चाल पर सभी संभावित गंतव्यों को निर्धारित करना चाहिए। गंतव्यों की संख्या:

  • 2 बिशप, 13 गंतव्य प्रत्येक = 26
  • 2 बदमाश, 14 गंतव्य प्रत्येक = 28
  • 2 शूरवीर, 8 गंतव्य प्रत्येक = 16
  • रानी, ​​27 गंतव्य
  • राजा, 8 गंतव्य

8 पंजे सबसे खराब (एन्युमरेशन-वार) मामले में सभी रानियां बन सकते हैं, इस प्रकार 9 * 27 + 26 + 28 + 16 + 8 + 321 संभावित स्थलों की सबसे बड़ी संख्या बनाते हैं। इस प्रकार, किसी भी चाल के लिए सभी गंतव्यों को 9 बिट संख्या द्वारा गणना की जा सकती है।

दोनों दलों की अधिकतम संख्या 100 है (यदि मैं गलत नहीं हूं, शतरंज खिलाड़ी नहीं है)। इस प्रकार कोई भी खेल 900 बिट्स में दर्ज किया जा सकता है। इसके अलावा प्रारंभिक स्थिति में प्रत्येक टुकड़े को 6 बिट संख्याओं का उपयोग करके रिकॉर्ड किया जा सकता है, जो 32 * 6 = 192 बिट्स का योग है। प्लस "बिट जो पहले चलता है" रिकॉर्ड के लिए। इस प्रकार, किसी भी गेम को 900 + 192 + 1 = 1093 बिट्स का उपयोग करके रिकॉर्ड किया जा सकता है।


1

बोर्ड राज्य का भंडारण

मेरे द्वारा सोचा गया सबसे सरल तरीका यह है कि पहले प्रत्येक टुकड़े के स्थान का प्रतिनिधित्व करने वाले 8 * 8 बिट्स का एक सरणी है (इसलिए 1 अगर वहाँ एक शतरंज का टुकड़ा है और 0 अगर वहाँ नहीं है)। चूंकि यह एक निश्चित लंबाई है, हमें किसी टर्मिनेटर की आवश्यकता नहीं है।

इसके स्थान के क्रम में अगला प्रत्येक शतरंज के टुकड़े का प्रतिनिधित्व करता है। प्रति टुकड़े 4 बिट्स का उपयोग करना, इसमें 32 * 4 बिट्स (कुल 128) लगते हैं। जो वास्तव में वास्तव में बेकार है।

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

  • प्यादा: २
  • रूक: ४
  • नाइट: 4
  • बिशप: 4
  • राजा: ५
  • रानी: ५

कुल योग:

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

जो 28 बिट्स द्वारा बिट्स के एक निश्चित आकार के सेट का उपयोग करके धड़कता है।

इसलिए मैंने जो सबसे अच्छा तरीका ढूंढा है वह है इसे 8 2 + 100 बिट ऐरे में स्टोर करना

8*8 + 100 = 164



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

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

तो प्रत्येक सामान्य चाल के लिए हमारे पास एक आवश्यक 1 + 5 = 6बिट है। (1 बिट प्रकार, टुकड़े के लिए 5 बिट)

टुकड़ा संख्या को डिकोड किए जाने के बाद, हम तब टुकड़े के प्रकार को जानते हैं, और प्रत्येक टुकड़े को सबसे कुशल तरीके से अपनी चाल का प्रतिनिधित्व करना चाहिए। उदाहरण के लिए (यदि मेरी शतरंज के नियम खरोंच तक हैं) तो एक मोहरे में कुल 4 संभव चालें होती हैं (बाएं ले जाएं, दाएं ले जाएं, एक आगे बढ़ें, दो आगे बढ़ें)।
तो एक मोहरे चाल का प्रतिनिधित्व करने के लिए हमें '6 + 2 = 8' बिट्स की आवश्यकता है। (प्रारंभिक चाल हेडर के लिए 6 बिट, किस चाल के लिए 2 बिट)

रानी के लिए आगे बढ़ना अधिक जटिल होगा, इसमें प्रत्येक दिशा (इसलिए एक और 3 बिट्स) के लिए स्थानांतरित करने के लिए एक दिशा (8 संभावित दिशाएं, इसलिए 3 बिट्स) और कुल 8 संभावित वर्गों का होना सबसे अच्छा होगा। तो एक रानी को स्थानांतरित करने के लिए इसे 6 + 3 + 3 = 12बिट्स की आवश्यकता होगी ।

आखिरी चीज जो मेरे साथ घटित होती है, वह यह है कि हमें कौन से खिलाड़ियों को इसे स्टोर करना है। यह एक एकल बिट (सफेद या काला होना चाहिए)



परिणामी स्वरूप
तो फ़ाइल स्वरूप कुछ इस तरह दिखाई देगा

[६४ बिट्स] आरंभिक टुकड़ा स्थान
[१०० बिट्स अधिकतम] प्रारंभिक टुकड़े [१ बिट] खिलाड़ी मोड़
[एन बिट्स] चाल

जहां एक मूव होता है
[1 बिट] मूव टाइप (विशेष या सामान्य)
[n बिट्स] मूव डिटेल

यदि चाल एक सामान्य चाल है, तो मूव डिटेल कुछ इस तरह दिखती है
[5 बिट्स] टुकड़ा
[एन बिट्स] विशिष्ट टुकड़ा चाल (आमतौर पर 2 से 6 बिट्स की सीमा में]

यदि यह एक विशेष चाल है तो
इसमें एक पूर्णांक प्रकार और फिर कोई अतिरिक्त जानकारी होनी चाहिए (जैसे कि यह कास्टलिंग है)। मैं विशेष चालों की संख्या को याद नहीं रख सकता, इसलिए यह केवल यह संकेत देना ठीक हो सकता है कि यह एक विशेष चाल है (यदि केवल एक है)


1

प्रारंभिक बोर्ड और बाद की चालों के आधार मामले में, निम्नलिखित पर विचार करें।

सभी संभावित चालों को प्रायिकता प्रदान करने के लिए एक शतरंज कार्यक्रम का उपयोग करें। उदाहरण के लिए, e2-e4 के लिए 40% d2-d4 के लिए 20%, और इसी तरह। यदि कुछ चालें कानूनी हैं लेकिन उस कार्यक्रम द्वारा नहीं माना जाता है, तो उन्हें कुछ कम संभावना दें। जो विकल्प लिया गया था, उसे बचाने के लिए अंकगणित कोडिंग का उपयोग करें, जो कि पहली चाल के लिए 0 और 0.4 के बीच कुछ संख्या होगी, दूसरी के लिए 0.4 और 0.6, और इसी तरह।

दूसरे पक्ष के लिए भी यही करें। उदाहरण के लिए, यदि ई 7-ई 4 की प्रतिक्रिया के रूप में ई 7-ई 5 की 50% संभावना है तो एन्कोडेड संख्या 0 और 0.2 के बीच होगी। खेल होने तक दोहराएं। परिणाम एक संभावित बहुत छोटी सीमा है। सबसे छोटे आधार के साथ द्विआधारी अंश का पता लगाएं जो उस सीमा में फिट बैठता है। यह अंकगणित कोडिंग है।

यह हफ़मैन की तुलना में बेहतर है क्योंकि इसे आंशिक बिट एन्कोडिंग के रूप में सोचा जा सकता है (साथ ही खेल के अंत में कुछ को पूरी तरह गोल करने के लिए)।

परिणाम हफमैन की तुलना में अधिक कॉम्पैक्ट होना चाहिए, और पदोन्नति के लिए कोई विशेष मामले नहीं हैं, एन पासेंट, 50 नियम, और अन्य विवरण क्योंकि वे शतरंज मूल्यांकन कार्यक्रम द्वारा नियंत्रित किए जाते हैं।

फिर से खेलना करने के लिए, बोर्ड का मूल्यांकन करने के लिए फिर से शतरंज कार्यक्रम का उपयोग करें और प्रत्येक चाल के लिए सभी संभावनाओं को असाइन करें। यह निर्धारित करने के लिए अंकगणित एन्कोडेड मान का उपयोग करें कि वास्तव में कौन सी चाल चली गई थी। तब तक दोहराएं।

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

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.