एन क्वींस पहेली


17

(60+ प्रश्नों के बावजूद टैग करने पर , हमारे पास एक सरल n-queens चुनौती नहीं है।)

शतरंज में, एन-क्वींस पहेली को निम्नानुसार वर्णित किया गया है: एक n x nशतरंज की बिसात और nरानियों को देखते हुए, बिसात को बिसात पर व्यवस्थित करें ताकि कोई भी दो रानियां एक-दूसरे को धमकी न दें। नीचे n = 8विकिपीडिया से उधार लिया गया एक उदाहरण समाधान है ।

8-क्वीन्स उदाहरण विकिपीडिया से हल

या, ASCII प्रतिपादन में:

xxxQxxxx
xxxxxxQx
xxQxxxxx
xxxxxxxQ
xQxxxxxx
xxxxQxxx
Qxxxxxxx
xxxxxQxx

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

इनपुट

एक एकल सकारात्मक पूर्णांक nके साथ n >= 4 किसी भी सुविधाजनक प्रारूप में । (n = 2 और n = 3 का कोई हल नहीं है, और n = 1 तुच्छ है, इसलिए उन्हें बाहर रखा गया है)

उत्पादन

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

नियम

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

उदाहरण

n=4
xQxx
xxxQ
Qxxx
xxQx

n=7
xxQxxxx
xxxxxxQ
xQxxxxx
xxxQxxx
xxxxxQx
Qxxxxxx
xxxxQxx

n=10
xxxxQxxxxx
xxxxxxxxxQ
xxxQxxxxxx
xxxxxxxxQx
xxQxxxxxxx
xxxxxxxQxx
xQxxxxxxxx
xxxxxxQxxx
Qxxxxxxxxx
xxxxxQxxxx


1
क्या आप विषम इनपुट के लिए टेस्टकेस दे सकते हैं?
क्रिटिक्स लिथोस

@Cowsquack ने n = 7 उदाहरण
AdmBorkBork

1
@KeyuGan MATL उत्तर जैसा कुछ है? हाँ वह ठीक है।
AdmBorkBork

2
@JonathanAllan इस तरह के किसी भी बहिष्करण का इरादा नहीं था, इसलिए जब तक कि कार्यक्रम परिमित समय एक (सभी सबमिशन के लिए मानक के रूप में) के साथ समाप्त हो जाता है।
AdmBorkBork

जवाबों:


5

MATL , 33 32 27 बाइट्स

