ปริศนา N-Queens


17

(แม้จะมี 60 คำถามที่ติดแท็ก , เราไม่ได้มีง่ายๆ n-Queens ท้าทาย.)

ในหมากรุกตัวต่อปริศนา N-Queensอธิบายดังต่อไปนี้: ให้n x nกระดานหมากรุกและnควีนส์จัดเรียงราชินีเข้าสู่กระดานหมากรุกเพื่อไม่ให้ราชินีทั้งสองกำลังคุกคามกัน ด้านล่างนี้เป็นตัวอย่างโซลูชันสำหรับn = 8ยืมมาจาก Wikipedia

โซลูชันตัวอย่าง 8 ควีนจาก Wikipedia

หรือในการแสดงผล ASCII:

xxxQxxxx
xxxxxxQx
xxQxxxxx
xxxxxxxQ
xQxxxxxx
xxxxQxxx
Qxxxxxxx
xxxxxQxx

ความท้าทายในที่นี้คือการนำอินพุตnและเอาต์พุตการแสดง ASCII ของโซลูชันไปยังnปริศนา -Queens เนื่องจากมีวิธีแก้ปัญหาที่เป็นไปได้มากกว่าหนึ่งรายการ (เช่นอย่างน้อยที่สุดการหมุนหรือการสะท้อนกลับ) รหัสของคุณจึงจำเป็นต้องแสดงทางออกที่ถูกต้องเท่านั้น

อินพุต

เป็นจำนวนเต็มบวกเดียวnกับในรูปแบบที่สะดวกใดn >= 4 (n = 2 และ n = 3 ไม่มีวิธีแก้ปัญหาและ n = 1 เป็นเรื่องเล็กน้อยดังนั้นสิ่งเหล่านี้จึงถูกยกเว้น)

เอาท์พุต

การแทนค่า ASCII ที่เป็นผลลัพธ์ของโซลูชันไปยังตัวไขปริศนา N-queens ดังที่อธิบายไว้ข้างต้น คุณสามารถเลือกค่า ASCII ที่แตกต่างกันสองค่าเพื่อแสดงถึงช่องว่างและควีน อีกครั้งนี้สามารถส่งออกในรูปแบบที่เหมาะสมใด ๆ (สตริงเดียวรายการของสตริงอาร์เรย์ตัวละคร ฯลฯ )

กฎระเบียบ

  • ขึ้นบรรทัดใหม่หรือต่อท้ายช่องว่างหรือเว้นวรรคเป็นทางเลือกทั้งหมดรวมทั้งช่องว่างระหว่างตัวอักษรตราบใดที่ตัวอักษรอยู่ในแถวอย่างถูกต้อง
  • คุณสามารถใช้อัลกอริทึมในการคำนวณตำแหน่งที่เป็นไปได้หรือใช้รูปแบบการแก้ปัญหา "บันไดขั้นตอน" อย่างชัดเจนไม่ว่าจะเป็นรูปแบบใดสำหรับนักกอล์ฟของคุณ
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น หากฟังก์ชั่นคุณสามารถส่งคืนผลลัพธ์มากกว่าการพิมพ์
  • หากเป็นไปได้โปรดรวมลิงค์ไปยังสภาพแวดล้อมการทดสอบออนไลน์เพื่อให้ผู้อื่นสามารถลองใช้รหัสของคุณได้!
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการเล่นกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

ตัวอย่าง

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
คุณสามารถให้ชุดทดสอบสำหรับอินพุตแปลก ๆ ได้หรือไม่?
Kritixi Lithos

@Cowsquack เพิ่ม n = 7 ตัวอย่าง
AdmBorkBork

1
@KeyuGan บางอย่างเช่นคำตอบของ MATL? ใช่มันไม่เป็นไร
AdmBorkBork

2
@JanathanAllan ไม่มีข้อยกเว้นดังกล่าวเกิดขึ้นตราบใดที่โปรแกรมเสร็จสิ้นในเวลาที่ จำกัด พร้อมความน่าจะเป็นหนึ่ง (เป็นมาตรฐานสำหรับการส่งทั้งหมด)
AdmBorkBork

