N-by-N tahtasında bir şövalyenin grafiği


20

Satrançta, bir şövalye sadece mevcut pozisyonuna göre X ile işaretlenmiş pozisyonlara, ♞ ile işaretlenmiş pozisyonlara hareket edebilir:

bir şövalyenin hareket edebileceği yer


Bir Şövalye Grafiği , bir satranç tahtasındaki şövalye satranç parçasının tüm yasal hareketlerini temsil eden bir grafiktir. Bu grafiğin her köşesi, satranç tahtasının bir karesini temsil eder ve her kenar, bir şövalyenin birbirinden ayrı hareket eden iki kareyi birbirine bağlar.

Grafik, standart 8'e 8 kart için buna benzer.

resim açıklamasını buraya girin


Meydan okuma:

Tamsayıdır bir göz önüne alındığında , N , burada 3 ≤ N ≤ 8 , burada çıktı N'ye N her bir konumda mümkün hamle sayısı gösterilen bir ütü temsil eden matris. İçin N = 8 , çıktı, yukarıdaki grafikte her köşe değerlerini gösteren bir matris olacaktır.

Çıktı formatı esnektir. Liste listesi, hatta düzleştirilmiş liste vb. Kabul edilen biçimlerdir.


Komple test çantası seti:

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

Bu bu nedenle her dilde en kısa çözüm kazanır. Açıklamalar teşvik edilir!


1
İlgili meydan okuma 8 * 8 bir tahta üzerinde bir kare şövalye hamle sayısını sorgulamak için.
xnor

Çıktı n * n öğelerinin düz bir listesi olabilir mi?
xnor

13
Bu kelimenin tam anlamıyla sadece uç durumlar! :)
Jonathan Allan

Yanıtlar:


13

MATL , 17 16 bayt

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

Çevrimiçi deneyin!

(@Luis Mendo sayesinde -1 bayt.)

K

K=(0101010001000001000101010)

(Matrisin merkezine göre, her 1 geçerli bir şövalye hamlesidir.)

t&l- Tüm 1'lerin bir nxn matrisi oluşturun (burada n girdi demektir). Bu M. olsun.

[2K0] - Yığında [2, 4, 0] içeren bir dizi itme

B - Gerektiği gibi 0'larla dolguyu, ikiye dönüştürün

0 1 0
1 0 0
0 0 0

2:&Zv- Son sıra / sütunu tekrar etmeden her iki boyutta aynalayın ("simetrik aralık indeksleme"). Bu bize gerekli K matrisini verir.

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+- conv2(M, K, 'same')Her bir pozisyon için yasal şövalye hareket hedeflerindeki 1'leri toplayarak önceki M ( ) matrisi üzerinde K'nin 2 katlanması gerçekleştirin

Sonuç matrisi dolaylı olarak görüntülenir.


evrişim matrisini kodlayabilirsiniz 11043370BP5eancak bu daha kısa değildir ...
Giuseppe


8

JavaScript (ES6), 88 bayt

Bir dize döndürür.

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)

Çevrimiçi deneyin!

Nasıl?

n=3

20

(222202222)

3<n8

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

benx,y=min(x+1,n-x)xmin(y+1,n-y)

n=8

(1234432124688642369121296348121616128448121616128436912129632468864212344321)

T

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

0

(x,y)

{T(benx,y)Eğer benx,y88aksi takdirde

JavaScript (ES7), 107 bayt

Aslında tüm hamleleri deneyen saf bir uygulama.

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

Çevrimiçi deneyin!


6

Jöle ,  23 22 14  10 bayt

²ḶdðạP€ċ2)

Düz bir liste veren monadik bir bağlantı - KSab tarafından ilk olarak Python cevaplarında kullanılan fikri kullanır - şövalyenin hamleleri 2 ve tek faktör olan "taraflar" 1 ve 2'ye sahiptir.

Çevrimiçi deneyin! (altbilgi programın tek Bağlantısını çağırır ve ardından sonucu bir ızgara olarak biçimlendirir)

²Ḷdðạ²§ċ5)5 )

Nasıl?

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

Önceki 22 byter

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

Tam bir program (nedeniyle ³ ).

