Biểu đồ của một hiệp sĩ trên bảng N-by-N


20

Trong cờ vua, một hiệp sĩ chỉ có thể di chuyển đến các vị trí được đánh dấu X so với vị trí hiện tại của nó, được đánh dấu bằng ♞:

nơi một hiệp sĩ có thể di chuyển


Một Graph Knight là một đồ thị đại diện cho tất cả các động thái pháp lý của các quân cờ hiệp sĩ trên một bàn cờ. Mỗi đỉnh của biểu đồ này đại diện cho một hình vuông của bàn cờ và mỗi cạnh kết nối hai hình vuông là một hiệp sĩ di chuyển cách xa nhau.

Biểu đồ trông như thế này cho một bảng 8 x 8 tiêu chuẩn.

nhập mô tả hình ảnh ở đây


Thử thách:

Cho một số nguyên N , trong đó 3 N 8 , xuất ra ma trận N-by-N đại diện cho một bảng, trong đó số lượng di chuyển có thể có từ mỗi vị trí được hiển thị. Với N = 8 , đầu ra sẽ là một ma trận hiển thị các giá trị của từng đỉnh trong biểu đồ trên.

Các định dạng đầu ra là linh hoạt. Danh sách danh sách hoặc thậm chí danh sách dẹt, vv là các định dạng được chấp nhận.


Toàn bộ các trường hợp thử nghiệm:

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

Đây là , giải pháp ngắn nhất trong mỗi ngôn ngữ sẽ thắng. Giải thích được khuyến khích!


1
Thử thách liên quan để truy vấn số lượng hiệp sĩ di chuyển từ một hình vuông trên bảng 8 * 8.
xnor

Đầu ra có thể là một danh sách phẳng của các phần tử n * n không?
xnor

13
Đây thực sự chỉ là trường hợp cạnh! :)
Jonathan Allan

Câu trả lời:


13

MATL , 17 16 byte

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

Hãy thử trực tuyến!

(-1 byte nhờ @Luis Mendo.)

Phần chính của mã là tạo ma trận để tích chập:K

K=(0101010001000001000101010)

(Liên quan đến trung tâm của ma trận, mỗi 1 là một nước đi hợp lệ của hiệp sĩ.)

t&l- Hình thành ma trận nxn của tất cả 1s (trong đó n là đầu vào). Hãy để nó là M.

[2K0] - Đẩy một mảng chứa [2, 4, 0] trên ngăn xếp

B - Chuyển đổi tất cả thành nhị phân, đệm với 0s khi cần thiết

0 1 0
1 0 0
0 0 0

2:&Zv- Phản chiếu rằng trên cả hai chiều, mà không lặp lại hàng / cột cuối cùng ("lập chỉ mục phạm vi đối xứng"). Điều này cho chúng ta ma trận yêu cầu K.

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+- Thực hiện tích chập 2D của K qua ma trận M ( conv2(M, K, 'same')) trước đó , tổng hợp các số 1 tại các mục tiêu di chuyển hiệp sĩ hợp pháp cho từng vị trí

Ma trận kết quả được hiển thị ngầm.


bạn có thể mã hóa ma trận chập như 11043370BP5enhưng không ngắn hơn ...
Giuseppe


8

JavaScript (ES6), 88 byte

Trả về một chuỗi.

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)

Hãy thử trực tuyến!

Làm sao?

Trường hợp đặc biệt:n=3

Chúng tôi điền vào mỗi ô bằng , ngoại trừ ô trung tâm được đặt thành :20

(222202222)

Các trường hợp khác:3<n8

Đối với mỗi ô có và , chúng tôi tính toán một chỉ số tra cứu được xác định là:0 x < n 0 y < n i x , y(x,y)0x<n0y<nix,y

ix,y=min(x+1,nx)×min(y+1,ny)

Với , điều này mang lại:n=8

(1234432124688642369121296348121616128448121616128436912129632468864212344321)

Bảng tra cứu được định nghĩa là:T

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

trong đó đại diện cho một vị trí không sử dụng.0

Chúng tôi đặt từng ô thành:(x,y)

{T(ix,y)if ix,y88otherwise

JavaScript (ES7), 107 byte

Một thực hiện ngây thơ mà thực sự cố gắng tất cả các động thái.

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))

Hãy thử trực tuyến!


6

Thạch ,  23 22 14  10 byte

²ḶdðạP€ċ2)

Một liên kết đơn âm mang lại một danh sách phẳng - sử dụng ý tưởng đầu tiên được sử dụng bởi KSab trong câu trả lời Python của họ - các bước đi của hiệp sĩ có "hai bên" 1 và 2, các yếu tố duy nhất là 2.

Hãy thử trực tuyến! (chân trang gọi Liên kết duy nhất của chương trình và sau đó định dạng kết quả dưới dạng lưới)