คำตอบ:


5

MATL , 33 32 27 ไบต์

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

ลองออนไลน์!

แรงกึ่งดุร้ายวิธีที่ไม่สามารถยับยั้งได้:

  1. สร้างการเรียงสับเปลี่ยนตำแหน่งแถวแบบสุ่ม
  2. สร้างการเรียงสับเปลี่ยนตำแหน่งคอลัมน์แบบสุ่ม
  3. ตรวจสอบว่าไม่มีควีนส์แบ่งปันเส้นทแยงมุมหรือเส้นทแยงมุม
  4. ทำซ้ำหากจำเป็น

วิธีการแก้ปัญหาที่ได้รับเป็นแบบสุ่ม หากคุณเรียกใช้รหัสอีกครั้งคุณอาจได้รับการกำหนดค่าที่ถูกต้องอื่น เวลาในการวิ่งก็สุ่ม แต่กรณีทดสอบที่ยาวที่สุด ( n = 10) เสร็จสิ้นในเวลาประมาณ 30 วินาทีใน TIO เกือบตลอดเวลา


ฉันไม่แน่ใจว่านี่เป็นวิธีแก้ปัญหาเนื่องจากมันไม่ได้ให้คำตอบที่ถูกต้องเสมอไป
junkmail

1
@junkmail Huh? ไม่มีสิ่งดังกล่าวเป็นตอบที่ถูกต้องตามที่มีหลายโซลูชั่น (ตามที่ระบุไว้โดยความท้าทาย) รหัสเสมอให้ตอบที่ถูกต้องเพียงไม่เหมือนกันทุกครั้ง
หลุยส์ Mendo

เป็นไปได้ในทางทฤษฎีสำหรับโปรแกรมที่รันหลาย ๆ ครั้งและยังคงล้มเหลวในการให้คำตอบ
junkmail

1
@junkmail แต่มันก็เสร็จในเวลาที่ จำกัด โดยมีความเป็นไปได้ที่หนึ่ง
Luis Mendo

1
@ JamesHollis ฉันไม่เห็นด้วย นั่นอาจทำให้การเรียงสับเปลี่ยนมีโอกาสมากกว่าคนอื่น ๆ แต่มันจะไม่ป้องกันการเรียงสับเปลี่ยนไม่ให้ปรากฏ ดังนั้นในที่สุดก็จะไปถึงทางออก และนอกจากนี้สมมติว่าเครื่องกำเนิดไฟฟ้าแบบสุ่มนั้นเป็นที่ยอมรับโดยทั่วไป
Luis Mendo

5

C, 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);}

พิมพ์วิธีการแก้ปัญหาโดยตรงในเวลา O (1)


1
ยังไม่ชัดเจนสำหรับฉันว่ามันจะเป็น O (1) ด้วยการวนซ้ำซ้ำ n ครั้งได้อย่างไร การคำนวณทั้งหมดนั้นสามารถทำได้ในเวลาที่แน่นอนได้อย่างไร
poi830

1
@ poi830 ฉันหมายถึงเวลาการคำนวณ O (1) ต่อแถวเพื่อกำหนดตำแหน่งของราชินี
orlp

คุณไม่สามารถบันทึกได้เพียงเล็กน้อยด้วยการสร้างตัวแปรใหม่n/2ใช่หรือไม่
Jeffmagma

แนะนำn-=o=n%2;for(y=n+o;y--;)แทนo=n%2;n-=o;for(y=0;y<n+o;++y)
ceilingcat

2

Mathematica, 103 108 110 117 ไบต์

-5 ไบต์สำหรับDuplicateFreeQ->E!=##&@@@

-7 ไบต์สำหรับReplacePart[Array[],]->SparseArray[]

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

