กราฟของอัศวินบนกระดาน N-by-N


20

ในหมากรุกอัศวินสามารถเลื่อนไปยังตำแหน่งที่มีเครื่องหมาย X เทียบกับตำแหน่งปัจจุบันเท่านั้นที่มีเครื่องหมาย♞:

ที่ซึ่งอัศวินสามารถเคลื่อนที่ได้


อัศวินกราฟเป็นกราฟที่แสดงถึงการเคลื่อนไหวทางกฎหมายทั้งหมดของชิ้นอัศวินหมากรุกบนกระดานหมากรุกที่ แต่ละจุดยอดของกราฟนี้แสดงถึงตารางหมากรุกและแต่ละขอบเชื่อมต่อสองสแควร์สที่มีการเคลื่อนไหวของอัศวินแยกจากกัน

กราฟมีลักษณะเช่นนี้สำหรับบอร์ด 8-by-8 มาตรฐาน

ป้อนคำอธิบายรูปภาพที่นี่


ท้าทาย:

กำหนดจำนวนเต็มNโดยที่3 ≤ N ≤ 8ส่งออกเมทริกซ์N-by-N ที่เป็นตัวแทนของบอร์ดซึ่งแสดงจำนวนการเคลื่อนที่ที่เป็นไปได้จากแต่ละตำแหน่ง สำหรับN = 8ผลลัพธ์จะเป็นเมทริกซ์ที่แสดงค่าของแต่ละจุดยอดในกราฟด้านบน

รูปแบบผลลัพธ์มีความยืดหยุ่น รายชื่อของรายการหรือแม้แต่รายการแบบย่อเป็นต้นเป็นรูปแบบที่ยอมรับได้


ชุดทดสอบครบชุด:

--- N = 3 ---
2 2 2
2 0 2
2 2 2
--- N = 4 ---
2 3 3 2
3 4 4 3
3 4 4 3
2 3 3 2
--- N = 5 ---
2 3 4 3 2
3 4 6 4 3
4 6 8 6 4
3 4 6 4 3
2 3 4 3 2
--- N = 6 ---
2 3 4 4 3 2
3 4 6 6 4 3
4 6 8 8 6 4
4 6 8 8 6 4
3 4 6 6 4 3
2 3 4 4 3 2
--- N = 7 ---
2 3 4 4 4 3 2
3 4 6 6 6 4 3
4 6 8 8 8 6 4
4 6 8 8 8 6 4
4 6 8 8 8 6 4
3 4 6 6 6 4 3
2 3 4 4 4 3 2
--- N = 8 ---
2 3 4 4 4 4 3 2
3 4 6 6 6 6 4 3
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
3 4 6 6 6 6 4 3
2 3 4 4 4 4 3 2

นี่คือเพื่อให้ทางออกที่สั้นที่สุดในแต่ละภาษาชนะ คำอธิบายได้รับการสนับสนุน!


1
ความท้าทายที่เกี่ยวข้องในการค้นหาจำนวนอัศวินย้ายจากตารางบนกระดาน 8 * 8
xnor

เอาต์พุตสามารถเป็นรายการแบบแบนขององค์ประกอบ n * n ได้หรือไม่?
xnor

13
นี่เป็นเพียงกรณีขอบ! :)
Jonathan Allan

คำตอบ:


13

MATL , 17 16 ไบต์

t&l[2K0]B2:&ZvZ+

ลองออนไลน์!

(-1 ไบต์ขอบคุณ @Luis Mendo)

ส่วนหลักของรหัสคือการสร้างเมทริกซ์สำหรับการแปลง:K

K=(0101010001000001000101010)

(สัมพันธ์กับจุดศูนย์กลางของเมทริกซ์แต่ละตัวคือการเคลื่อนที่ของอัศวินที่ถูกต้อง)

t&l- สร้างเมทริกซ์ nxn ของ 1s ทั้งหมด (โดยที่ n คืออินพุต) ให้นี่เป็น M.

[2K0] - กดอาร์เรย์ที่มี [2, 4, 0] บนสแต็ก

B - แปลงทั้งหมดเป็นไบนารี่แพ็ดดิ้งด้วย 0s ตามต้องการ

0 1 0
1 0 0
0 0 0

2:&Zv- ทำมิเรอร์นั้นบนทั้งสองมิติโดยไม่ต้องทำซ้ำแถว / คอลัมน์สุดท้าย ("การจัดทำดัชนีช่วงสมมาตร") นี่ให้เมทริกซ์เคที่เราต้องการ

