Grafik ksatria di papan N-oleh-N

20

Dalam catur, seorang ksatria hanya dapat bergerak ke posisi yang ditandai dengan X relatif terhadap posisi saat ini, ditandai dengan ♞:

di mana seorang kesatria bisa bergerak


A Knight's Graph adalah grafik yang mewakili semua gerakan hukum dari bidak ksatria di papan catur. Setiap titik dari grafik ini mewakili kuadrat papan catur, dan masing-masing ujung menghubungkan dua kotak yang merupakan langkah ksatria yang terpisah satu sama lain.

Grafik terlihat seperti ini untuk papan 8-by-8 standar.

masukkan deskripsi gambar di sini


Tantangan:

Diberikan bilangan bulat N , di mana 3 ≤ N ≤ 8 , menghasilkan matriks N-by-N yang mewakili papan, tempat jumlah gerakan yang mungkin dari setiap posisi ditampilkan. Untuk N = 8 , output akan berupa matriks yang menunjukkan nilai dari setiap simpul dalam grafik di atas.

Format output fleksibel. Daftar daftar atau bahkan daftar yang diratakan dll. Adalah format yang diterima.


Kumpulan kasus uji lengkap:

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

Ini adalah sehingga solusi terpendek dalam setiap bahasa menang. Penjelasan didorong!

Stewie Griffin
sumber
1
Tantangan terkait untuk menanyakan jumlah gerakan ksatria dari kotak di papan 8 * 8.
xnor
Bisakah output menjadi daftar elemen n * n?
xnor
13
Ini benar-benar hanya kasus tepi! :)
Jonathan Allan

Jawaban:

13

MATL , 17 16 byte

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

Cobalah online!

(-1 byte terima kasih kepada @Luis Mendo.)

K

K=(0101010001000001000101010)

(Sehubungan dengan pusat matriks, masing-masing 1 adalah langkah ksatria yang valid.)

t&l- Bentuk matriks nxn dari semua 1s (di mana n adalah input). Biarkan ini menjadi M.

[2K0] - Dorong array yang berisi [2, 4, 0] pada stack

B - Konversi semua menjadi biner, padding dengan 0s sesuai kebutuhan

0 1 0
1 0 0
0 0 0

2:&Zv- Mencerminkan bahwa pada kedua dimensi, tanpa mengulangi baris / kolom terakhir ("pengindeksan rentang simetris"). Ini memberi kita matriks K. yang diperlukan

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+- Lakukan lilitan 2D K pada matriks M ( conv2(M, K, 'same')) sebelumnya, rangkum 1s pada target ksatria legal untuk setiap posisi

Matriks hasil ditampilkan secara implisit.

sundar - Pasang kembali Monica
sumber
Anda dapat menyandikan matriks konvolusi 11043370BP5etetapi itu tidak lebih pendek ...
Giuseppe
12

Python 2 , 81 byte

lambda n:[sum(2==abs((i/n-k/n)*(i%n-k%n))for k in range(n*n))for i in range(n*n)]

Cobalah online!

KSab
sumber
8

JavaScript (ES6), 88 byte

Mengembalikan string.

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)

Cobalah online!

Bagaimana?

n=3

20

(222202222)

3<n8

(x,y)0x<n0y<nsayax,y

sayax,y=min(x+1,n-x)×min(y+1,n-y)

n=8

(1234432124688642369121296348121616128448121616128436912129632468864212344321)

T

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

0

(x,y)

{T(sayax,y)jika sayax,y88jika tidak

JavaScript (ES7), 107 byte

Implementasi naif yang sebenarnya mencoba semua gerakan.

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

Cobalah online!

Arnauld
sumber
6

Jelly ,  23 22 14  10 byte

²ḶdðạP€ċ2)

Tautan monadik yang menghasilkan daftar datar - menggunakan ide yang pertama kali digunakan oleh KSab dalam jawaban Python mereka - gerakan knight memiliki "sisi" 1 dan 2, satu-satunya faktor 2.

Cobalah online! (footer menyebut hanya tautan program dan kemudian memformat hasilnya sebagai kisi)

²Ḷdðạ²§ċ5)5

Bagaimana?

²Ḷ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 byter sebelumnya

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

Program lengkap (karena ³).

Cobalah online! (footer menyebut hanya tautan program dan kemudian memformat hasilnya sebagai kisi)

