Chess960 स्थिति जनरेटर


11

प्रसंग

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

नियम

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

प्रेषक: http://en.wikipedia.org/wiki/Chess960

उन सभी लोगों के लिए जो उत्तर पोस्ट करना चाहते हैं ...

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

उदाहरण आउटपुट:

rkrbnnbq

कहाँ पे:

  • k राजा
  • क्ष रानी
  • बिशप
  • n शूरवीर
  • आर बदमाश

यह कोड गोल्फ होगा, और टाई ब्रेकर upvotes होगा।


जब आप कहते हैं कि इसे 960 में से किसी भी स्थिति में आउटपुट करने में सक्षम होना है, तो क्या उन्हें परिवर्तनीय होना चाहिए?
पीटर टेलर

दिलचस्प है, मैं वास्तव में इसके बारे में नहीं सोचा है ... मेरा मतलब है कि आदर्श रूप से यह होना चाहिए, मुझे लगता है ... जवाब अब तक इस गुणवत्ता की पेशकश करते हैं, ... सही है?
जेदानो

दो जो उन भाषाओं में लिखे गए हैं जिनमें बिल्‍डिन हैं जो समान रूप से फेरबदल करते हैं; दो GolfScript वाले करीब हैं, लेकिन काफी समान नहीं हैं।
पीटर टेलर

मैं कहूंगा कि करीब काफी अच्छा है
जेंदैनो

इस सवाल ने मुझे codegolf.stackexchange.com/questions/12322/…
user123444555621

जवाबों:


6

GolfScript ( 49 48 वर्ण, या ऊपरी-केस आउटपुट के लिए 47)

'bbnnrrkq'{{;9rand}$.'b'/1=,1$'r'/1='k'?)!|1&}do

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

ऊपरी मामले का उपयोग कर एक चार को बचाने की अनुमति देता है:

'BBNNRRKQ'{{;9rand}$.'B'/1=,1$'R'/1=75?)!|1&}do

8

रूबी 1.9, 67 65 वर्ण

आह, पुराने "जब तक आप कुछ मान्य" तकनीक उत्पन्न randomizing ...

$_=%w(r r n n b b q k).shuffle*''until/r.*k.*r/&&/b(..)*b/
$><<$_

(रूबी 2.0 में, %w(r r n n b b q k)हो सकता है 'rrnnbbqk'.chars)


1
1.9.3 में आप ~उपलब्ध होने पर एक चेतावनी की लागत के साथ स्पेयर कर सकते हैं । pastebin.com/nuE9zWSw
manatwork

@ मैनटवर्क बढ़िया है, धन्यवाद!
पॉल प्रेस्टिज

2
"जब तक आप कुछ वैध उत्पन्न करते हैं तब तक यादृच्छिक करते रहें" तकनीक अभी भी "संभावनाओं की सूची को फ़िल्टर करने, फ़िल्टर करने और पहले लेने" की तुलना में बहुत तेज़ है जो कि एपीएल जैसी विशुद्ध रूप से कार्यात्मक भाषाएं :-) का उत्पादन करती हैं
जॉन ड्वोरक

1
@ डानिएरो निश्चित रूप से $_वैरिएबल है। यह काम करता है क्योंकि रूबी में कर्नेल # काट जैसे कुछ साफ तरीके हैं जो बराबर स्ट्रिंग # काट विधि की तरह काम करते हैं लेकिन $_उनके रिसीवर के रूप में। यह बहुत समय बचाता है जब (उदाहरण के लिए) आप एक पढ़ने / प्रक्रिया / लेखन लूप का उपयोग कर ruby -nया लिख रहे हैं ruby -p
पॉल प्रेस्टिज

2
@ गीगावाट नं। कुछ दो बी के बीच वर्णों की समान संख्या होने पर पूर्व मेल खाता है। बाद का मैच तभी होता है जब B'S अंत में होते हैं।
जॉन ड्वोरक

8

गोल्फस्क्रिप्ट 60 49