0 1 0 1 0
1 0 0 0 1
0 0 0 0 0
1 0 0 0 1
0 1 0 1 0

Z+- ดำเนินการโน้มน้าวใจ 2D ของ K เหนือเมทริกซ์ M ( conv2(M, K, 'same')) ก่อนหน้า, รวม 1s ที่เป้าหมายการย้ายอัศวินตามกฎหมายสำหรับแต่ละตำแหน่ง

เมทริกซ์ผลลัพธ์แสดงโดยปริยาย


คุณสามารถเข้ารหัสเมทริกซ์คอนโวลูชั่นได้11043370BP5eแต่ก็ไม่สั้นกว่านี้ ...
Giuseppe


8

JavaScript (ES6), 88 ไบต์

ส่งคืนสตริง

n=>(g=k=>--k?[n>3?'-2344-6-6'[(h=k=>k*2<n?~k:k-n)(k%n)*h(k/n|0)]||8:k-4&&2]+g(k):2)(n*n)

ลองออนไลน์!

อย่างไร?

n=3

20

(222202222)

3<n8

(x,Y)0x<n0Y<nผมx,Y

ผมx,Y=นาที(x+1,n-x)×นาที(Y+1,n-Y)

n=8

(1234432124688642369121296348121616128448121616128436912129632468864212344321)

T

T=[0,2,3,4,4,0,6,0,6]

0

(x,Y)

{T(ผมx,Y)ถ้า ผมx,Y88มิฉะนั้น

JavaScript (ES7), 107 ไบต์

การใช้งานที่ไร้เดียงสาซึ่งพยายามเคลื่อนไหวทุกอย่าง

n=>[...10**n-1+''].map((_,y,a)=>a.map((k,x)=>~[...b=i='01344310'].map(v=>k-=!a[x-v+2]|!a[y-b[i++&7]+2])+k))

ลองออนไลน์!


6

เยลลี่ ,  23 22 14  10 ไบต์

²ḶdðạP€ċ2)

ลิงค์ monadic ที่ให้รายชื่อแบบแบน - ใช้ความคิดแรกที่ KSab ใช้ในการตอบ Python - การเคลื่อนไหวของอัศวินมี "ไซด์" 1 และ 2 ซึ่งเป็นเพียงปัจจัย 2 เท่านั้น

ลองออนไลน์! (ส่วนท้ายเรียกใช้ลิงก์เท่านั้นของโปรแกรมจากนั้นจัดรูปแบบผลลัพธ์เป็นกริด)

²Ḷdðạ²§ċ5)5

อย่างไร?

²ḶdðạP€ċ2) - Link: integer, n (any non-negative) e.g. 8
²          - square n                                 64
 Ḷ         - lowered range                            [0,    1,    2,    3,    4,    5,    6,    7,    8,    9,    10,   11,   12,   13,   14,   15,   16,   17,   18,   19,   20,   21,   22,   23,   24,   25,   26,   27,   28,   29,   30,   31,   32,   33,   34,   35,   36,   37,   38,   39,   40,   41,   42,   43,   44,   45,   46,   47,   48,   49,   50,   51,   52,   53,   54,   55,   56,   57,   58,   59,   60,   61,   62,   63]
  d        - divmod (vectorises) i.e. x->[x//n,x%n]   [[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[1,0],[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7],[2,0],[2,1],[2,2],[2,3],[2,4],[2,5],[2,6],[2,7],[3,0],[3,1],[3,2],[3,3],[3,4],[3,5],[3,6],[3,7],[4,0],[4,1],[4,2],[4,3],[4,4],[4,5],[4,6],[4,7],[5,0],[5,1],[5,2],[5,3],[5,4],[5,5],[5,6],[5,7],[6,0],[6,1],[6,2],[6,3],[6,4],[6,5],[6,6],[6,7],[7,0],[7,1],[7,2],[7,3],[7,4],[7,5],[7,6],[7,7]]
   ð     ) - new dyadic chain for each - call that L ( & e.g. R = [1,2] representing the "2nd row, 3rd column" ...-^ )
    ạ      -   absolute difference (vectorises)       [[1,2],[1,1],[1,0],[1,1],[1,2],[1,3],[1,4],[1,5],[0,2],[0,1],[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[1,2],[1,1],[1,0],[1,1],[1,2],[1,3],[1,4],[1,5],[2,2],[2,1],[2,0],[2,1],[2,2],[2,3],[2,4],[2,5],[3,2],[3,1],[3,0],[3,1],[3,2],[3,3],[3,4],[3,5],[4,2],[4,1],[4,0],[4,1],[4,2],[4,3],[4,4],[4,5],[5,2],[5,1],[5,0],[5,1],[5,2],[5,3],[5,4],[5,5],[6,2],[6,1],[6,0],[6,1],[6,2],[6,3],[6,4],[6,5]]
     P€    -   product of €ach                        [2,    1,    0,    1,    2,    3,    4,    5,    0,    0,    0,    0,    0,    0,    0,    0,    2,    1,    0,    1,    2,    3,    4,    5,    4,    2,    0,    2,    4,    6,    8,    10,   6,    3,    0,    3,    6,    9,    12,   15,   8,    4,    0,    4,    8,    12,   16,   20,   10,   5,    0,    5,    10,   15,   20,   25,   12,   6,    0,    6,    12,   18,   24,   30]
       ċ2  -   count 2s                          6:    ^-...1                  ^-...2                                                                  ^-...3                  ^-...4                        ^-...5      ^-...6
           - )                                                                                                     v-...that goes here
           -   ->                                  -> [2,    3,    4,    4,    4,    4,    3,    2,    3,    4,    6,    6,    6,    6,    4,    3,    4,    6,    8,    8,    8,    8,    6,    4,    4,    6,    8,    8,    8,    8,    6,    4,    4,    6,    8,    8,    8,    8,    6,    4,    4,    6,    8,    8,    8,    8,    6,    4,    3,    4,    6,    6,    6,    6,    4,    3,    2,    3,    4,    4,    4,    4,    3,    2]