Ngoài ra, cũng cho 10 byte, ²Ḷdðạ²§ċ5)(di chuyển của hiệp sĩ là tất cả các di chuyển có thể có với khoảng cách )5

Làm sao?

²Ḷ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]

Trước 22

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

Một chương trình đầy đủ (do ³).

Hãy thử trực tuyến! (chân trang gọi Liên kết duy nhất của chương trình và sau đó định dạng kết quả dưới dạng lưới)

Tìm tất cả các bước di chuyển và đếm những người hạ cánh trên bảng có thể chắc chắn có thể đánh bại bằng cách tính toán (có thể đánh bại bằng cách thay đổi logic "hạ cánh trên bảng").


4

APL (Dyalog Classic) , 18 byte

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

Hãy thử trực tuyến!

đánh giá đầu vào N

2⍴⎕ hai bản sao của N

⍳2⍴⎕ các chỉ số của ma trận N × N - ma trận có độ dài 2 vectơ

∘.-⍨ trừ từng cặp chỉ số từ các cặp khác, lấy một mảng N × N × N × N

| giá trị tuyệt đối

×/¨ mỗi sản phẩm

2=2s ở đâu? trả về ma trận boolean (0/1)

Lưu ý rằng một hiệp sĩ di chuyển ± 1 trên một trục và ± 2 trên trục kia, vì vậy giá trị tuyệt đối của sản phẩm của các bước đó là 2. Vì 2 không thể được tính theo bất kỳ cách nào khác, điều này chỉ có giá trị đối với di chuyển hiệp sĩ.

+/+/ tổng theo chiều cuối cùng, hai lần


3

RAD , 51 46 39 byte

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

Hãy thử trực tuyến!

Làm sao?

Đếm số lượng di chuyển hiệp sĩ hợp lệ cho mỗi ô vuông bằng cách xem di chuyển hiệp sĩ nào sẽ hạ cánh trên bảng:

{+/(⍵∘+¨(⊖,⊢)(⊢,-)(⍳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 byte

Điều này phá vỡ cho N lớn hơn sau đó 9. Vì vậy, tôi hạnh phúc N chỉ có thể đi đến 8 =))

⟦₅⟨∋≡∋⟩ᶠ;?z{{hQ&t⟦₅↰₁;Qz-ᵐ×ȧ2}ᶜ}ᵐ
  • -25 byte bằng cách chuyển sang công thức của KSab
  • -7 byte bằng cách làm phẳng mảng nhờ vào chủ nhật

Hãy thử trực tuyến!


Brachylog , 44 36 byte

Cái này cũng hoạt động cho số cao hơn 9

gP&⟦₅⟨∋≡∋⟩ᶠ;z{{hQ&t⟦₅↰₁;Qz-ᵐ×ȧ2}ᶜ}ᵐ
  • -8 byte bằng cách làm phẳng mảng nhờ vào chủ nhật

Hãy thử trực tuyến!


1
Bạn cũng có thể sử dụng ⟨∋≡∋⟩sớm để tạo tọa độ ma trận và lưu tổng thể 7 byte (đầu ra là một danh sách phẳng, được OP cho phép): Hãy thử trực tuyến!
- Phục hồi Monica

2

Võng mạc , 161 byte

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

Hãy thử trực tuyến! Liên kết bao gồm các trường hợp thử nghiệm. Giải trình:

.+
*

Chuyển đổi sang unary.

L$`_
$=

Liệt kê giá trị một lần cho mỗi _giá trị, nghĩa là tạo một hình vuông.

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

Bắt đầu từ _giữa regex, cố gắng khớp đủ bối cảnh để xác định xem mỗi bước di chuyển của tám hiệp sĩ có khả thi hay không. Mỗi mẫu bắt một ký tự duy nhất nếu trận đấu thành công. Tôi đã thử sử dụng các nhóm được đặt tên để số lần chụp trực tiếp bằng với kết quả mong muốn nhưng chi phí là 15 byte.

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

Nối tất cả các ảnh chụp thành công và lấy chiều dài.


2

Ngôn ngữ Wolfram (Mathicala) , 34 byte

Một Mathicala khác được tích hợp sẵn.

VertexDegree@KnightTourGraph[#,#]&

Trả về một danh sách phẳng.

Hãy thử trực tuyến!


Tôi thực sự đã đưa ra một nhận xét theo thách thức với câu trả lời này (mặc dù không đúng cú pháp vì tôi không biết WL). Tôi đã gỡ bỏ nó sau một chút, vì tôi nghĩ rằng người khác có thể muốn đăng nó như một câu trả lời thực sự.
Stewie Griffin


1

C (gcc) , 133 125 byte

Giải pháp này nên làm việc trên bất kỳ bảng kích thước.

#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);}

Hãy thử trực tuyến!


@ceilingcat Tất nhiên rồi, cảm ơn! Nhưng tôi không thấy đề xuất thứ hai thay đổi
Curtis Bechtel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.