ส่งคืนอาร์เรย์ 2 มิติ มันต้องใช้เวลาในการคำนวณ 2.76s f[6]และ 135S f[7]สำหรับ (ในรุ่นปัจจุบัน-จะกลายเป็น0และจะQ1

เอาท์พุต

อัลกอริทึมนั้นคล้ายกับคำตอบ MATL แต่นี่คือรหัสที่สมบูรณ์แบบ


1

C - 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 ฉันหวังว่าฉันจะไม่ละเมิดกฎใด ๆ นอกจากนี้ยังแสดงโซลูชันทั้งหมดสำหรับ N ระหว่าง 4 ถึง 99 ฉันจะลองรับลิงก์ TIO ในภายหลัง


เนื่องจากรหัสนี้ไม่ใช่ของคุณคุณสามารถแปลงเป็น Community Wiki ได้หรือไม่ (เพียงคลิกปุ่มด้านล่างหน้าต่างการแก้ไขที่ระบุว่า "Community Wiki")
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

คุณไม่สามารถใช้Œc€แทนœc€2-1 ได้หรือไม่
Erik the Outgolfer

1

Python 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 . . .

ungolfed เล็กน้อย:

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

ลองออนไลน์!

นี้จะมากหรือน้อยขึ้นอยู่กับวิธีการแก้ปัญหา Cโดยorlp

คำอธิบาย

รหัสที่มาพร้อมกับเส้นทางการดำเนินการถูกเน้นไว้

* * * *อ่านจำนวนควีนส์คิวจาก stdin และคำนวณสองตัวแปรเพื่อใช้ในภายหลัง: n = q - q%2และhn = n/2
* * * *เริ่มห่วงหลัก iterating Rจำนวนแถวจากคิวลงไปที่ 0, decrementing ที่จุดเริ่มต้นของวงเพื่อแรกRคือqลบ 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?

ลองออนไลน์! คำตอบที่ยอดเยี่ยมของ C @ Port of @ orlp คำอธิบาย:

.+
$* 

แปลงเป็น unary โดยใช้ช่องว่าง (มีช่องว่างหลังจากนั้น*)

$_;$`Q¶

สร้างNแถวที่มีNช่องว่างที่;แล้วช่องว่างแล้ว0..N-1 Qขั้นตอนที่เหลือนำไปใช้กับแถวทั้งหมด

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

จำนวนเต็มหารNด้วย 2 (รวมทั้งสรุปผลลัพธ์:;เพื่อให้ง่ายต่อการยึดรูปแบบ)

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

หากดัชนีลูปเท่ากับN/2*2แล้วปล่อยให้ช่องว่างมากมาย

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

หากN/2มีหลาย 3 แล้วใช้คู่ดัชนีห่วงบวกหนึ่ง, N/2*2+1โมดูโล

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

มิฉะนั้นให้เพิ่มดัชนีลูปเป็นสองเท่า (N/2-1)บวกพิเศษ 3 ในครึ่งล่างของคณะกรรมการ, N/2*2โมดูโล

( +)%\1?

ทำการดำเนินการ modulo จริง ๆ


0

ถ่านขนาด 44 ไบต์

Nθ≔÷θ²ηEθ◧Q⊕⎇⁼ι⊗ηι⎇﹪η³﹪⁺⁺⊗ι⊖η׳¬‹ιη⊗η﹪⊕⊗ι⊕⊗η

ลองออนไลน์! การเชื่อมโยงคือการใช้รหัสเวอร์ชันอย่างละเอียด อีกพอร์ตของคำตอบ C ที่ยอดเยี่ยมของ @ orlp


0

APL (Dyalog Unicode)ขนาด 18 ไบต์ SBCS

โปรแกรมเต็มรูปแบบให้nจาก stdin พิมพ์โซลูชันที่คั่นด้วยช่องว่างเพื่อ stdout โดยใช้·สำหรับช่องว่างที่ว่างและสำหรับควีนส์

CY'dfns'
queens

ลองออนไลน์!

⎕CY'dfns'C op y "การ dfns" ห้องสมุด

 รับข้อมูลจาก stdin

queens ค้นหาโซลูชันที่เป็นเอกลักษณ์ของ Queens อย่างแท้จริง (ไม่มีการสะท้อนแสงหรือการหมุน)

 เลือกวิธีแรก


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.