22 ไบต์ก่อนหน้า

2RżN$Œp;U$+,ḟ€³R¤Ẉ¬Sðþ

โปรแกรมเต็มรูปแบบ (เนื่องจาก³)

ลองออนไลน์! (ส่วนท้ายเรียกใช้ลิงก์เท่านั้นของโปรแกรมจากนั้นจัดรูปแบบผลลัพธ์เป็นกริด)

ค้นหาการเคลื่อนไหวทั้งหมดและนับจำนวนสิ่งที่ลงจอดบนกระดานอย่างแน่นอนซึ่งอาจ เอาชนะได้โดยการคำนวณ (อาจเอาชนะได้โดยเปลี่ยนตรรกะ "ฝั่งบนกระดาน")


4

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

+/+/2=×/¨|∘.-⍨⍳2⍴⎕

ลองออนไลน์!

อินพุตที่ถูกประเมิน N

2⍴⎕ สำเนาสองชุดของ N

⍳2⍴⎕ ดัชนีของเมทริกซ์ N × N - เมทริกซ์ของความยาว -2 เวกเตอร์

∘.-⍨ ลบดัชนีแต่ละคู่ออกจากกันเพื่อรับอาร์เรย์ N × N × N × N

| ค่าสัมบูรณ์

×/¨ แต่ละผลิตภัณฑ์

2=2s อยู่ที่ไหน คืนค่าเมทริกบูลีน (0/1)

โปรดทราบว่าอัศวินเคลื่อนไหว± 1 ในหนึ่งแกนและอีก± 2 ที่อีกด้านหนึ่งดังนั้นค่าสัมบูรณ์ของผลิตภัณฑ์ของขั้นตอนเหล่านั้นคือ 2 เนื่องจาก 2 ไม่สามารถแยกตัวประกอบในทางอื่นได้

+/+/ ผลรวมตามมิติสุดท้ายสองครั้ง


3

RAD , 51 46 39 ไบต์

{+/(⍵∘+¨(⊖,⊢)(⊢,-)(⍳2)(1¯2))∊,W}¨¨W←⍳⍵⍵

ลองออนไลน์!

อย่างไร?

นับจำนวนการเคลื่อนไหวของอัศวินที่ถูกต้องสำหรับแต่ละตารางโดยดูว่าการเคลื่อนไหวของอัศวินใดที่จะขึ้นบกบนกระดาน:

{+/(⍵∘+¨(⊖,⊢)(⊢,-)(⍳2)(1¯2))∊,W}¨¨W←⍳⍵⍵
 +/                                     - The number of ...
                            ∊,W         - ... in-bounds ...
        (⊖,⊢)(⊢,-)(⍳2)(1¯2)             - ... knight movements ...
   (⍵∘+¨                   )            - ... from ...
{                              }¨¨W←⍳⍵⍵ - ... each square

