Inspiriert von einem von Vi Harts Videos (ein Schatz voller potenzieller Herausforderungsideen)
Eine Schlange besteht aus Segmenten gleicher Länge und die Verbindung zwischen jedem Segment kann gerade sein oder eine 90 ° -Drehung ausführen.
Wir können eine solche Schlange (bis zu einer Drehung, die von der Anfangsrichtung abhängt) kodieren, indem wir die Richtung der Umdrehungen (Gerade / Links / Rechts) aufschreiben . Dieser beginnt oben links und zeigt nach rechts
-+ +--+ SR RSSR
| +-+ | S RSL S
+--+ --+ LSSL SSR
Würde durch das Rutschen vertreten sein SRSLSSLRLRSSRSRSS
Und natürlich kann sich eine planare Schlange nicht schneiden (wie in SSSSLLLSS
), was zu einem schrecklichen pixeligen Game Over führen würde.
Ihre Aufgabe ist es festzustellen, ob ein Slither gültig ist oder nicht (führt zu mindestens einer Selbstüberschneidung)
Eingang
Eine Zeichenfolge aus Buchstaben gemacht SLR
mit 2 < length < 10000
Output
Etwas truthy wenn es eine gültige schlittern und etwas Falsey ist , wenn es nicht.
Testfälle
__Valid__
SSLSLSRSRSSRSSSLLSSSRRLRSLRLLSSS
SRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRRSRLLRSRRLSLLRRLLSLRR (A hilbert curve)
RLLRSRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRRSRLLRSRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLSSLLRSRRLLRR
SRRSRSRSSRSSRSSSRSSSRSSSSRSSSSRSSSSSRSSSSSRSSSSSSRSSSSSSRSSSSSS (Spiral)
SSSSSSSSSSLSSSSSSSLSSSSSSSSLSSSSSLSSSSSSLSSSLLRRLLRRLLSLSSSRRSSSSRSSSRSSSSSSRSSSSSRSSSSSSSSRSSSSSSSRSSSSSSSSS (bigger, squigglier spiral)
LRSLLRLSRSLLSRLSLRSLSSSLRRSSLSRRLRSRLRLSLRLLRLRSSLSLRLRSRSSSSSLSRRLSLSSSRRLRLRLRLRRLLSSLSSSRRLRLRLRLRLSLSSSSSSSSSSSSSRLRLLRLRLRLRLRLRLRLSLSSSLSLSLL
__Invalid__
SRRLSLLRRLLSLRRSRLLRSRRLLRRSRLLLLRSRRLLRRSRLLRSRRLSLLRRLLSLRR
SRRLSLLRRLLSLRRSRLLRSRRLLSRSSSRSSSSSSSRSRSSSSSSSRRLLRRSRLLRSRRLSLLRRLLSLRR
SRRSRSRSSRSSRSSSRSSSRSSSSSSSSSSRSSSSRSSSSSRSSSSSRSSSSSSRSSSSSSRSSSSSS
SSSSSSSSSSLSSSSSSSLSSSSSSSSLSSSSSLSSSSSSLSSSLLRRLRLRRLLSLSSSRRSSSSRSSSRSSSSSSRSSSSSRSSSSSSSSRSSSSSSSRSSSSSSSSS
LRSLLRLSRSLLSRLSLRSLSSSLRRSSLSRRLRSRLRLSLRLLRLRSSLSLRLRSRSSSSSLSRRLSLSSSRRLRLRLRLRRLLSSLSSSRRLRLRLRLRLSLSSSSSSSSSSSSSRLRLLRLRLRLRLRLRLRLSLSSSLSLSLLSLRLSLRSLRSLRSLSLSLRSRLSLRSLRLSRSLLLRLRLRRRRSLSLSSLLSLSLSLSSLLSLSLLRLRSLLRSRLSLSSLLLLSSSSSSSSSSSSSSSSSSSSRLRLLRRLRLRLLRLRLRLRLRLSSSSLSLRLLRLSLSSLSLSLSLSLRLLRLSLLLSRSSSSSSSSSSSSSSSRLRLRLLRLRLSLSRSRSSSLSRLRLRLRSLSLSLSRLLSRLSLSLSLSLSSLSLSLLSLSRLLRLRLRLRLRLRLRLRLRLRLSLSRLRLSLLRRLSLLSLSLSLSLSLLSLSLSLRLRLRLRLRLRLRLRLRLRRLRSLSLSLSLSLSLSLSSLSSSSSLSLSSSLSLSLSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS
Sie können die Slithers hier zeichnen (R und L sind gespiegelt, aber es hat keinen Einfluss auf die Gültigkeit)
quelle
SRRR
auf Millimeterpapier mit einem Quadrat pro Segment zeichnen, überlappt es sich und ist daher ungültig, belegtRRR
jedoch genau ein 2x2-Quadrat ohne Überlappungen (genau wie im klassischen Spiel)Antworten:
Pyth,
22 bis20 BytesProbieren Sie es aus oder führen Sie die Testsuite aus .
Beachten Sie die ASCII-Werte von SRL bzw. 83, 76, 82. Ich missbrauche die Tatsache, dass:
Von hier aus behalte ich nur eine Variable für die aktuelle Position und die aktuelle Richtung. Für jedes Zeichen multipliziere ich die aktuelle Richtung mit der obigen komplexen Zahl und addiere sie dann zur aktuellen Position.
Am Ende überprüfe ich, ob alle besuchten Positionen eindeutig sind.
quelle
CJam, 30 Bytes
Erklärung folgt in Kürze.
Probieren Sie es hier online aus oder führen Sie die gesamte Suite aus .
quelle
S
, bedeutet das, dass die Schlange bereits sowohl (0,0) als auch (1,0) belegt hat?JavaScript (ES6), 84
89Führen Sie zum Testen das Snippet in Firefox aus.
Einige Notizen:
undefined
. Beim ersten Besuch ändert der Tilde-Operator den Wert in -1, was der Wahrheit entspricht. Schließlich ändert sich der Wert bei einem zweiten Besuch auf 0, was falsch ist und dieevery
Schleife endet , wenn false zurückgegeben wird.quelle
TI-BASIC,
49 56 5351 BytesÄhnlich wie bei orlp wird eine Liste aller Punkte in der komplexen Ebene erstellt, die von der Schlange besucht werden, beginnend mit dem Ursprung. Wenn die Liste keine doppelten Elemente enthält, gibt der Code einen positiven Wert zurück. Beachten Sie, dass der Taschenrechner bei einer Zeichenfolge mit mehr als 999 Elementen keine ausreichend lange Liste generieren kann und eine Fehlermeldung ausgibt.
BEARBEITEN: Zwei Bytes auf Kosten der Hässlichkeit gespart, da keine zwei Gitterpunkte auf der komplexen Ebene den gleichen Abstand von e ^ i haben können.
quelle
TI-BASIC,
6058 BytesEdit: Ignoriere alles unten: Eine funktionierende Ti-Basic-Lösung ist hier , von Thomas-Kwa. Stimmen Sie dem zu!
⁻
ist der[(-)]
Schlüssel, und Ans ist[2ND]->[(-)]
. Führen Sie es aus, indem Sie die Anweisungen der Schlange in Anführungszeichen ([ALPHA]->[+]
) setzen, gefolgt von einem Doppelpunkt und dem Namen des Programms. Wenn Sie beispielsweise das Programm "SNAKE" nennen, führen Sie den Testfall im OP als aus"SRSLSSLRLRSSRSRSS":prgmSNAKE
.Bearbeiten: Scheitert an
SRRLSLLRRRS
. Ich habe eine überarbeitete Version mit 61 Bytes, aber sie schlägt beim ersten ungültigen Testfall fehl:Ich werde versuchen, morgen zu reparieren.
Update: also das Problem ist eigentlich, dass mein Algorithmus fehlerhaft ist. Wenn ich eine For (Schleife im Gegensatz zu seq ((um das Gleiche zu erreichen)) verwendet hätte, könnte sie (eigentlich beide oben genannten Algorithmen) folgendermaßen beschrieben werden:
Dies scheitert jedoch an ungültigen Slithern wie
SRLRLRLRLRRRSS
. Ich werde jetzt versuchen, einen besseren Algorithmus zu finden ... oder aus einer anderen Antwort zu stehlen.Ich bin zu 90% sicher, dass dies durch einen einzigen
seq(
Befehl ersetzt werden kann, aber im Moment ist dies so klein, wie ich es bekommen kann. Wenn Sie beabsichtigen, dies mit Sourcecoder auf ein 8xp- Format umzustellen, anstatt es tatsächlich einzutippen , beachten Sie, dass das Bit≠
durch!=
und das⁻1+
Bit durch ersetzt werden sollte~1+
.quelle
Ruby 87
89Online-Test: http://ideone.com/pepeW2
Ungolfed-Version:
quelle
Golfscript 48
49 50Erwartet, dass die Zeichenfolge auf dem Stapel vorhanden ist, und gibt entweder
0
oder zurück1
.Sie können es online mit Tests für gültige und ungültige Schlangen versuchen .
Dies ist im Grunde die gleiche Idee wie in meiner Ruby-Antwort . Lediglich das Richtungsarray wird unterschiedlich behandelt, da AFAIK Golfscript keine Arary-Rotate-Funktion besitzt. In diesem Fall erstelle ich ein ausreichend großes Richtungsarray, indem ich es 10000-mal multipliziere und dann von Anfang an 0, 1 oder 3 Elemente abschneide, je nach aktuellem Befehl (S, R oder L). Die aktuelle "Richtung", in die verschoben werden soll, ist immer das erste Element im Array.
Hier ist es mit Kommentaren:
Bearbeiten:
1 Zeichen gespart, indem geändert wurde, wie das Array "directions" verbraucht wird.
Bearbeiten:
1 Zeichen durch Verschieben von Schritten von 10 anstelle von 1 gespeichert, um die
?
(Power-) Syntax zu verwenden.quelle