`x,GZ@]1Z?tt!P!,w&TXds]h1>a

इसे ऑनलाइन आज़माएं!

अर्ध-क्रूर बल, गैर-नियतात्मक दृष्टिकोण:

  1. पंक्ति स्थितियों का एक यादृच्छिक क्रमांकन बनाएं
  2. स्तंभ स्थिति का एक यादृच्छिक क्रमांकन उत्पन्न करें
  3. जाँच करें कि कोई रानी एक विकर्ण या विरोधी-विकर्ण साझा नहीं करती है
  4. यदि आवश्यक हो तो दोहराएँ।

प्राप्त समाधान यादृच्छिक है। यदि आप फिर से कोड चलाते हैं तो आपको एक अलग वैध कॉन्फ़िगरेशन मिल सकता है। रनिंग टाइम भी रैंडम है, लेकिन सबसे लंबा टेस्ट केस ( n = 10) टीआईओ में लगभग 30 सेकंड में खत्म होता है।


मुझे यकीन नहीं है कि यह एक समाधान के रूप में गिना जाता है, यह देखते हुए कि यह हमेशा सही उत्तर नहीं देता है।
junkmail

1
@ जंकमेल हुह? वहाँ जैसी कोई चीज नहीं है सही जवाब, के रूप में वहाँ एक कई समाधान (जैसा कि चुनौती द्वारा कहा गया)। कोड हमेशा एक सही उत्तर देता है , बस हर बार एक जैसा नहीं
लुईस मेन्डो

यह सैद्धांतिक रूप से कार्यक्रम को कई बार मनमाने ढंग से चलाने के लिए संभव है और फिर भी जवाब देने में विफल रहता है।
junkmail

1
@junkmail लेकिन यह एक संभावना के साथ परिमित समय में खत्म होता है
लुइस मेंडो

1
@JamesHollis मैं असहमत हूँ। यह कुछ क्रमपरिवर्तन को दूसरों की तुलना में अधिक संभव बना सकता है, लेकिन यह किसी भी क्रमचय को प्रदर्शित होने से नहीं रोक सकता है। तो समाधान अंततः पहुंच जाएगा। और इसके अलावा, यादृच्छिक जनरेटर को आदर्श मानते हुए आम तौर पर स्वीकार किया जाता है
लुइस मेंडो

5

सी, 114 बाइट्स

Q(n,o,y){o=n%2;n-=o;for(y=0;y<n+o;++y)printf("%*c\n",y<n?o+n-(n+y%(n/2)*2+(n%6?y<n/2?n/2-1:2-n/2:y<n/2))%n:0,81);}

सीधे ओ (1) समय में एक समाधान प्रिंट करता है।


1
यह मेरे लिए स्पष्ट नहीं है कि यह एक बार दोहराए जाने वाले लूप के साथ ओ (1) कैसे हो सकता है। उन सभी गणनाओं को हमेशा स्थिर समय में कैसे किया जा सकता है?
पोइ .३०

1
@ poi830 का मतलब है रानी की स्थिति निर्धारित करने के लिए प्रति पंक्ति ओ (1) गणना समय।
orlp

आप के लिए एक नया चर बनाकर कुछ नहीं बचा सकता है n/2?
जेफगमा

n-=o=n%2;for(y=n+o;y--;)इसके बजाय सुझावo=n%2;n-=o;for(y=0;y<n+o;++y)
छत

2

गणितज्ञ, १०३ 108 110 117 बाइट्स

-5 बाइट्स के लिए DuplicateFreeQ->E!=##&@@@

-7 बाइट्स के लिए ReplacePart[Array[],]->SparseArray[]

SparseArray[Thread@#&@@Select[Permutations@Range@#~Tuples~2,And@@(E!=##&@@@{#-#2,+##})&@@#&]->1,{#,#}]&

2 डी-सरणी लौटाएं। गणना करने के लिए 2.76 f[6]और इसके लिए 135s लगते हैं f[7]। (वर्तमान संस्करण में, -हो जाता है 0और Qकरने के लिए1

उत्पादन

एल्गोरिथ्म MATL उत्तर के समान है, लेकिन यहां कोड पूरी तरह से जानवर-बल है।


1

सी - 222 बाइट्स

v,i,j,k,l,s,a[99];main(){for(scanf("%d",&s);*a-s;v=a[j*=v]-a[i],k=i<s,j+=(v=j<s&&(!k&&!!printf(2+"\n\n%c"-(!l<<!j)," #Q"[l^v?(l^j)&1:2])&&++l||a[i]<s&&v&&v-i+j&&v+i-j))&&!(l%=s),v||(i==j?a[i+=k]=0:++a[i])>=s*k&&++a[--i]);}

कोड मेरा नहीं है, बल्कि IOCCC का है । मुझे उम्मीद है कि मैं कोई नियम नहीं तोड़ रहा हूं। इसके अलावा, यह 4 और 99 के बीच एन के लिए सभी समाधान प्रदर्शित करता है। मैं बाद में TIO लिंक प्राप्त करने का प्रयास करूंगा।


जैसा कि यह कोड आपका नहीं है, क्या आप इसे सामुदायिक विकी में बदल सकते हैं? (सिर्फ संपादन विंडो के नीचे बटन पर क्लिक करें जो "कम्युनिटी विकी" कहता है)
caird coinheringaahing

हाय QuaerendoInvenietis और PPCG में आपका स्वागत है। जैसा कि यह वर्तमान में लिखा गया है, यह एक विशेष संख्या को इनपुट और आउटपुट के रूप में केवल उस समाधान के लिए नहीं लगता है।
AdmBorkBork

1

जेली , 24 21 बाइट्स

,JŒc€IF€An/PC
ẊÇ¿=þRG

इसे ऑनलाइन आज़माएं!

यह मानते हुए कि प्रत्येक रानी को अलग-अलग पंक्तियों में रखा गया है, हमें केवल संघर्षों से बचने के लिए प्रत्येक रानी को रखने के लिए स्तंभ सूचक खोजने की आवश्यकता है, जो कि एक यादृच्छिक क्रमांकन उत्पन्न करके पाया जा सकता है [1, 2, ..., n] और इसका परीक्षण है।

व्याख्या

,JŒc€IF€An/PC  Helper. Input: permutation of [1, 2, ..., n]
 J             Enumerate indices, obtains [1, 2, ..., n]
,              Join
  Œc€          Find all pairs in each
     I         Calculate the difference of each pair
      F€       Flatten each
        A      Absolute value
               (We now have the distance in column between each queen and
                the distance in rows between each queen. If they are unequal,
                the queens do not conflict with each other)
         n/    Reduce using not-equals
           P   Product, returns 1 only if they are all unequal
            C  Complement
               Returns 1 when there is a conflict, else 0

ẊÇ¿=þRG  Main.  Input: n
Ẋ        Shuffle (When given an integer, it will shuffle [1, 2, ..., n])
 Ç¿      While the helper returns 1, continue shuffling
     R   Range, gets [1, 2, ..., n]
   =þ    Equality table (Generates the board as a matrix)
      G  Pretty-print the matrix

क्या आप -1 के Œc€बदले उपयोग नहीं कर सकते œc€2?
आउटगॉल्फ जूल

1

पायथन 3, 204 189 बाइट्स

import itertools as p
n=int(input())
r=range(n)
b='.'*(n-1)+'Q'
for c in p.permutations(r):
 if len(set((x*z+c[x],z)for x in r for z in[1,-1]))==n+n:[print(*(b[x:]+b[:x]))for x in c];break

सभी क्रमपरिवर्तन के माध्यम से जानवर बल खोज। मैं * को हटा सकता हूं और सूची की समझ को प्रिंट कर सकता हूं, लेकिन वे भयानक दिखते हैं।

आउटपुट:

10
Q . . . . . . . . .
. . Q . . . . . . .
. . . . . Q . . . .
. . . . . . . Q . .
. . . . . . . . . Q
. . . . Q . . . . .
. . . . . . . . Q .
. Q . . . . . . . .
. . . Q . . . . . .
. . . . . . Q . . .

थोड़ा अपराजित:

import itertools as p
n=int(input())
r=range(n)
b='.'*(n-1)+'Q'
for c in p.permutations(r):
    if len(set( (x*z+c[x],z) for x in r for z in[1,-1] )) == n+n:
        [print(*(b[x:] + b[:x])) for x in c]
        break

1

Befunge, 122 बाइट्स

&::2%-v>2*00g++00g%00g\-\00g\`*4>8#4*#<,#-:#1_$55+"Q",,:#v_@
/2p00:<^%g01\+*+1*!!%6g00-2g01\**!!%6g00-g012!:`\g01:::-1<p01

