Wykres rycerski na planszy N-by-N

20

W szachach rycerz może poruszać się tylko na pozycje oznaczone X w stosunku do swojej aktualnej pozycji, oznaczonej ♞:

gdzie rycerz może się poruszać


A Knight wykres to wykres, który przedstawia wszystkie ruchy prawne rycerz szachy kawałek na szachownicy. Każdy wierzchołek tego wykresu reprezentuje kwadrat szachownicy, a każda krawędź łączy dwa kwadraty, które są ruchem rycerza od siebie.

Wykres wygląda tak dla standardowej płyty 8 na 8.

wprowadź opis zdjęcia tutaj


Wyzwanie:

Biorąc pod uwagę liczbę całkowitą N , gdzie 3 ≤ N ≤ 8 , wyprowadza macierz N-na-N reprezentującą tablicę, na której pokazana jest liczba możliwych ruchów z każdej pozycji. Dla N = 8 wynikiem będzie macierz pokazująca wartości każdego wierzchołka na powyższym wykresie.

Format wyjściowy jest elastyczny. Lista list lub nawet spłaszczona lista itp. Są akceptowanymi formatami.


Kompletny zestaw przypadków testowych:

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

To jest więc wygrywa najkrótsze rozwiązanie w każdym języku. Wyjaśnienia są zachęcane!

Stewie Griffin
źródło
1
Podobne wyzwanie do sprawdzenia liczby ruchów rycerza z kwadratu na planszy 8 * 8.
xnor
Czy wynik może być płaską listą elementów n * n?
xnor
13
To dosłownie tylko przypadki na krawędzi! :)
Jonathan Allan,

Odpowiedzi:

13

MATL , 17 16 bajtów

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

Wypróbuj online!

(-1 bajt dzięki @Luis Mendo.)

K.

K.=(0101010001000001000101010)

(W stosunku do środka matrycy każdy 1 jest prawidłowym ruchem rycerza).

t&l- Utwórz macierz nxn ze wszystkich 1s (gdzie n jest wejściem). Niech to będzie M.

[2K0] - Wciśnij tablicę zawierającą [2, 4, 0] na stos

B - Konwertuj wszystko na binarne, dopełnianie z zerami w razie potrzeby

0 1 0
1 0 0
0 0 0

2:&Zv- Odbicie lustrzane w obu wymiarach, bez powtarzania ostatniego wiersza / kolumny („indeksowanie zakresu symetrycznego”). To daje nam wymaganą macierz 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+- Wykonaj splot 2D K na wcześniejszej macierzy M ( conv2(M, K, 'same')), sumując 1s przy legalnych celach ruchu rycerza dla każdej pozycji

Macierz wyników jest wyświetlana niejawnie.

sundar - Przywróć Monikę
źródło
możesz zakodować macierz splotu, 11043370BP5eale nie jest to wcale krótsze ...
Giuseppe,
12

Python 2 , 81 bajtów

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

Wypróbuj online!

KSab
źródło
8

JavaScript (ES6), 88 bajtów

Zwraca ciąg.

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)

Wypróbuj online!

W jaki sposób?

n=3)

2)0

(2)2)2)2)02)2)2)2))

3)<n8

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

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

n=8

(12)3)443)2)12)4688642)3)691212963)4812161612844812161612843)691212963)2)4688642)12)3)443)2)1)

T.

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

0

(x,y)

{T.(jax,y)gdyby jax,y88Inaczej

JavaScript (ES7), 107 bajtów

Naiwna implementacja, która faktycznie próbuje wszystkich ruchów.

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

Wypróbuj online!

Arnauld
źródło
6

Galaretka ,  23 22 14  10 bajtów

²ḶdðạP€ċ2)

Monadyczny link dający płaską listę - wykorzystuje pomysł użyty po raz pierwszy przez KSab w odpowiedzi na Pythona - ruchy rycerza mają „boki” 1 i 2, jedyne czynniki 2.

Wypróbuj online! (stopka wywołuje jedyny link programu, a następnie formatuje wynik jako siatkę)

²Ḷdðạ²§ċ5)5

W jaki sposób?

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

Poprzednie 22 bajtów

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

Pełny program (z powodu ³).

Wypróbuj online! (stopka wywołuje jedyny link programu, a następnie formatuje wynik jako siatkę)

