In Chinese Checkers kann sich eine Figur bewegen, indem sie über eine beliebige andere Figur springt oder eine Folge solcher Sprünge macht. Ihre Aufgabe ist es, eine möglichst lange Abfolge von Hopfen zu finden.
Eingang
Eine Folge von 121 Nullen oder Einsen, die jeweils einen Platz auf einer Tafel darstellen. Eine Null bedeutet, dass der Ort leer ist. Eine Eins bedeutet, dass der Platz besetzt ist. Die Positionen sind von links nach rechts aufgelistet. oben nach unten. Zum Beispiel kann die Eingabe dieser Einstellung wäre
1011110011000001000000000000000000000000100000000001000000000000000000000000000001000000000000000000000001000001100111111
Erläuterung:
Der oberste Platz wird von einem grünen Stück belegt, die erste Ziffer in der Eingabe ist also
1
. Die zweite Reihe hat eine leere Position und dann eine besetzte Position, also01
kommt als nächstes. Die dritte Reihe ist alle besetzt, also111
. Die vierte Reihe hat zwei leere und zwei belegte Felder (von links nach rechts), also0011
. Dann kommen fünf0
, a1
und sieben0
für die nächste Reihe und so weiter.
Wie in dieser Konfiguration gibt es eine Ecke, die gerade nach oben zeigt. Es können beliebig viele Teile auf dem Brett liegen (von 1 bis 121). Beachten Sie, dass Stücke unterschiedlicher Farben nicht unterschiedlich dargestellt werden.
Ausgabe
Die maximale Länge eines legalen Hops, bei dem ein beliebiges Stück auf dem Brett verwendet wird. Sie dürfen denselben Ort nicht mehr als einmal besuchen (einschließlich der Start- und Endpositionen). Sie können jedoch mehr als einmal über dasselbe Stück springen. Wenn es keinen legalen Hop gibt, wird ausgegeben 0
. Überlegen Sie nicht, ob es einen legalen Non-Hop-Move gibt.
Die Ausgabe an das oben beschriebene Setup lautet beispielsweise 3
.
Die Ein- und Ausgabe kann über stdin und stdout, über Befehlszeilenargumente, über Funktionsaufrufe oder eine ähnliche Methode erfolgen.
Testfälle
Eingang:
0100000010000000000000000100000000000000000000000000000001010010000000000000000000000101000000000000000000100000000100001
Ausgabe: 0
(keine zwei Stücke liegen nebeneinander)
Eingang:
0000000000111100000000011100000000011000000000100000000000000000000000000000000000000000000000000000000000000000000000000
Ausgabe: 1
(Ersteinrichtung für einen Spieler in der oberen linken Ecke)
quelle
Antworten:
Perl,
345322Edit: Golf, leicht.
Weitere Testfälle wären nett, aber im Moment sieht es so aus, als ob es funktioniert. Ich werde später gegebenenfalls Kommentare hinzufügen. Mit Zeilenumbrüchen und Einrückung zur besseren Lesbarkeit:
quelle
C
262260Golfed Code (Debugging-Code und unnötige Leerzeichen entfernt. Von der Eingabe über stdin zur Eingabe über die Befehlszeile geändert und die Möglichkeit genutzt, die Variable i dort zu deklarieren. Letzte Änderung: Code in Klammern von
for
Schleifen verschoben , um zwei Semikolons zu speichern.)Erläuterung
Dies basiert auf einer 20x21-Karte, die wie folgt aussieht und beim Start des Programms anfänglich mit Nullen gefüllt ist (diese ASCII-Grafik wurde von einer modifizierten Version des Programms generiert, und wenn die
i
Schleife abwärts zählt, befindet sich Null in der unteren rechten Ecke):Die Schleife
i
durchläuft diese Tafel zweimal und verwendet x und y, um zu berechnen, ob ein Quadrat tatsächlich zum Schachbrett gehört oder nicht (dies erfordert 6 separate Ungleichungen in x und y).Wenn dies der Fall ist, füllt es beim ersten Mal die Felder und setzt ein
0
(falsch) für ein1
(besetzt) und ein1
(wahr) für ein0
(unbesetzt). Diese Umkehrung ist wichtig, da alle Felder außerhalb der Grenzen bereits eine 0 enthalten, was bedeutet, dass sie belegten Feldern ähneln und ohne eine spezielle Prüfung nicht angesprungen werden können.Wenn das Quadrat beim zweiten Mal besetzt ist (0 enthält), ruft es die Funktion auf
f
, die nach den Zügen sucht.f
Sucht rekursiv in den 6 möglichen Richtungen, die durch +/- 1 (horizontal), +/- 20 (vertikal) und +/- 19 (diagonal) codiert sind"AST?-,"[k]-64
. Wenn es einen Treffer findet, setzt es diese Zelle auf 0 (belegt), bevor es sich rekursiv selbst aufruft, und setzt sie dann auf 1 (leer) zurück, wenn die Funktion zurückgegeben wird. Der Zellenwert muss vor dem rekursiven Aufruf geändert werden, um zu verhindern, dass mehrmals in diese Zelle gesprungen wird.Ungolfed Code
quelle