इसे ऑनलाइन आज़माएं!

यह orlp द्वारा C समाधान पर आधारित कमोबेश है

व्याख्या

निष्पादन कोड वाले स्रोत कोड हाइलाइट किए गए

*स्टड से क्वीन, क्यू की संख्या पढ़ें n = q - q%2, और बाद के उपयोग के लिए दो चर की गणना करें: और hn = n/2
*मुख्य लूप शुरू करें, पुनरावृत्ति आर , पंक्ति संख्या, क्यू से नीचे 0 से, लूप की शुरुआत में कमी, इसलिए पहला आर। is q minus 1.
*निम्नलिखित सूत्र के साथ प्रत्येक पंक्ति में रानी की ऑफसेट गणना करें:

offset = (n - (
  (hn <= r) * (2 - hn) * !!(n % 6) + 
  (hn > r) * ((hn - 2) * !!(n % 6) + 1) + 
  (y % hn * 2) + n
) % n) * (n > r)

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



0

रेटिना , 136 बाइट्स

.+
$* 
 
$_;$`Q¶
( +)\1( ?);
:$1;
:( +);\1\1
$1$1
:((   )+);( *)
 $1$1% $3$3
: ( +);( \1)?( *)
 $1 $1%$#2$* $#2$* $#2$* $1$3$3
( +)%\1?

इसे ऑनलाइन आज़माएं! पोर्ट ऑफ @ ऑरलपी के उत्कृष्ट सी उत्तर। स्पष्टीकरण:

.+
$* 

रिक्त स्थान का उपयोग कर (सभी के बाद एक स्थान है *) का उपयोग करते हुए, यूनरी में परिवर्तित करें ।

$_;$`Q¶

रिक्त स्थान के Nसाथ पंक्तियाँ बनाएँ N, ए ;, फिर 0..N-1रिक्त स्थान, फिर ए Q। शेष चरण सभी पंक्तियों पर लागू होते हैं।

( +)\1( ?);
:$1;

इंटीजर N2 से विभाजित होता है ( :;एंकर पैटर्न को आसान बनाने के लिए परिणाम को भी लपेटें ।)

:( +);\1\1
$1$1

यदि लूप इंडेक्स बराबर होता है N/2*2, तो बस उस कई रिक्त स्थान को छोड़ दें।

:((   )+);( *)
 $1$1% $3$3

यदि N/23 का गुणक है, तो लूप इंडेक्स प्लस वन, मोडुलो को दोगुना करें N/2*2+1

: ( +);( \1)?( *)
 $1 $1%$#2$* $#2$* $#2$* $1$3$3

अन्यथा, लूप इंडेक्स प्लस (N/2-1)से दोगुना ले लें और बोर्ड के निचले आधे हिस्से में एक अतिरिक्त 3, मोडुलो N/2*2

( +)%\1?

वास्तव में मोडुलो ऑपरेशन करें।



0

एपीएल (Dyalog यूनिकोड) , 18 बाइट्स SBCS

पूर्ण कार्यक्रम nस्टड से संकेत मिलता है । ·खाली वर्गों और क्वींस के लिए उपयोग करके स्टडआउट के लिए अंतरिक्ष-पृथक समाधान प्रिंट करता है ।

CY'dfns'
queens

इसे ऑनलाइन आज़माएं!

⎕CY'dfns'C op y "dfns" लाइब्रेरी

 स्टड से इनपुट मिलता है

queens सभी सही मायने में अद्वितीय क्वींस समाधान (कोई प्रतिबिंब या रोटेशन) खोजें

 पहला उपाय उठाओ


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