Znajduje wszystkie ruchy i zlicza te, które wylądują na planszy, prawdopodobnie na pewno do pokonania przez obliczenia (być może do pokonania przez zmianę logiki „ląd na planszy”).

Jonathan Allan
źródło
4

APL (Dyalog Classic) , 18 bajtów

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

Wypróbuj online!

oceniane wejście N

2⍴⎕ dwie kopie N

⍳2⍴⎕ wskaźniki macierzy N × N - macierzy wektorów o długości 2

∘.-⍨ odejmij każdą parę indeksów od siebie, uzyskaj tablicę N × N × N × N.

| całkowita wartość

×/¨ produkt każdy

2=gdzie są 2s? zwraca macierz boolowską (0/1)

Zauważ, że rycerz porusza się ± 1 na jednej osi i ± 2 na drugiej, więc wartość bezwzględna iloczynu tych kroków wynosi 2. Ponieważ 2 nie może być uwzględnione w żaden inny sposób, jest to ważne tylko dla ruchów rycerza.

+/+/ suma wzdłuż ostatniego wymiaru, dwa razy

ngn
źródło
3

RAD , 51 46 39 bajtów

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

Wypróbuj online!

W jaki sposób?

Liczy liczbę prawidłowych ruchów rycerza na każdym polu, sprawdzając, które ruchy rycerzy wylądują na planszy:

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

Brachylog , 65 40 33 bajtów

To rozkłada się na N większe niż 9. Więc cieszę się, że N może być tylko 8 =)

⟦₅⟨∋≡∋⟩ᶠ;?z{{hQ&t⟦₅↰₁;Qz-ᵐ×ȧ2}ᶜ}ᵐ
  • -25 bajtów, przechodząc do formuły KSab
  • -7 bajtów poprzez spłaszczanie tablicy dzięki sundar

Wypróbuj online!


Brachylog , 44 36 bajtów

Ten działa również dla liczby wyższej niż 9

gP&⟦₅⟨∋≡∋⟩ᶠ;z{{hQ&t⟦₅↰₁;Qz-ᵐ×ȧ2}ᶜ}ᵐ
  • -8 bajtów przez spłaszczanie tablicy dzięki sundar

Wypróbuj online!

Kroppeb
źródło
1
Możesz ⟨∋≡∋⟩wcześnie użyć do wygenerowania współrzędnych macierzy i zaoszczędzić 7 bajtów ogółem (wyjście to płaska lista, na co pozwala OP): Wypróbuj online!
Sundar - Przywróć Monikę
2

Retina , 161 bajtów

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

Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:

.+
*

Konwertuj na unary.

L$`_
$=

Podaj wartość raz dla każdej _wartości, tzn. Utwórz kwadrat.

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

Począwszy _od środka wyrażenia regularnego, spróbuj dopasować odpowiedni kontekst, aby ustalić, czy każdy z ośmiu ruchów rycerza jest możliwy. Każdy wzór przechwytuje jeden znak, jeśli dopasowanie się powiedzie. Próbowałem użyć nazwanych grup, aby liczba przechwyceń bezpośrednio odpowiadała pożądanemu wynikowi, ale kosztowało to 15 bajtów.

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

Połącz wszystkie udane zrzuty i zdobądź długość.

Neil
źródło
2

Wolfram Language (Mathematica) , 34 bajty

Jeszcze jedna wbudowana Mathematica.

VertexDegree@KnightTourGraph[#,#]&

Zwraca spłaszczoną listę.

Wypróbuj online!

alephalpha
źródło
Właściwie skomentowałem pod tym wyzwaniem tę odpowiedź (chociaż niepoprawna składnia, ponieważ nie znam WL). Usunąłem go po chwili, ponieważ pomyślałem, że ktoś inny może chcieć opublikować go jako prawdziwą odpowiedź.
Stewie Griffin,
2

Python 2 , 114 103 92 bajty

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

Wypróbuj online!

ovs
źródło
1

C (gcc) , 133 125 bajtów

To rozwiązanie powinno działać na płycie o dowolnym rozmiarze.

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

Wypróbuj online!

Curtis Bechtel
źródło
@ceilingcat Oczywiście, dziękuję! Ale nie widzę, co zmienia druga sugestia
Curtis Bechtel,