Çevrimiçi deneyin!(altbilgi programın tek Bağlantısını çağırır ve ardından sonucu bir ızgara olarak biçimlendirir)

Tüm hamle ve sayıları uçaktaki kişiler kara bulur muhtemelen kesinlikle hesaplayarak dövülebilir (mantık "tahta üzerinde kara" değiştirerek belki dövülebilir).


4

APL (Dyalog Klasik) , 18 bayt

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

Çevrimiçi deneyin!

değerlendirilmiş girdi N

2⍴⎕ N'nin iki kopyası

⍳2⍴⎕ bir N × N matrisinin indeksleri - uzunluk-2 vektörlerinin bir matrisi

∘.-⍨ her bir indeks çiftini birbirinden çıkarın, bir N × N × N × N dizisi alın

| mutlak değer

×/¨ her biri ürün

2=2'ler nerede? bir boole (0/1) matrisi döndürme

Bir şövalyenin bir eksende ± 1 ve diğer eksende ± 2 hareket ettiğine dikkat edin, bu nedenle bu adımların ürününün mutlak değeri 2'dir.

+/+/ son boyut boyunca toplam, iki kez


3

RAD , 51 46 39 bayt

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

Çevrimiçi deneyin!

Nasıl?

Hangi şövalye hamlelerinin tahtaya ineceğini görerek her kare için geçerli şövalye hamlesi sayısını sayar:

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

Bu N için 9'dan daha büyük bir çöküştür. Bu yüzden mutluyum N sadece 8 = olabilir

⟦₅⟨∋≡∋⟩ᶠ;?z{{hQ&t⟦₅↰₁;Qz-ᵐ×ȧ2}ᶜ}ᵐ
  • KSab formülüne geçerek -25 bayt
  • Sundar sayesinde diziyi düzleştirerek -7 bayt

Çevrimiçi deneyin!


Brachylog , 44 36 bayt

Bu aynı zamanda 9'dan büyük numaralar için de çalışır

gP&⟦₅⟨∋≡∋⟩ᶠ;z{{hQ&t⟦₅↰₁;Qz-ᵐ×ȧ2}ᶜ}ᵐ
  • Sundar sayesinde diziyi düzleştirerek -8 bayt

Çevrimiçi deneyin!


1
⟨∋≡∋⟩Matris koordinatlarını da oluşturmak için ilk başlarda kullanabilirsiniz ve toplam 7 bayt tasarruf edebilirsiniz (çıktı, OP tarafından izin verilen düz bir listedir): Çevrimiçi deneyin!
sundar - Monica'yı geri

2

Retina , 161 bayt

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

Çevrimiçi deneyin! Bağlantı, test senaryolarını içerir. Açıklama:

.+
*

Tekli'ye dönüştür.

L$`_
$=

Değeri her biri için değeri bir kez listeleyin _, yani bir kare oluşturun.

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

_Normal ifadenin ortasından başlayarak , sekiz şövalyenin hareketlerinin her birinin mümkün olup olmadığını belirlemek için yeterli bağlamı eşleştirmeye çalışın. Eşleşme başarılı olursa her desen tek bir karakter yakalar. Yakalama sayısı doğrudan istenen sonuca eşittir, ancak bu 15 bayta mal olan adlandırılmış grupları kullanmayı denedim.

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

Tüm başarılı yakalamaları birleştirin ve uzunluk kazanın.


2

Wolfram Dili (Mathematica) , 34 bayt

Yine başka bir Mathematica yerleşik.

VertexDegree@KnightTourGraph[#,#]&

Düzleştirilmiş bir liste döndürür.

Çevrimiçi deneyin!


Aslında bu cevap ile meydan okuma altında bir yorum yaptım (WL bilmediğimden doğru sözdizimi olmasa da). Biraz sonra kaldırdım, çünkü başka birinin gerçek bir cevap olarak göndermek isteyebileceğini düşündüm.
Stewie Griffin


1

C (gcc) , 133 bayt

Bu çözüm her boyutta tahta üzerinde çalışmalıdır.

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

Çevrimiçi deneyin!


@ceilingcat Elbette, teşekkürler! Ama ikinci önerinin ne değiştiğini anlamıyorum
Curtis Bechtel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.