;'qbbnnxxx'{{9rand*}$.'b'/1=,2%}do'x'/'rkr'1/]zip

(पीटर टेलर के महान सुझावों के लिए 49 वर्णों को संक्षिप्त किया गया)

यहां ऑनलाइन टेस्ट ।

कोड की व्याख्या:

;'qbbnnxxx'         # push the string 'qbbnnxxx' on the clean stack
{

    {9rand*}$       # shuffle the string

    .'b'/1=,2%      # count the number of places between the 'b's
                    # (including the 'b's themselves)
                    # if this count is even, the bishops are on
                    # squares of different colors, so place a 0
                    # on the stack to make the do loop stop

}do                 # repeat the procedure above until a 
                    # good string is encountered

'x'/                # split the string where the 'x's are

'rkr'1/]zip         # and put 'r', 'k' and then 'r' again
                    # where the 'x's used to be

1
जाँचने के लिए आपका तरीका है कि bs के बीच अक्षरों की संख्या बहुत लंबी है। कैसे के बारे में .'b'/1=,2%?
पीटर टेलर

और आप 'qbbnnxxx'लूप से बाहर निकलने और एक ही स्ट्रिंग को फेरबदल करके विफल प्रयासों को छोड़ने से बच सकते हैं ।
पीटर टेलर

@PeterTaylor महान सुझावों के लिए धन्यवाद। "बी 'के" अंक के बीच की गिनती "के लिए मुझे लगा कि एक छोटा रास्ता होना चाहिए, लेकिन मैं इसे नहीं ढूंढ सका।
क्रिस्टियन लुपस्कू

4

जे, 56 वर्ण

{.(#~'(?=.*b(..)*b).*r.*k.*r.*'&rxeq"1)'kqbbnnrr'A.~?~!8

यह अक्षम एल्गोरिथ्म के कारण मेरी मशीन पर कई सेकंड लेता है। ~.पहले (डुप्लिकेट हटा दें) जोड़कर कुछ गति प्राप्त की जा सकती है 'kqbbnnrr'

स्पष्टीकरण:

  • ?~!8से 8!यादृच्छिक तत्वों से संबंधित है0 ... 8!
  • 'kqbbnnrr'A.~उन्हें स्ट्रिंग के लिए आरेख अनुक्रमित के रूप में उपयोग करता है kqbbnnrr
  • (#~'...'&rxeq"1)' उद्धरण में regex द्वारा उन्हें फ़िल्टर करता है।
  • {. का अर्थ है "पहला तत्व लें"

4

कश्मीर, 69

(-8?)/[{~*(*/~~':{m=_m:x%2}@&x="b")&(&x="k")within&"r"=x};"rrbbnnkq"]

3

पायथन, 105 वर्ण

मूल रूप से क्रोन की तकनीक, सुरुचिपूर्ण रूबी सामान को घटाती है।

import re,random
a='rrbbnnkq'
while re.search('b.(..)*b|r[^k]*r',a):a=''.join(random.sample(a,8))
print a

रेक्स की कमी के लिए पीटर टेलर को धन्यवाद।


not s('b(..)*b',a)कहने का एक लंबा-चौड़ा तरीका लगता है s('b.(..)*b',a)। इसके अलावा, sampleएक वर्ण से छोटा हो सकता है shuffle, लेकिन इसके लिए एक अतिरिक्त तर्क की आवश्यकता होती है।
पीटर टेलर

आप रेगेक्स, पीटर के बारे में सही हैं। धन्यवाद! हालांकि Shuffleरिटर्न None, तो यह अच्छा नहीं है :(
daniero

1
पेड़ों के लिए जंगल याद किया। आपको दो रीगेक्स की आवश्यकता नहीं है, क्योंकि आप एक ही स्ट्रिंग की जाँच कर रहे हैं और orरेगेक्स अल्टरनेशन ( |) के बराबर है । 13 चरस बचती है।
पीटर टेलर

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