Sześciokątne szachy opisuje rodzinę wariantów szachów granych na planszy, gdzie komórki są sześciokątami zamiast tradycyjnych kwadratów. Istnieje wiele takich wariantów; w tym wyzwaniu skupimy się na wariancie Glińskiego, który jest najczęstszy.
Plansza składa się z trzech kolorów (aby ten sam kolor nie dzielił krawędzi), z krawędziami sześciokątów skierowanymi w stronę graczy. Na płycie znajduje się 11 plików oznaczonych literami a
od l
(litera j
nie jest używana) i 11 stopni (które wyginają się o 60 ° w pliku f
). Ranga 1
przez 6
każdą zawiera 11 komórek, ranga 7
ma 9 komórek, ranga 8
ma 7 i tak dalej. Ranga 11
zawiera dokładnie jedną komórkę: f11 . (Jeśli to pomoże, pomyśl o każdej randze jako o bardzo szerokim kształcie „V”).
Oto przykładowe zdjęcie planszy z rycerzem na środkowej celi. Komórki oznaczone kropką to legalne ruchy tego konkretnego rycerza. Rycerz porusza się w podobny sposób jak „normalne” szachy, dwa w dół i jeden nad drugim. W szachach sześciokątnych jest to ruch ortogonalny (przez krawędź), a następnie ruch po przekątnej w tym samym kierunku (najbliższy ruch do tego samego koloru). Na przykład z rycerzem poniżej ruchowi ortogonalnemu „w górę” do jasnobrązowego towarzyszy następnie ruch po przekątnej „w górę i w prawo” lub „w górę i w lewo” do najbliższego jasnobrązowego.
Z domeny publicznej za pośrednictwem https://commons.wikimedia.org/wiki/File:Glinski_Chess_Knight.svg
Ten rycerz jest ustawiony na f6, a tym samym legalne ruchy
c4, c5, d3, d7, e3, e8, g3, g8, h3, h7, i4, i5
Wejście
Pojedyncze wejście, które daje komórkę początkową naszego rycerza. Może to być pojedynczy ciąg "b6"
, dwa ciągi "b", "6"
itd. W dowolnym dogodnym formacie . Wprowadzane litery mogą być wielkie lub małe - twój wybór.
Wynik
Lista ważnych ruchów, które rycerz może wykonać w tej lokalizacji. Może to być tablica ciągów, pojedynczy ciąg znaków z jednoznacznym i spójnym ogranicznikiem, oddzielne ciągi znaków nowej linii itp., Cokolwiek jest najwygodniejsze. Dane wyjściowe niekoniecznie muszą być posortowane i mogą być pisane wielkimi lub małymi literami - twój wybór.
Zasady
- Zakładaj, że na planszy nie ma innych elementów ani nie zakłócają ruchów. Koncentrujemy się tylko na rycerzu.
- Dopuszczalny jest pełny program lub funkcja. Jeśli funkcja, możesz zwrócić dane wyjściowe zamiast je drukować.
- Jeśli to możliwe, dołącz link do internetowego środowiska testowego, aby inni mogli wypróbować Twój kod!
- Standardowe luki są zabronione.
- To jest golf golfowy, więc obowiązują wszystkie zwykłe zasady gry w golfa, a wygrywa najkrótszy kod (w bajtach).
Przykłady
b6
a3, c4, d5, d9, e7, e8
f6
c4, c5, d3, d7, e3, e8, g3, g8, h3, h7, i4, i5
f11
d8, e8, g8, h8
i1
f2, f3, g4, h4, l2, k3
źródło
Odpowiedzi:
JavaScript (ES6), 184 bajty
Pobiera plik
F
jako znak, a rangęR
jako liczbę całkowitą w składni curry(F)(R)
. Zwraca tablicę ciągów.W jaki sposób?
Krok # 1: Konwertuj plik / pozycję na współrzędne kartezjańskie
Konwertujemy sześciokątne szachowego współrzędnych kartezjańskich współrzędnych (x, y), z X w [0 .. 10] i Y w [0 .. 20] :
Krok # 2: zastosuj wektory ruchu
Poniżej znajduje się lista wektorów ruchu w systemie kartezjańskim:
Każdą z nich stosujemy do współrzędnych źródłowych (x, y) i otrzymujemy listę współrzędnych docelowych (X, Y) .
Krok # 3: Sprawdź współrzędne celu
Teraz musimy sprawdzić, które współrzędne celu faktycznie znajdują się na planszy. Odbywa się to poprzez testowanie X + Y i X - Y :
Współrzędne są poprawne, jeśli spełnione są wszystkie następujące porównania:
Powinniśmy również sprawdzić, czy X jest w [0 .. 10] . Nie dzieje się tak wyraźnie, ponieważ
s[X]
jest niezdefiniowane, jeśli nie jest, co ostatecznie skutkuje falsyną wartością, która zostaje odfiltrowana.Krok # 4: Konwertuj z powrotem na sześciokątne współrzędne szachowe
Na koniec prawidłowe współrzędne docelowe są przekształcane z powrotem w sześciokątne współrzędne szachowe, przy użyciu odwrotności wzorów opisanych w kroku # 1.
Przypadki testowe
Pokaż fragment kodu
źródło
Partia. 403 bajtów
Dostosowuje układ współrzędnych, choć w inny sposób niż odpowiedź @ Arnauld.
c
Podprogram wykorzystuje symetrii próbując odbicie lustrzane każdego ruchu. (Próbowałem także obracać, ale zajęło to zbyt wiele bajtów).źródło
JavaScript (ES6), 184 bajty
Myślałem, że przeniosę moje rozwiązanie Batch do ES6, aby zobaczyć, jak to się porównuje ... Nie spodziewałem się, że będzie tak blisko ...
źródło
CJam, 77
Wypróbuj online
Przegląd:
Używam układu współrzędnych, który wygląda jak a..fi 1..6 po lewej stronie, rozszerzony bez zginania, z literami zamienionymi na liczby i zmienionymi na 0 (b3 → [1 2], g1 → [6 1], k3 → [9 6]). Względne ruchy w tym systemie to [1 3], [2 -1], [2 3] i ich odbicia (ujemne i zamienione, np. [1 3] → [-1 -3], [3 1], [- 3 -1]). Wynikowa pozycja [xy] jest poprawna iff [xyz] ⊂ [0 1 .. 10] gdzie z = x-y + 5.
źródło
Dyalog APL, 72 bajty
próbować
buduje listę
a
wszystkich prawidłowych komórek:'A1' 'A2' ... 'L6'
a
służy zarówno do wejścia, jak i wyjściabuduje listę
j
odpowiednich współrzędnycha
w układzie, w którym oś x jest wzdłuż,A6-L1
ay wzdłużF1-F11
wyimaginowana trzecia współrzędna jest różnicą dwóch pierwszych
jeśli komórka wejściowa zostanie przetłumaczona na współrzędne
0 0 0
, rycerz może przejść do tych komórek, których iloczyn współrzędnych wynosi 6 lub -6źródło
Python 3.6, 149
Wywołana anonimowa funkcja z dwoma łańcuchami dla pliku i rangi; zwraca listę ciągów znaków.
Nie golfowany:
źródło