Problem:
W szachach istnieje dość dobrze znana zasada losowania przez powtarzanie. Jeśli ta sama pozycja zostanie powtórzona 3 razy (lub więcej), gracz zamierzający wykonać ruch, który spowoduje to powtórzenie, może ubiegać się o remis.
Czasami jest to łatwe zadanie dla arbitra, jeśli kilka ostatnich ruchów to tylko gracze poruszający się do tyłu i do przodu. Czasami jest to mniej banalne, gdy elementy przesunęły się znacznie między powtarzanymi pozycjami.
Problemem w tym wyzwaniu jest wyprowadzenie prawdziwej wartości, jeśli zadeklarowana pozycja jest losowana przez powtórzenie (było widziane 3 razy lub więcej) i wartość falsey, jeśli zadeklarowana pozycja nie jest losowana przez powtórzenie, biorąc pod uwagę listę ruchów w notacji współrzędnych zgodnie z opisem poniżej lub dowolną wybraną notacją (ale będziesz musiał przekonwertować przypadki testowe).
Jaka jest pozycja?
W prawdziwym scenariuszu na pozycję wpływ miałyby takie rzeczy, jak to, czy gracz może zamek, czy też możliwe jest użycie umiejętności en-passant; należy nie uważają tych w rozwiązanie problemu. W tym problemie pozycja jest definiowana po prostu przez konfigurację elementów na planszy. Tak więc, dla celów tego problemu, dwie pozycje są uważane za takie same, jeśli każdy kwadrat na obu planszach jest zajęty przez ten sam typ kawałka tego samego koloru. Nie musi to być dokładny element, na przykład rycerze biali mogą zamieniać kwadraty, a jeśli wszystkie inne elementy spełniają kryteria, nadal byłaby to ta sama pozycja.
Jak wygląda poprawna notacja?
Chociaż przejdę do wyjaśnienia notacji współrzędnych, masz swobodę przyjmowania danych przez wybrany przez siebie system notacji. Pod warunkiem że:
- Każda pozycja w notacji opisuje którekolwiek lub wszystkie z następujących elementów: część / części, których to dotyczy; czy dostarczono czek, mat, podwójny czek, mat lub pat; jeśli nastąpiło przechwycenie en-passant; pozycja początkowa; ostateczna pozycja.
- W notacji możesz nie mieć informacji o powtórzeniach.
Tak długo, jak te kryteria są spełnione, z przyjemnością akceptuję, o ile w odpowiedzi określisz swój system notacji. Może to być np. Indeksowany wiersz, krotki kolumn lub cokolwiek innego, co ma sens dla twojego programu.
Notacja współrzędnych
Notacja współrzędnych to notacja, która opisuje ruchy jako układ współrzędnych.
Ruch jest opisywany jako pierwsza początkowa współrzędna z zestawu, {A1-H8}
a następnie współrzędna docelowa ponownie z tego samego zestawu. Tak wyglądałby Gambit Króla (jako zbiór strun)
{"E2-E4","E7-E5","F2-F4"}
Uważam, że jest to najlepsza notacja do zastosowania w przypadku tego problemu, ponieważ nie jest zaśmiecona dodatkowymi informacjami, takimi jak informacja o tym, czy nastąpiło sprawdzenie lub jaki jest rodzaj ruchu elementu. Jak wspomniano wcześniej, notacja może być do wyboru, więc możesz użyć innej notacji, np. Notacji algebraicznej lub możesz ją dostosować (np. Usunąć myślniki lub wziąć jako listę krotek)
Zasady:
- Należy nie rozważy, czy stanowisko lub ruch jest ważny, tylko czy to powoduje powtórzenie
- Możesz założyć, że promocja roszowania i pionków nie nastąpi.
- Powinieneś wziąć listę ciągów jako dane wejściowe i wyprowadzić prawdziwą lub falsey wartość odpowiadającą temu, czy trzecie (lub więcej) powtórzenie miało miejsce w ostatnim ruchu
- Gra rozpoczyna się zawsze od standardowej pozycji początkowej dla szachów. Pozycja początkowa może się liczyć do powtórzeń.
- Remis przez powtórzenie nie wystąpił, jeśli pozycja nie zostanie powtórzona przez ostatni ruch
Główne zasady:
- To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
Nie pozwól, aby języki kod-golfowe zniechęcały Cię do publikowania odpowiedzi w językach niekodujących golfa. Spróbuj znaleźć możliwie najkrótszą odpowiedź na „dowolny” język programowania. - Do odpowiedzi mają zastosowanie standardowe reguły z domyślnymi regułami We / Wy , więc możesz używać STDIN / STDOUT, funkcji / metody z odpowiednimi parametrami i typem zwracanych, pełnych programów. Twoja decyzja.
- Domyślne luki są zabronione.
- Jeśli to możliwe, dodaj link z testem kodu (tj. TIO ).
- Zalecane jest również dodanie wyjaśnienia do odpowiedzi.
Przypadki testowe
Powinieneś zwrócić prawdziwe wartości dla:
{"B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8"}
{"B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8"}
{"B1-C3","B8-C6","D2-D4","D7-D5","D1-D3","D8-D6","C3-B1","C6-B8","B1-C3","B8-C6","D3-D1","D6-D8","D1-D3","D8-D6"}
{"D2-D4","B8-C6","E2-E4","C6-D4","D1-E2","D4-E6","E2-F3","E6-D4","F3-D1","D4-C6","D1-E2","C6-D4","E1-D1","D4-C6","D1-E1","C6-D4"}
{"B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8","B1-C3"}
I wartości falsey dla:
{}
{"E2-E4","E7-E5","F2-F4"}
{"B1-C3","B8-C6","C3-B1","C6-B8","B1-C3","B8-C6","C3-B1","C6-B8","F2-F4","F7-F5"}
{"E2-E4","E7-E5","G1-F3","B8-C6","F1-C4","G8-F6","F3-G5","D7-D5","E4-D5","F6-D5","G5-F7"}
{"D2-D4","B8-C6","E2-E4","C6-D4","D1-E2","D4-C6","E2-D1","C6-D4","D1-E2","D4-C6","E2-D1"}
{"B1-C3","B8-C6","C3-B5","C6-B4","B5-D4","B4-D5","D4-C6","D5-C3","C6-B8","C3-B1","B8-C6","B1-C3","C6-B8","C3-B1"}
{"E2-E4","E7-E5","D1-E2","E8-E7","E1-D1","D8-E8","E2-E1","E7-D8","E1-E2","E8-E7","E2-E1","E7-E8"}
źródło
C6-B8
trzykrotnie nastąpiła pozycja początkowa.Odpowiedzi:
APL (Dyalog Extended) ,
5549474544 bajtów SBCS-4 dzięki ngn.
Pełny program Zachęty do odwróconej liście odwróconych współrzędnych parach
przykład
{"B1-C3","B8-C6"}
jest[[[8,2],[6,3]],[[1,2],[3,3]]]
Wypróbuj online! (zawiera funkcję narzędzia,
Coords
która tłumaczy format OP)Skonfiguruj listę stanów:
s←3
przypisać do trzechs
(na s tates)Ponieważ 3 nie jest prawidłowym stanem planszy, nie wpłynie to na naszą liczbę powtórzeń i potrzebujemy wartości przejścia zadania…
Zbuduj reprezentację szachownicy:
5
... odrzutów, że dla wyniku zastosowania następującej funkcji pochodzącej między 5 i 3:⍥⍳
rozszerzyć oba argumenty do ich ɩ ndices;[1,2,3,4,5]
…[1,2,3]
,∘⌽
Lewa strona połączona z rewersem prawej strony[1,2,3,4,5,3,2,1]
reprezentuje oficerów⍪
zrobić w stół;[[1],
[2],
[3],
[4],
[5],
[3],
[2],
[1]]
6,
dodaj (do każdego wiersza) sześć, reprezentujących pionki;[[6,1],
[6,2],
[6,3],
[6,4],
[6,5],
[6,3],
[6,2],
[6,1]]
⍉
transponować;[[6,6,6,6,6,6,6,6],
[1,2,3,4,5,3,2,1]]
¯4↑
weź ujemne (tj. ostatnie) cztery (wiersze), wypełnione zerami, reprezentujące puste kwadraty;[[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[6,6,6,6,6,6,6,6],
[1,2,3,4,5,3,2,1]]
(
…)
Zastosuj do tego następującą milczącą funkcję:-
negacja (reprezentuje przeciwny kolor);[[ 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0],
[-6,-6,-6,-6,-6,-6,-6,-6],
[-1,-2,-3,-4,-5,-3,-2,-1]]
⊖⍪
ułóż na wierzchu wywrócony argument, dając nam pełne wyżywienie;[[ 1, 2, 3, 4, 5, 3, 2, 1],
[ 6, 6, 6, 6, 6, 6, 6, 6],
[ 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0],
[ 0, 0, 0, 0, 0, 0, 0, 0],
[-6,-6,-6,-6,-6,-6,-6,-6],
[-1,-2,-3,-4,-5,-3,-2,-1]]
Zbuduj listę ruchów, a następnie stan początkowy:
⊂
dołącz to (aby traktować to jako pojedynczą jednostkę)⎕,
zapytaj o listę ruchów i przygotuj ją do stanu początkowegoZmniejsz * o funkcję, która dołącza bieżący stan do listy i wykonuje ruch:
{
…}/
Zredukuj o następującą anonimową lambda:⍵
właściwy argument (aktualny stan)⊂
załącz go, aby traktować jako jednostkęs,←
w miejscu dołącz go do listy stanów⊃
ujawnić, aby użyć tego stanu…
@⍺
W elementach z dwoma współrzędnymi reprezentowanymi przez lewy argument: wstaw:0
zero,,
po∘
którym⊃
następuje pierwsza wartość,to skutecznie „przenosi” wartość z pierwszej współrzędnej do drugiej współrzędnej, pozostawiając za sobą zero
Sprawdź, czy mamy trzy lub więcej stanu końcowego:
s∩
przecięcie wszystkich państw z tym ostatnim; podzbiór stanów identyczny z nim≢
zliczyć je2≤
sprawdź, czy są dwa lub więcej (tj. trzy lub więcej, w tym stan końcowy)* APL jest asocjacyjnie prawy, więc najpierw wywoływana jest funkcja ze stanem początkowym jako prawym argumentem, a początkowy ruch jako lewym argumentem, a następnie jego wynik, nowy stan, staje się nowym prawym argumentem z drugim ruchem jako nowym lewym argumentem itp. Ostatecznym wynikiem jest
źródło
\
zamiast zmniejszania/
⍳3⊣s←⍬
->⍳s←3
. działa, ponieważ3
nie jest prawidłową płytą, więc nie wpłynie na wykrywanie powtórzeń(0,⊃)@
->0,∘⊃@
R ,
180177144 bajtówWypróbuj online!
-3 bajty dzięki Giuseppe
-29 bajtów dzięki użyciu Nicka Kennedy'ego
Reduce
i-rev(l)
-4 bajty przez odwrócenie
z
Przyjmuje jako wejście wektor liczb całkowitych od 1 do 64 oznaczających kwadraty. TIO zawiera funkcję przekształcania do tego formatu. Różne elementy są przechowywane jako liczby całkowite od 1 do 6 oraz od -1 do -6.
Wyjaśnienie:
źródło
Reduce
w swoim rdzeniu używa kumulacji . Ma 148 bajtów.Galaretka ,
4137 bajtówWypróbuj online!
Łącze monadyczne, które przyjmuje dane wejściowe jako listę par 1-indeksowanych ruchów rzędów głównych
[from, to]
i zwraca 1 dla losowań, a 0 dla nie.Uwaga: kod stopki na TIO tłumaczy ruchy dostarczone przez OP na format numeryczny, ale zgodnie z dyskusją pod pytaniem format numeryczny byłby prawidłowym wprowadzeniem.
Wyjaśnienie
źródło
JavaScript (Node.js) ,
121111 bajtów[sq0, sq1]
Zwraca wartość logiczną.
Wypróbuj online!
W jaki sposób?
Kawałki
Wartości użyte do identyfikacji kawałków nie mają tak naprawdę znaczenia, o ile istnieje jedna unikalna wartość na rodzaj kawałka.
Używamy:
Zarząd i pozycja początkowa
'89ABCA981111111'
→ 8 głównych czarnych pionków, a następnie pierwszych 7 czarnych pionków10n**32n
0x7e5196ee74377
→ wszystkie białe elementy (wydaje się2222222234567543
w systemie dziesiętnym)Co skutkuje w:
Śledzenie pozycji
Oto dlaczego:
Skomentował
źródło
Java 10,
336330287285282276 bajtów-11 bajtów dzięki @Arnauld , zmieniając
i%56<8?"ABCDECBA".charAt(i%56%7):i%48<16?1:0
nai%56<8?i%8*35%41%10%8+2:9>>i/16&1
.{"E2-E4",...
[[12,28],...
Wypróbuj online.
Wyjaśnienie:
Wartości sztuk po ich wypełnieniu
A[i]=(i%56<8?i%8*35%41%10%8+2:9>>i/16&1)*(i/32*2-1)
to:Wypróbuj online.
źródło
java.util.Arrays.deepHashCode(A)
, ale najwyraźniej niektóre skróty są w jakiś sposób takie same (tj. Ostatni przypadek testowy ma-447346111=3
na mapie ..), jeśli porównam wynikową mapę mojej bieżącej odpowiedzi i mapę wynikową za pomocądeepHashCode(A)
. Ponadto byłby o 3 bajty dłuższy niż krótszy, ponieważ muszę użyćdeepHashCode(A)
dwa razy (również w stanie początkowym).two positions are seen to be the same if each square on both boards is occupied by the same type of piece of the same colour
i%8*35%41%10%8+2
powinno być możliwym zamiennikiem"ABCDECBA".charAt(i%8)
, oszczędzając 6 bajtów. Generuje wzór[ 2, 7, 3, 5, 9, 3, 7, 2 ]
.Węgiel , 62 bajty
Wypróbuj online! Link jest do pełnej wersji kodu. Staje wejście jest tablicą pary liczb, a kwadraty są ponumerowane
A1
,B1
...H8
(0-indeksowane) tak, na przykład, pierwszy sprawdzian będzie reprezentowane[[[1, 18], [57, 42], [18, 1], [42, 57], [1, 18], [57, 42], [18, 1], [42, 57]]]
i wyprowadza-
Jeżeli pozycja jest ciągnący powtórzeń. Program konwersji Wszystko w jednym. Wyjaśnienie:Podziel liczbę
23456432
na poszczególne cyfry. Reprezentują one białe kawałki.Dodaj pionki i puste rzędy. Białe pionki mają wartość,
1
a czarne pionki-1
.Dołącz negowaną kopię białych elementów, które reprezentują czarne kawałki.
Pętla nad ruchami.
Zapisz kopię planszy. (Cofanie to najbardziej golfowy sposób na skopiowanie planszy.)
Zaktualizuj cel za pomocą elementu źródłowego.
Usuń kawałek źródłowy.
Ustal, czy bieżąca pozycja była widoczna więcej niż raz.
źródło
C # (interaktywny kompilator Visual C #) , 204 bajty
Pobiera dane wejściowe jako listę krotek liczb całkowitych, gdzie pierwsza liczba całkowita oznacza miejsce, z którego należy się przenieść, a druga to miejsce, do którego należy się przenieść. 0 oznacza A1, 1 oznacza A2, a 63 oznacza H8.
Wypróbuj online!
źródło
Java (JDK) ,
246245244 bajtówWypróbuj online!
źródło