Temukan semua gerakan dan hitung yang mendarat di papan mungkin pasti dapat dikalahkan dengan menghitung (mungkin dapat dikalahkan dengan mengubah logika "mendarat di papan").

Jonathan Allan
sumber
4

APL (Dyalog Classic) , 18 byte

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

Cobalah online!

input yang dievaluasi N

2⍴⎕ dua salinan N

⍳2⍴⎕ indeks matriks N × N - matriks panjang-2 vektor

∘.-⍨ kurangi setiap pasangan indeks dari masing-masing pasangan lainnya, dapatkan array N × N × N × N

| nilai mutlak

×/¨ produk masing-masing

2=dimana 2s? mengembalikan matriks boolean (0/1)

Perhatikan bahwa seorang ksatria bergerak ± 1 pada satu sumbu dan ± 2 pada yang lain, sehingga nilai absolut dari produk langkah-langkah tersebut adalah 2. Karena 2 tidak dapat difaktorkan dengan cara lain, ini hanya berlaku untuk gerakan ksatria.

+/+/ jumlahkan sepanjang dimensi terakhir, dua kali

ngn
sumber
3

RAD , 51 46 39 byte

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

Cobalah online!

Bagaimana?

Menghitung jumlah gerakan ksatria yang valid untuk setiap kotak dengan melihat gerakan ksatria mana yang akan mendarat di papan:

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

Brachylog , 65 40 33 byte

Ini terurai untuk N lebih besar dari 9. Jadi saya senang N hanya bisa pergi ke 8 =)

⟦₅⟨∋≡∋⟩ᶠ;?z{{hQ&t⟦₅↰₁;Qz-ᵐ×ȧ2}ᶜ}ᵐ
  • -25 byte dengan beralih ke rumus KSab
  • -7 byte dengan meratakan array berkat sundar

Cobalah online!


Brachylog , 44 36 byte

Yang ini juga berfungsi untuk angka yang lebih tinggi daripada 9

gP&⟦₅⟨∋≡∋⟩ᶠ;z{{hQ&t⟦₅↰₁;Qz-ᵐ×ȧ2}ᶜ}ᵐ
  • -8 byte dengan meratakan array berkat sundar

Cobalah online!

Kroppeb
sumber
1
Anda dapat menggunakan ⟨∋≡∋⟩awal untuk menghasilkan koordinat matriks juga, dan menyimpan 7 byte secara keseluruhan (output adalah daftar datar, yang diizinkan oleh OP): Coba online!
sundar - Reinstate Monica
2

Retina , 161 byte

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

Cobalah online! Tautan termasuk kasus uji. Penjelasan:

.+
*

Konversikan ke unary.

L$`_
$=

Daftar nilai satu kali untuk masing-masing _dalam nilai, yaitu membuat kotak.

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

Mulai dari _di tengah regex, cobalah untuk mencocokkan konteks yang cukup untuk menentukan apakah masing-masing dari delapan ksatria bergerak adalah mungkin. Setiap pola menangkap satu karakter jika pertandingan berhasil. Saya mencoba menggunakan grup bernama sehingga jumlah tangkapan langsung sama dengan hasil yang diinginkan tetapi biaya 15 byte.

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

Menggabungkan semua menangkap sukses dan mengambil panjangnya.

Neil
sumber
2

Bahasa Wolfram (Mathematica) , 34 byte

Namun lain Mathematica built-in.

VertexDegree@KnightTourGraph[#,#]&

Mengembalikan daftar yang diratakan.

Cobalah online!

alephalpha
sumber
Saya benar-benar membuat komentar di bawah tantangan dengan jawaban ini (walaupun sintaksinya tidak benar karena saya tidak tahu WL). Saya menghapusnya setelah beberapa saat, karena saya pikir orang lain mungkin ingin mempostingnya sebagai jawaban nyata.
Stewie Griffin
2

Python 2 , 114 103 92 byte

lambda n:[sum((d*c>d)+(d*c>c)for d in(y%n,n-y%n-1)for c in(y/n,n-y/n-1))for y in range(n*n)]

Cobalah online!

ovs
sumber
1

C (gcc) , 133 125 byte

Solusi ini harus bekerja pada papan ukuran apa pun.

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

Cobalah online!

Curtis Bechtel
sumber
@ceilingcat Tentu saja, terima kasih! Tapi saya tidak melihat apa perubahan saran kedua
Curtis Bechtel