3

Brachylog , 65 40 33 ไบต์

สิ่งนี้หยุดลงสำหรับ N ที่ใหญ่กว่าแล้ว 9 ดังนั้นฉันจึงมีความสุข N สามารถไปได้เพียง 8 =)

⟦₅⟨∋≡∋⟩ᶠ;?z{{hQ&t⟦₅↰₁;Qz-ᵐ×ȧ2}ᶜ}ᵐ
  • -25 ไบต์โดยเปลี่ยนเป็นสูตรของ KSab
  • -7 ไบต์โดยการทำให้อาเรย์แบนราบต้องขอบคุณ sundar

ลองออนไลน์!


Brachylog , 44 36 ไบต์

อันนี้ใช้ได้สำหรับจำนวนที่สูงกว่าแล้ว 9

gP&⟦₅⟨∋≡∋⟩ᶠ;z{{hQ&t⟦₅↰₁;Qz-ᵐ×ȧ2}ᶜ}ᵐ
  • -8 ไบต์โดยการทำให้อาเรย์แบนราบต้องขอบคุณ sundar

ลองออนไลน์!


1
คุณสามารถใช้⟨∋≡∋⟩ก่อนหน้านี้เพื่อสร้างพิกัดเมทริกซ์ได้เช่นกันและบันทึกโดยรวม 7 ไบต์ (เอาต์พุตเป็นรายการแบบเรียบซึ่งอนุญาตโดย OP): ลองออนไลน์!
sundar - Reinstate Monica

2

เรติน่า 161 ไบต์

.+
*
L$`_
$=
(?<=(¶)_+¶_+)?(?=(?<=(¶)_*¶_*)__)?(?<=(¶)__+)?(?=(?<=(¶)_*)___)?_(?=(?<=___)_*(¶))?(?=__+(¶))?(?=(?<=__)_*¶_*(¶))?(?=_+¶_+(¶))?
$.($1$2$3$4$5$6$7$8)

ลองออนไลน์! ลิงค์มีกรณีทดสอบ คำอธิบาย:

.+
*

แปลงเป็นเอก

L$`_
$=

แสดงรายการค่าหนึ่งครั้งสำหรับแต่ละ_ค่าเช่นสร้างสี่เหลี่ยม

(?<=(¶)_+¶_+)?
(?=(?<=(¶)_*¶_*)__)?
(?<=(¶)__+)?
(?=(?<=(¶)_*)___)?
_
(?=(?<=___)_*(¶))?
(?=__+(¶))?
(?=(?<=__)_*¶_*(¶))?
(?=_+¶_+(¶))?

เริ่ม_จากตรงกลางของ regex พยายามจับคู่บริบทให้เพียงพอเพื่อพิจารณาว่าการเคลื่อนไหวของอัศวินแปดตัวนั้นเป็นไปได้หรือไม่ แต่ละรูปแบบจะจับอักขระหนึ่งตัวหากการจับคู่สำเร็จ ฉันพยายามใช้กลุ่มที่มีชื่อเพื่อให้จำนวนการจับโดยตรงเท่ากับผลลัพธ์ที่ต้องการ แต่ราคา 15 ไบต์

$.($1$2$3$4$5$6$7$8)

เชื่อมต่อการจับที่ประสบความสำเร็จทั้งหมดและใช้ความยาว


2

ภาษา Wolfram (Mathematica) , 34 ไบต์

อีกหนึ่ง Mathematica ในตัว

VertexDegree@KnightTourGraph[#,#]&

ส่งคืนรายการที่แบน

ลองออนไลน์!


จริง ๆ แล้วฉันได้แสดงความคิดเห็นภายใต้ความท้าทายกับคำตอบนี้ (แม้ว่าจะไม่ถูกต้องไวยากรณ์เนื่องจากฉันไม่รู้ WL) ฉันลบออกไปเล็กน้อยเนื่องจากฉันคิดว่ามีคนอื่นอาจต้องการโพสต์เป็นคำตอบที่แท้จริง
Stewie Griffin


1

C (gcc) , 133 125 ไบต์

วิธีนี้ควรใช้กับบอร์ดทุกขนาด

#define T(x,y)(x<3?x:2)*(y<3?y:2)/2+
a,b;f(i){for(a=i--;a--;)for(b=i+1;b--;)printf("%i ",T(a,b)T(i-a,b)T(a,i-b)T(i-a,i-b)0);}

ลองออนไลน์!


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