Kürzlich gab es ein paar ASCII Pet Snake Challenges (zB hier )
0 0
0 0 0 000
00 0 00 000 0 0
000 0 0 0 00
0 000
Diese Herausforderung besteht darin, eine zufällig erzeugte horizontale Haustierschlange (Höhe von fünf Linien, Länge von 30) zu nehmen und zu überprüfen, dass:
- Jede Spalte hat nur eine
0
- Jedes
0
ist mit dem0
Vorher und Nachher "verbunden" (vertikal nur durch 0 oder 1 Zeile getrennt)
Die fertige Ausgabe kann true
oder 1
wenn die Schlange gültig ist, oder false
oder , 0
wenn die Schlange ist ungültig
Bearbeiten - Erläuterung
Angenommen, die Eingabe:
- Ist eine Zeichenfolge
- Enthält nur '', '0' und '\ n'
- Hat genau 30 Zeichen pro Zeile
- Hat genau 5 Zeilen
Dh vergewissern Sie sich, dass die Schlange verbunden ist und keine streunenden Zeichen vorhanden sind. Die "Leinwand", auf der die Schlange gedruckt ist, muss nicht validiert werden.
code-golf
ascii-art
decision-problem
Mirror318
quelle
quelle
truthy/falsey
eher mittrue/false
?Antworten:
JavaScript (ES2018),
6254 BytesDie Eingabe ist eine einzelne Zeichenfolge:
Flag
s
bedeutet eine Punktübereinstimmung (einschließlich '\ n'). Diese Funktion wird derzeit von Chrome 63+, Opera 50+, Safari 11.1+ unterstützt und basiert auf der Kompatibilitätstabelle . Sie können diese Funktion mit diesem unterstützten Browser testen. Sie erhalten eine Ausnahme beim Laden der Seite, wenn Ihr Browser diese Funktion nicht unterstützt.Wie es funktioniert:
0
:/( .{30}){4} /
0
s in einer Spalte:/0.{30}(.{31})*0/
0
nicht mit seinen Nachbarn verbinden:/0.{60}(.{31})*0/
,/0.{62}(.{31})*0/
Füge all diese regulären Ausdrücke zusammen und du erhältst endlich diese.
Code-Snippet anzeigen
Dank Martin Enders darauf hinweisen, dass ein einzelner
!
Operator 8 Bytes einsparen kann.quelle
SnakeEx , 51 Bytes
Dies ist natürlich die richtige Sprache für die Aufgabe. : ^ D
Entspricht der gesamten Eingabe, wenn es sich um eine gültige Schlange handelt. stimmt nicht überein, wenn dies nicht der Fall ist. Probieren Sie es hier aus!
Erläuterung
SnakeEx ist eine 2-D-Pattern-Matching-Sprache . Ein Programm besteht aus einer Liste von Definitionen für "Schlangen", die die eingegebenen übereinstimmenden Zeichen durchsuchen, die Richtung ändern und andere Schlangen erzeugen. In unserem Programm definieren wir zwei Schlangen
s
undc
.Wir fangen damit an,
c
weil es einfacher ist. Die Definition ist0 *$
, was gut lesbar sein sollte, wenn Sie Regex kennen: match0
, gefolgt von null oder mehr Leerzeichen, gefolgt von der Kante des Gitters. Das Wichtigste dabei: Dieses Matching kann in jede Richtung gehen. Wir werdenc
sowohl aufwärts als auch abwärts von der Schlange aus verwenden, um zu überprüfen, ob0
in jeder Spalte keine zusätzlichen s enthalten sind.Nun zur Hauptschlange
s
. Es hat die Form(...)%{30}
, was bedeutet, dass "der Inhalt der Klammern 30-mal übereinstimmt" - einmal für jeden0
in der Schlange. So weit, ist es gut. Was steht in Klammern?Dies bringt eine neue
c
Schlange hervor, die um 90 Grad nach links gedreht wurde. Die Richtung ist relativ zur Richtung ders
Schlange, sodass sich die neue Schlange nach oben im Gitter bewegt (die Hauptschlange bewegt sich nach rechts). Diec
Schlange überprüft, ob die aktuelle Gitterzelle eine ist0
und ob jede Zelle darüber ein Leerzeichen ist. Wenn dies fehlschlägt, schlägt die gesamte Übereinstimmung fehl. Wenn es gelingt, machen wir weiterwas dasselbe tut, nur nach rechts gedreht (zum unteren Rand des Gitters).
Beachten Sie, dass diese Spawns die Position des Matchzeigers in der Hauptschlange nicht beeinflussen. Sie sind ein bisschen wie Lookaheads in Regex. (Vielleicht können wir sie hier als "Lookbesides" bezeichnen?) Nachdem wir überprüft haben, dass wir auf a zeigen
0
und der Rest der Spalte nur Leerzeichen enthält, müssen wir tatsächlich die0
folgenden Kriterien erfüllen :Jetzt befindet sich der Übereinstimmungszeiger auf dem Zeichen rechts von der
0
. Wir müssen drei verschiedene Optionen ankreuzen: die Schlangenwinkel nach unten, die Schlangenwinkel nach oben oder die Schlange geht geradeaus. Hierfür können wir einen OR-Ausdruck verwenden:In unserem OP haben wir drei Möglichkeiten:
Drehe dich nach rechts, finde ein Feld und drehe dich erneut nach links (Schlangenwinkel nach unten).
Drehe dich nach links, finde ein Feld und drehe dich erneut nach rechts (Schlangenwinkel nach oben).
Stimmen Sie mit 0 oder 1 Unterstrichen überein. Da die Eingabe keine Unterstriche enthält, handelt es sich immer um eine leere Übereinstimmung (Snake geht geradeaus).
Nachdem Sie eine der drei oben genannten Optionen ausgewählt haben, sollte der Übereinstimmungszeiger
0
auf die nächste Spalte zeigen, damit der Ausdruck in Klammern erneut übereinstimmt.quelle
CJam ,
3534 BytesProbieren Sie es online! Die Eingabe ist eine rechteckige Anordnung von Zeichenanordnungen. Nimmt an, dass die Eingabe nur
und enthält
0
.Erläuterung:
quelle
05AB1E , 18 Bytes
Probieren Sie es online!
Erläuterung
quelle
Schale , 12 Bytes
Je nach Regelklärung können dies 11 Bytes oder 13 Bytes sein .
Probieren Sie es online!
Die Eingabe ist eine Liste von Zeilen, die nur Leerzeichen und Nullen enthalten. Wenn eine einzelne Zeichenfolge erforderlich ist, stellen Sie
¶
diese dem Programm voran , um sie in Zeilen aufzuteilen. Die TIO-Verbindung tut dies aus Gründen der Übersichtlichkeit bereits. Ausgang ist 0 oder 1; Wenn falsche und wahrheitsgemäße Werte in Ordnung sind,±
können diese entfernt werden.Erläuterung
Damit soll
×≈
sichergestellt werden, dass (a) alle Spalten genau eine 0 enthalten und (b) sich ihre Positionen um höchstens eine unterscheiden. Betrachten Sie als Beispiel die 8-Spalten-EingabeZuerst
mηfT
wandelt sie in die Liste der IndexlistenDann
Ẋ×≈
gibtJedes
1
entspricht einem Paar von Indizes, die sich um höchstens 1 unterscheiden, und jedes0
entspricht einem Paar, das dies nicht tut. Jedes Ergebnis ist[1]
genau gleich , wenn beide Listen einen Index haben und sich die Indizes um höchstens 1 unterscheiden.quelle
Python 2 , 71 Bytes
Probieren Sie es online!
Übernimmt die Eingabe als mehrzeilige Zeichenfolge. Testet Koffer von Bubbler .
Die erste Spalte wird als
s[::31]
und die zweite als extrahiert unds[1::31]
auf Gültigkeit geprüft. Wir wiederholen dass
Entfernen des ersten Zeichens, wodurch aufeinanderfolgende Spaltenpaare überprüft werden.Die Prüfung für zwei Spalten verwendet Pythons Vergleichsverkettung,
in
um mehrere Prüfungen zu kombinieren:'0'in s[::31]
Überprüft, ob die erste Spalte mindestens eine enthält0
s[::31]in' %s '%s[1::31]
prüft, ob die erste Spalte eine Teilzeichenfolge der zweiten Spalte ist, die sich zwischen zwei Leerzeichen befindet, wodurch sichergestellt wird, dass sich die Position von0
höchstens um ein Leerzeichen verschoben hat' %s '%s[1::31]in'%6s'%0*2
prüft, ob die zweite Spalte höchstens eine enthält0
.Das Ende
*f(s[1:])
zwingt auch den rekursiven Fall, wahr zu sein.quelle
C (gcc) ,
246245232215212 BytesProbieren Sie es online!
Dachte mir, ich würde meine Lieblingssprache dazu nehmen (auch wenn ich aus den vielen anderen, kleineren Einträgen ersehen kann, dass es für diese Art von Herausforderung wahrscheinlich alles andere als ideal ist) und C, was ich schaffen könnte. Die Herangehensweise des Programms an das Problem ist relativ unkompliziert, nur mit viel Byte-Penny-Pinching. es nimmt die Schlange auf stdin und gibt ihr Ergebnis in den Rückgabewert von main (also den Exit-Code;
Wie im Problem angefordert, bedeutet 0 eine ungültige Schlange und 1 eine gültige, auch wenn der Exit-Code seltsam istwie für Exit-Codes typisch 0 ist eine gültige Schlange und 1 ist eine ungültige Schlange). Mit den erweiterten Makros und ein paar schönen Leerzeichen sieht es ungefähr so aus:Eingabezeilen werden in die erste Zeile des Puffers eingelesen, die nächsten fünf dienen zum Verfolgen, an welchen Stellen nach jeder aktuellen Null Nullen erwartet werden (read: must), und die letzte dient zum Verfolgen, ob bereits eine Null vorhanden ist wurde in einer bestimmten Spalte in einer beliebigen Zeile gelesen. Das Programm verarbeitet nacheinander jede Zeile.
Es ist überhaupt nicht robust (
gets()
ist nur der Anfang) und die Eingabe muss alle relevanten Leerzeichen enthalten (z. B. kein abschließendes Leerzeichen), und gcc gibt Warnungen und Hinweise zur implizit deklarierten stdlib-Funktionalität aus und so weiter, aber C das Leben.Es wird auch vorausgesetzt, dass sich der Schlangenkopf nicht in der mittleren Reihe befinden muss und dass eine gültige Schlange mindestens eine Null in jeder Reihe haben muss (dh keine Reihen aller Leerzeichen in den 5 Eingangsreihen). Wenn letzteres keine Anforderung ist, kann es etwas kürzer gemacht werden - alles, was mit
k
undl
im Programm zu tun hat , kann in diesem Fall durch weniger Code-Bytes ersetzt werden.Dank an user202729 für ca. 26 Bytes gespeichert.
quelle
#define F
und)
für -1 Byte weglassen.\n
(10),<space>
(32) und0
(48) enthält, können Sie auch==48
mit>47
(-1 Byte) nachsehen. / Sie können das={0}
beim Initialisieren entfernen,b
wenn die Variable global ist. Ebenso machtk
globale undi
ein (nicht typisiert ->int
) Parametermain
(anstelle vonargc
denen1
).i
wieargc
ist Genie). Erste Entwürfe hierfür waren weit über 400 Bytes; Ich habe lange genug gebraucht, um es auf meine persönlichen Ziele von 300 und 256 zu bringen. Es gibt also möglicherweise mehr Möglichkeiten, es zu reduzieren, die ich verpasst habe.k
,j
undl
alle Globalen zu sparen, separateint
Deklarationen zu haben, wurde mir klar, dass die Standardeinstellungen es mir erlauben würden, den Typ komplett auszuschalten. Danke noch einmal!MATL ,
1817 BytesDie Eingabe ist ein 2D-Zeichen-Array. Für die Schlange kann jedes beliebige Nicht-Leerzeichen verwendet werden.
Probieren Sie es online!
Erläuterung
quelle
un30=
überprüfe damit, ob alle Spaltenindizes unterschiedlich sind und keine der 30 Spalten leer ist. Vielleicht kann ich das direkter testen, aber ich verstehe nicht, wieBeleg , 28 Bytes
Teste es hier.
quelle
Jelly , 19 Bytes
Probieren Sie es online!
-2 Bytes dank Mr. Xcoder
Erläuterung
Die Eingabe erfolgt als Liste von Zeichenfolgen
quelle
Jelly , (14? *) 13 Bytes
Eine monadische Verknüpfung, die eine Liste mit fünf Zeichenfolgen * mit einer Länge von jeweils 30 aus Leerzeichen und anderen Zeichen (z. B.
0
s) erstellt und eine Ganzzahl zurückgibt (1, wenn eine Schlange definiert ist, 0, sonst).* Wenn die Eingabe eine einzelne Zeichenfolge (Liste von Zeichen) sein muss, stellen Sie a voran
Ỵ
, um die Zeichenfolge bei Zeilenvorschüben zu teilen.Probieren Sie es online!
Wie?
quelle
Stax , 20 Bytes CP437
24 Bytes beim Auspacken,
Online ausführen und debuggen!
Vielleicht nicht der beste Golfspieler, aber ich finde die Methode neu und interessant.
Erläuterung
quelle
J ,
38, 37,30 Bytes-8 Bytes dank FrownyFrog
Probieren Sie es online!
quelle
[:(-:*)2-/\
, überprüfen Sie, ob alle Unterschiede -1, 0 oder 1 sind.[:(#@{.=[:(-:*)2-/\])@:I.'0'=|:
[:($e.~[:(-:*)2-/\])@:I.'0'=|:
Gelee , 16 Bytes
Probieren Sie es online!
Es wird davon ausgegangen, dass die Eingabezeichenfolge immer nur Leerzeichen und Nullen enthält. Nimmt Eingaben als Liste von Zeichenfolgen (jede stellt eine Zeile dar) und gibt 1 aus, wenn dies wahr ist, andernfalls 0 .
Erläuterung
quelle
Python 2 , 141 Bytes
Probieren Sie es online!
Die Eingabe ist ein Zeichenraster.
quelle
Python 2 und Python 3 ,
122120119 BytesProbieren Sie es online!
Das Eingabeformat ist eine Zeichenfolge mit der Länge 154 (5 x 30 Zeichen, 4 Zeilenumbrüche):
Wenn der Kopf nicht die mittlere Reihe sein muss
Die Anforderung für den Kopf der mittleren Reihe war in der ursprünglichen Herausforderung enthalten, aber ich stellte fest, dass dies hier nicht der Fall ist (zumindest wird dies nicht explizit erwähnt).
Python 2 und Python 3 ,
124123 BytesProbieren Sie es online!
Bearbeiten:
==
) in Ungleichungen für jeden Code.all()
Trick in Py3 bedeutungslos wurde. Daher wurden beide Versionen zusammengeführt.quelle
Excel (VBA), 68 Byte
Verwenden des Direktfensters
Cell[A6]
als Ausgabe.quelle
Schnecken , 18 Bytes
Probieren Sie es online!
quelle
Schmutz ,
302623 BytesVielen Dank an Zgarb für das Speichern von 7 Bytes und das Hinweisen auf einen Fehler.
Probieren Sie es online!
quelle
Ruby , 93 Bytes
Probieren Sie es online!
quelle
JavaScript (Node.js) ,
128126 BytesBearbeitet nach der Eingabeerklärung, in der angegeben wird, dass die Eingabe "eine Zeichenfolge" ist.
Probieren Sie es online!
quelle
Python 3 ,
197185 BytesIn der Eingabeaufforderung tun
verify.py<snake.txt
oder in der Bash tuncat snake.txt | python verify.py
. Wosnake.txt
ist eine Datei mit einer zu überprüfenden Schlange?Wenn die Schlange korrekt ist, wird nichts ausgegeben. Wenn es nicht korrekt ist, wird Python einen Indexfehler auslösen.
quelle