Biorąc pod uwagę dwie różne pozycje na szachownicy i rodzaj pionka, wypisz minimalną liczbę ruchów, które zajmie ten kawałek, aby przejść z jednej pozycji do drugiej.
Zasady
Dany element może być królem, królową, wieżą, rycerzem i biskupem. (To wejście może być traktowane jako dowolne 5 unikalnych znaków)
Dwie pozycje można przyjąć w dowolnym dogodnym formacie,
Example:
a8 b8 c8 d8 ... h8
a7 b7 c7 d7 ... h7
...
...
a1 b1 c1 d1 ... h1
W przypadku gdy element nie może się tam dostać, wypisz coś innego niż dodatnią liczbę całkowitą.
Przykłady
i/p ---- o/p
King
a1,a4 3
a1,h6 7
b3,h5 6
Queen
a1,a4 1
a1,h6 2
b3,f7 1
Rook
a1,a4 1
a1,h6 2
h2,c7 2
Knight
a1,a4 3
a1,h6 4
b2,d3 1
b2,c3 2
b3,c3 3
a1,b2 4
Bishop
a1,a4 -1
a1,h6 2
b2,d3 -1
e1,h4 1
Odpowiedzi:
JavaScript (Node.js) ,
183180179 bajtówWypróbuj online!
Tak długo na przypadku krawędzi, dziękuję Arnauld za sprawdzenie. Test rycerza
źródło
max
przez trójskładnik.APL (Dyalog Classic) ,
117107105103989795928987 bajtówWypróbuj online!
lewy arg jest typem sztuki: 0 = król, 1 = królowa, 2 = wieża, 3 = rycerz, 4 = biskup; prawy arg jest macierzą 2x2 współrzędnych, każdy rząd reprezentuje pozycję; zwraca 0 dla nieosiągalnego
|-⌿⍵
oblicza parę [abs (∆x), abs (∆y)](⍎⍺⊃
...)⊣
wybiera wyrażenie z listy „...”; jeśli jest to funkcja, jest stosowana do|-⌿⍵
; jeśli jest to wartość (dzieje się tak tylko w przypadku rycerza),⊣
pamiętaj, aby ją zwrócić zamiast|-⌿⍵
king: max (
⌈/
) abs ∆-squeen: usuwa zera (
~∘0
) i count (≢
) unikalne (∪
)gawron: sum (
+/
) signa (monadic×
; 0 dla 0, 1 dla dodatniego)rycerz:
{⍺∊⍵:0⋄1+⍺∇i/⍨∨⌿2=|×/↑⍵∘.-i←,⍳8 8}/,¨⊂¨↓⍵
- zacznij od pozycji początkowej i rekurencyjnie oblicz generacje ruchów rycerza, aż pozycja końcowa znajdzie się w zestawie; zwraca głębokość rekurencjibiskup: czy parytety dwóch ∆ są równe? (
2=.|⊢
równoważne=/2|⊢
) pomnożyć wynik boolowski (0 lub 1) przez liczbę unikatową (≢∘∪
)źródło
⍎⍺⊃
. Bardzo mądry.Java (JDK) , 229 bajtów
Wypróbuj online!
Objaśnienia
Kod:
Kredyty
źródło
Węgiel drzewny , 108 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Wyświetl wszystkie 64 kwadraty planszy w predefiniowanej zmiennej pustej listy.
Zrób listę, której pierwszym wpisem jest lista zawierająca pozycję początkową.
Powtarzaj, aż ostatni wpis na liście zawiera pozycję końcową.
Filtruj wszystkie pozycje planszy będące odejściem rycerza od dowolnego wpisu w ostatnim wpisie listy list i pchnij tę listę do listy list. Obejmuje to pozycje wcześniej odwiedzone, ale i tak nie byliśmy nimi zainteresowani, więc kończymy na pierwszym przeszukiwaniu tablicy pozycji końcowej.
Oblicz bezwzględne różnice współrzędnych między pozycją początkową i końcową.
Wybierz na podstawie elementu wejściowego.
Jeśli jest królem, wydrukuj maksymalną bezwzględną różnicę współrzędnych.
Jeśli jest to królowa, wydrukuj 2, chyba że dwie różnice są równe lub jedna wynosi zero.
Jeśli jest to wieża, wydrukuj 2, chyba że jedna z różnic wynosi zero.
Jeśli jest biskupem, wypisz 0, jeśli kwadraty mają przeciwną parzystość, w przeciwnym razie wypisz 2, chyba że dwie różnice są równe.
Jeśli jest to rycerz, wydrukuj liczbę pętli wykonanych w celu znalezienia pozycji końcowej.
źródło
Japt , 67 bajtów
Wypróbuj online!
To było całkiem przeżycie. Wiele inspiracji czerpałem z doskonałej odpowiedzi APL . Podejrzewam, że nadal istnieje wiele możliwości gry w golfa, szczególnie w kodzie Knight.
Pozycje są pierwszym wejściem, w formie
[[x1,x2],[y1,y2]]
. Powinno działać dobrze[[y1,y2],[x1,x2]]
. Wybór elementu jest drugim wejściem, z 0 = król, 1 = królowa, 2 = rycerz, 3 = wieża, 4 = biskup. Zauważ, że Knight i Rook są zamienione w porównaniu do odpowiedzi APL.Wyjaśnienie:
źródło
á
udało mi się[[1,2][2,1]]
znacznie skrócić .á
, miły!U
jest niejawna po@
, więc możesz zapisać dwa bajty w funkcji rycerza. Możesz też zacząć@=ã ü;
od zapisania kolejnego. (ã
Sztuczka też jest sprytna :-))