Problem:
Im Schach gibt es eine bekannte Regel, nach der durch Wiederholung gezogen wird. Wenn dieselbe Position 3 Mal (oder öfter) wiederholt wird, kann der Spieler, der beabsichtigt, den Zug auszuführen, der diese Wiederholung verursacht, ein Unentschieden fordern.
Manchmal ist dies eine leichte Aufgabe für einen Schiedsrichter, wenn die letzten Züge nur die Spieler sind, die sich vorwärts und rückwärts bewegen. Manchmal ist es weniger trivial, wenn sich Teile signifikant zwischen wiederholten Positionen bewegt haben.
Das Problem bei dieser Herausforderung besteht darin, einen Wahrheitswert auszugeben, wenn die beanspruchte Position durch Wiederholung gezogen wurde (wurde dreimal oder öfter gesehen), und einen Falschwert, wenn die beanspruchte Position nicht durch Wiederholung gezogen wurde, wenn eine Liste von Bewegungen in Koordinatenschreibweise gegeben ist wie unten beschrieben oder eine beliebige Notation Ihrer Wahl (aber Sie müssen die Testfälle konvertieren).
Was ist eine Position?
In einem realen Szenario würde die Position von Dingen beeinflusst, z. B. ob ein Spieler eine Burg errichten kann oder ob ein En-Passant möglich ist. Sie sollten diese in Ihrer Lösung des Problems nicht berücksichtigen. In diesem Problem wird eine Position einfach durch die Konfiguration der Teile auf der Tafel definiert. Für die Zwecke dieses Problems werden also zwei Positionen als gleich angesehen, wenn jedes Quadrat auf beiden Brettern von demselben Teil derselben Farbe besetzt ist. Dies muss nicht das exakte Stück sein, zum Beispiel könnten die weißen Ritter Quadrate tauschen und wenn alle anderen Stücke die Kriterien erfüllen, wäre dies immer noch die gleiche Position.
Wie sieht eine gültige Notation aus?
Obwohl ich weiter auf die Koordinaten-Notation eingehen werde, steht es Ihnen frei, Eingaben durch ein von Ihnen gewähltes Notationssystem vorzunehmen. Unter der Vorraussetzung, dass:
- Jedes Element in der Notation beschreibt eines oder alle der folgenden Elemente: die beteiligten Elemente; ob Scheck, Schachmatt, Doppelscheck, Schachmatt oder Patt geliefert wurden; wenn eine unbegleitete Gefangennahme stattgefunden hat; die Ausgangsposition; die endgültige Position.
- Möglicherweise enthält Ihre Notation keine Informationen zur Wiederholung.
Solange diese Kriterien erfüllt sind, akzeptiere ich gerne, solange Sie in Ihrer Antwort angeben, Ihr Notationssystem. Dies können zB 0 indizierte Zeilen-, Spaltentupel sein oder was auch immer für Ihr Programm sinnvoll ist.
Koordinatenschreibweise
Die Koordinatennotation ist eine Notation, die lediglich die Bewegungen als Koordinatensystem beschreibt.
Eine Bewegung wird als erste Koordinate aus dem Satz {A1-H8}
und dann als Zielkoordinate erneut aus demselben Satz beschrieben. So würde das Königsgambit aussehen (als Sammlung von Streichern)
{"E2-E4","E7-E5","F2-F4"}
Ich glaube, es ist die beste Schreibweise für dieses Problem, da es nicht mit irrelevanten Informationen übersät ist, z. B. ob eine Prüfung stattgefunden hat oder welche Art von Stück sich bewegt. Wie bereits erwähnt, kann die Notation von Ihnen gewählt werden, Sie können also eine andere Notation verwenden, z. B. eine algebraische Notation, oder Sie können diese Notation anpassen (z. B. die Bindestriche entfernen oder als Liste von Tupeln verwenden).
Regeln:
- Sie sollten nicht berücksichtigen, ob eine Position oder Bewegung gültig ist, sondern nur, ob sie Wiederholungen verursacht
- Sie können davon ausgehen, dass keine Rochade- und Bauernförderung stattfindet.
- Sie sollten eine Liste von Zeichenfolgen als Eingabe und Ausgabe eines Wahrheits- oder False-Werts verwenden, der davon abhängt, ob die dritte (oder mehrere) Wiederholungen im letzten Zug stattgefunden haben
- Das Spiel beginnt immer an der Standardstartposition für Schach. Die Ausgangsposition kann zur Wiederholung angerechnet werden.
- Ein Draw durch Wiederholung ist nicht aufgetreten, wenn die Position durch den letzten Zug nicht wiederholt wird
Allgemeine Regeln:
- Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
Lassen Sie sich von Code-Golf-Sprachen nicht davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, für jede Programmiersprache eine möglichst kurze Antwort zu finden. - Für Ihre Antwort gelten Standardregeln mit Standard-E / A-Regeln. Daher dürfen Sie STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp, verwenden. Ihr Anruf.
- Standardlücken sind verboten.
- Fügen Sie nach Möglichkeit einen Link mit einem Test für Ihren Code hinzu (z. B. TIO ).
- Es wird außerdem dringend empfohlen, eine Erklärung für Ihre Antwort hinzuzufügen.
Testfälle
Sie sollten wahrheitsgemäße Werte zurückgeben für:
{"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"}
Und falsche Werte für:
{}
{"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"}
quelle
C6-B8
die Ausgangsposition dreimal aufgetreten.Antworten:
APL (Dyalog Extended) ,
5549474544 Byte SBCS-4 danke an ngn.
Volles Programm. Prompts für die Reversed Liste der Reversed Koordinatenpaare:
zB
{"B1-C3","B8-C6"}
ist[[[8,2],[6,3]],[[1,2],[3,3]]]
Probieren Sie es online! (Beinhaltet die Utility-Funktion,
Coords
die das OP-Format übersetzt)Richten Sie eine Liste von Staaten ein:
s←3
zuweisen drei biss
(für s tates)Da 3 kein gültiger Board-Status ist, hat dies keinen Einfluss auf unsere Wiederholungsanzahl und wir benötigen den Pass-Through-Wert der Zuweisung.
Erstellen Sie eine Schachbrett-Darstellung:
5
… Verwerfen, um die folgende abgeleitete Funktion zwischen 5 und 3 anzuwenden:⍥⍳
beide Argumente auf ihre Indexe erweitern;[1,2,3,4,5]
…[1,2,3]
,∘⌽
Die linke Seite verkettet mit der Rückseite der rechten Seite[1,2,3,4,5,3,2,1]
repräsentiert diese die Offiziere⍪
zu Tisch machen;[[1],
[2],
[3],
[4],
[5],
[3],
[2],
[1]]
6,
stellen Sie (zu jeder Reihe) sechs voran, die Bauern darstellen;[[6,1],
[6,2],
[6,3],
[6,4],
[6,5],
[6,3],
[6,2],
[6,1]]
⍉
transponieren;[[6,6,6,6,6,6,6,6],
[1,2,3,4,5,3,2,1]]
¯4↑
nimm negative (dh die letzten) vier (Zeilen), die mit Nullen aufgefüllt sind und leere Quadrate darstellen;[[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]]
(
…)
Wenden darauf folgende implizite Funktion an:-
negieren (dies stellt die entgegengesetzte Farbe dar);[[ 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]]
⊖⍪
stapeln Sie das umgedrehte Argument darüber und geben Sie uns die Vollpension;[[ 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]]
Erstelle eine Liste von Zügen, gefolgt vom Ausgangszustand:
⊂
füge das bei (um es als eine Einheit zu behandeln)⎕,
Fordern Sie die Liste der Züge an und stellen Sie diese vor den AusgangszustandReduzieren Sie * um eine Funktion, die den aktuellen Status an die Liste anfügt und einen Zug ausführt:
{
…}/
Reduzieren sich um folgendes anonymes Lambda:⍵
das richtige argument (der aktuelle stand)⊂
legen Sie es bei, um es als eine Einheit zu behandelns,←
In-Place Hängt es an die Liste der Bundesstaaten an⊃
offenbaren Sie es, um diesen Zustand zu verwenden...
@⍺
an den Elementen mit den beiden Koordinaten, die das linke Argument darstellt, setzen Sie:0
eine Null,,
gefolgt∘
vom⊃
ersten Wert,verschiebt den Wert an der ersten Koordinate effektiv zur zweiten Koordinate und hinterlässt eine Null
Überprüfen Sie, ob wir drei oder mehr Endzustände haben:
s∩
der Schnittpunkt aller Staaten mit diesem letzten; die Teilmenge der damit identischen Zustände≢
zähle sie auf2≤
prüfe, ob es zwei oder mehr gibt (dh drei oder mehr einschließlich des Endzustands)* APL ist rechtsassoziativ, daher wird die Funktion zuerst mit dem Anfangszustand als rechtes Argument und dem Anfangszug als linkes Argument aufgerufen, und das Ergebnis, der neue Zustand, wird mit dem zweiten Zug als neues linkes Argument zum neuen rechten Argument usw. Das Endergebnis ist die
quelle
\
anstelle von Reduzieren erheblich verkürzt werden kann/
⍳3⊣s←⍬
->⍳s←3
. es funktioniert, weil3
es kein gültiges Board ist, daher hat es keinen Einfluss auf die Wiederholungserkennung(0,⊃)@
->0,∘⊃@
R ,
180177144 BytesProbieren Sie es online!
-3 Bytes dank Giuseppe
-29 Bytes dank der Verwendung von Nick Kennedy
Reduce
und-rev(l)
-4 Bytes durch Umkehrung
z
Nimmt als Eingabe einen Vektor von ganzen Zahlen zwischen 1 und 64, der die Quadrate bezeichnet. Das TIO enthält eine Funktion zur Umwandlung in dieses Format. Die verschiedenen Teile werden als ganze Zahlen zwischen 1 und 6 und zwischen -1 und -6 gespeichert.
Erläuterung:
quelle
Reduce
im Kern eine Kumulierung . Es ist 148 Bytes.Jelly ,
4137 BytesProbieren Sie es online!
Ein monadischer Link, der die Eingabe als eine Liste von Paaren von 1-indizierten Zeilensprüngen verwendet
[from, to]
und eine 1 für Draws und eine 0 für Not zurückgibt.Beachten Sie, dass der Fußzeilencode auf TIO die vom OP gelieferten Bewegungen in das numerische Format übersetzt, aber gemäß der Diskussion unter der Frage wäre das numerische Format eine gültige Eingabe gewesen.
Erläuterung
quelle
JavaScript (Node.js) ,
121111 Byte[sq0, sq1]
Gibt einen Booleschen Wert zurück.
Probieren Sie es online!
Wie?
Stücke
Die zur Identifizierung der Teile verwendeten Werte spielen keine Rolle, solange es einen eindeutigen Wert pro Teiletyp gibt.
Wir gebrauchen:
Vorstand und Ausgangsposition
'89ABCA981111111'
→ die 8 schwarzen Hauptfiguren, gefolgt von den ersten 7 schwarzen Bauern10n**32n
0x7e5196ee74377
→ alle weißen Stücke (bis2222222234567543
in Dezimalstellen)was in ... endet:
Verfolgen Sie die Positionen
Deshalb machen wir:
Kommentiert
quelle
Java 10,
336330287285282276 Bytes-11 Bytes dank @Arnauld durch den Wechsel
i%56<8?"ABCDECBA".charAt(i%56%7):i%48<16?1:0
zui%56<8?i%8*35%41%10%8+2:9>>i/16&1
.Eingabe als 2D-Array von Ganzzahlen, bei denena 1 = 0 , b 1 = 1 , . . . , h 8 = 63 (dh
{"E2-E4",...
ist[[12,28],...
).Probieren Sie es online aus.
Erläuterung:
Die Werte der Stücke nach dem Befüllen
A[i]=(i%56<8?i%8*35%41%10%8+2:9>>i/16&1)*(i/32*2-1)
sind:Probieren Sie es online aus.
quelle
java.util.Arrays.deepHashCode(A)
, aber anscheinend sind einige der Hashes noch irgendwie gleich (dh letzter Testfall hat-447346111=3
in der Karte ..) , wenn ich die resultierende Karte vergleiche meine aktuellen Antwort und die daraus resultierende Karte mitdeepHashCode(A)
. Außerdem wäre es 3 Bytes länger als kürzer, da ichdeepHashCode(A)
zweimal verwenden muss (auch für den Ausgangszustand).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
sollte ein möglicher Ersatz für sein"ABCDECBA".charAt(i%8)
und 6 Bytes einsparen. Es erzeugt das Muster[ 2, 7, 3, 5, 9, 3, 7, 2 ]
.Holzkohle , 62 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Nimmt Eingaben als ein Array von Zahlenpaaren an, bei denen die Quadrate nummeriert
A1
sindB1
, ...H8
(0-indiziert), sodass beispielsweise der erste Testfall als dargestellt wird,[[[1, 18], [57, 42], [18, 1], [42, 57], [1, 18], [57, 42], [18, 1], [42, 57]]]
und gibt ein aus,-
wenn die Position durch Wiederholung gezogen wird. Konvertierungsprogramm. Alles in einem. Erläuterung:Teilen Sie die Nummer
23456432
in einzelne Ziffern auf. Diese repräsentieren die weißen Stücke.Fügen Sie die Bauern und die leeren Reihen hinzu. Die weißen Bauern haben Wert
1
und die schwarzen Bauern-1
.Fügen Sie eine negierte Kopie der weißen Teile hinzu, die die schwarzen Teile darstellen.
Schleife über die Züge.
Speichern Sie eine Kopie des Boards. (Das Umkehren ist die golfenste Art, das Board zu kopieren.)
Aktualisieren Sie das Ziel mit dem Quelltext.
Entfernen Sie das Quellstück.
Stellen Sie fest, ob die aktuelle Position mehrmals angezeigt wurde.
quelle
C # (Visual C # Interactive Compiler) , 204 Byte
Nimmt Eingaben als Liste von Tupeln von Ganzzahlen, wobei die erste Ganzzahl die Position ist, von der aus verschoben werden soll, und die zweite die Position, zu der verschoben werden soll. 0 stellt A1 dar, 1 ist A2 und 63 ist H8.
Probieren Sie es online!
quelle
Java (JDK) ,
246245244 BytesProbieren Sie es online!
quelle