W szachach rycerz może poruszać się tylko na pozycje oznaczone X w stosunku do swojej aktualnej pozycji, oznaczonej ♞:
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.
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 golf golfowy, więc wygrywa najkrótsze rozwiązanie w każdym języku. Wyjaśnienia są zachęcane!
Odpowiedzi:
MATL ,
1716 bajtówWypróbuj online!
(-1 bajt dzięki @Luis Mendo.)
(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 stosB
- Konwertuj wszystko na binarne, dopełnianie z zerami w razie potrzeby2:&Zv
- Odbicie lustrzane w obu wymiarach, bez powtarzania ostatniego wiersza / kolumny („indeksowanie zakresu symetrycznego”). To daje nam wymaganą macierz K.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 pozycjiMacierz wyników jest wyświetlana niejawnie.
źródło
11043370BP5e
ale nie jest to wcale krótsze ...Python 2 , 81 bajtów
Wypróbuj online!
źródło
JavaScript (ES6), 88 bajtów
Zwraca ciąg.
Wypróbuj online!
W jaki sposób?
JavaScript (ES7), 107 bajtów
Naiwna implementacja, która faktycznie próbuje wszystkich ruchów.
Wypróbuj online!
źródło
Galaretka ,
23 22 1410 bajtówMonadyczny 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)
W jaki sposób?
Poprzednie 22 bajtów
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 napewno do pokonania przez obliczenia (być może do pokonania przez zmianę logiki „ląd na planszy”).źródło
APL (Dyalog Classic) , 18 bajtów
Wypróbuj online!
⎕
oceniane wejście N2⍴⎕
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żdy2=
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źródło
RAD ,
514639 bajtówWypró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:
źródło
Brachylog ,
654033 bajtówTo rozkłada się na N większe niż 9. Więc cieszę się, że N może być tylko 8 =)
Wypróbuj online!
Brachylog ,
4436 bajtówTen działa również dla liczby wyższej niż 9
Wypróbuj online!
źródło
⟨∋≡∋⟩
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!Retina , 161 bajtów
Wypróbuj online! Link zawiera przypadki testowe. Wyjaśnienie:
Konwertuj na unary.
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.Połącz wszystkie udane zrzuty i zdobądź długość.
źródło
Wolfram Language (Mathematica) , 34 bajty
Jeszcze jedna wbudowana Mathematica.
Zwraca spłaszczoną listę.
Wypróbuj online!
źródło
Python 2 ,
11410392 bajtyWypróbuj online!
źródło
C (gcc) ,
133125 bajtówTo rozwiązanie powinno działać na płycie o dowolnym rozmiarze.
Wypróbuj online!
źródło