Hintergrund
Ich habe ein paar alte und körnige Schwarzweißbilder. Einige von ihnen stellen Weinreben dar, die an einer Wand klettern, andere nicht - Ihre Aufgabe ist es, sie für mich zu klassifizieren.
Ein- und Ausgabe
Ihre Eingabe ist ein rechteckiges 2D-Array von Bits A , das in einem beliebigen geeigneten Format angegeben wird. Es wird nicht leer sein, aber es kann nicht garantiert werden, dass es sowohl Nullen als auch Einsen enthält. Das Array zeigt eine Rebe, wenn die folgenden Bedingungen erfüllt sind:
- Die unterste Reihe von A enthält mindestens eine 1. Dies sind die Wurzeln der Rebe.
- Jede 1 in A ist mit der unteren Reihe durch einen Pfad von 1s verbunden, der nur nach links, rechts und unten verläuft (nicht nach oben und nicht diagonal). Diese Wege sind die Zweige der Rebe.
Ihre Ausgabe ist ein konsistenter Wahrheitswert, wenn die Eingabe eine Rebe darstellt, und ansonsten ein konsistenter falscher Wert.
Beispiele
Dieses Array zeigt eine Rebe:
0 0 1 0 0 1
0 1 1 0 0 1
0 1 0 1 1 1
1 1 0 1 0 1
0 1 1 1 0 1
0 0 1 0 1 1
Diese Eingabe stellt keine Rebe dar, da sich in der Mitte des rechten Randes eine 1 befindet, die nicht durch einen Zweig mit den Wurzeln verbunden ist:
0 0 0 1 1 0
0 1 0 1 1 1
0 1 0 1 0 1
0 1 1 1 1 0
0 0 1 1 0 1
Das Array all-0 stellt niemals eine Rebe dar, das Array all-1 jedoch immer.
Regeln und Wertung
Sie können ein vollständiges Programm oder eine Funktion schreiben. Die niedrigste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig.
Testfälle
Wahrheitseingaben:
1
0
1
1
01
11
0000
0111
1100
1001
1111
1111
1111
1111
001001
011001
010111
110101
011101
001011
1011011
1001001
1111111
0100000
0111111
1111001
1001111
1111101
0000000
0011100
0010100
0011100
0001000
1111111
0001000
0011100
0010100
0010100
Falsche Eingaben:
0
1
0
10
01
000
000
000
011
110
000
111111
000000
101011
111001
010010
001000
000010
110001
001100
111111
110101
010011
111011
000110
010111
010101
011110
001101
11000000
10110001
10011111
11110001
01100011
00110110
01101100
01100001
01111111
quelle
Antworten:
Schnecken ,
251917 BytesProbieren Sie es online!
Erläuterung
Snails ist eine von Regex inspirierte 2D-Pattern-Matching-Sprache, die ursprünglich für unsere 2D-Pattern-Matching-Sprachdesign-Herausforderung entwickelt wurde .
Die
&
Hersteller versuchen das Muster von jeder möglichen Startposition aus und drucken es,0
oder1
je nachdem, ob das Muster in einem von ihnen fehlschlägt oder in allen übereinstimmt.Jetzt können Schnecken mit impliziten Klammern arbeiten, daher ist das Muster eine Abkürzung für Folgendes:
Das
,
verhält sich wie ein*
in Regex (dh null oder mehrmals übereinstimmen), wohingegen+
das gleiche wie in Regex (ein oder mehrmals übereinstimmen) ist. Also fangen wir damit an,\0z
so oft wie nötig abzugleichen, was einem einzelnen entspricht0
und erlauben es dann der Schnecke, ihre Richtung willkürlich mit zurückzusetzenz
. Dies erlaubt Nullen in der Eingabe, vorausgesetzt, eine gültige Weinstockzelle kann an einer anderen Stelle gefunden werden.Dann stimmen wir mit mindestens einem überein
\1dlr
, der mit einem einzelnen übereinstimmt,1
und lassen dann die Schnecke ihre Richtung entweder nach unten, links oder rechts zurücksetzen. Beachten Sie, dass1
wir nur diesen Teil abgleichen , wenn die Zelle, bei der wir begonnen haben, ein enthält . Grundsätzlich kann die Schnecke einen Weinstock von einem Ast bis zu den Wurzeln durchqueren.Schließlich müssen wir sicherstellen, dass wir den Boden erreicht haben, indem wir nach einer Zelle außerhalb der Grenzen (
~
) unten (d
) suchen .quelle
JavaScript (ES6), 135 Byte
Hinweis: Aufgrund der Einschränkungen des Integer-Typs können nur Reben mit einer Breite von bis zu 31 Zeichen verwendet werden. Erläuterung: Jede Zeile wird mit der benachbarten Zeile bitweise UND-verknüpft, um die Verbindungspunkte zu bestimmen. Anschließend wird die Zeile mit der
g
Funktion rekursiv horizontal erweitert, bis sie nicht mehr erweitert werden kann. Wenn beispielsweise zwei benachbarte Reihen sind ,1110111
und1011100
dann werden die Verbindungspunkte sind ,1010100
und dies wird dann ausgebaut1110110
und dann1110111
das feststellt , dann , dass die Reihe verbunden ist. Wenn dieg
Funktion fehlschlägt, wird Null zurückgegeben, wodurch auch alle nachfolgendeng
Funktionen fehlschlagen. Das Ergebnis ist dann falsch. Wenn dieg
Funktion erfolgreich ist, gibt sie die neue Zeile zurück, die dann durch die weitergegeben wirdreduce
, um die nächste Zeile zu testen.quelle
Python 2, 254 Bytes
Keine Bibliotheken
Beachten Sie, dass die Einrückungen der zweiten und dritten Ebene mit Tabulatoren in der Byteanzahl gebildet werden.
Probieren Sie es online aus
quelle
Wolfram - 254
Verbringen Sie etwas Zeit damit, diese Arbeit zu erledigen, also lasse ich sie einfach hier:
Grundsätzlich konstruiere ich ein Gitterdiagramm mit nach oben gerichteten Kanten, entferne Scheitelpunkte, die 0s entsprechen, und überprüfe, ob die unteren Scheitelpunktkomponenten alle Scheitelpunkte enthalten. Lächerlich, ich weiß ...
quelle
Python + NumPy
204202195 BytesErwartet
A
ein 2D Numpy Array.Nimmt die Matrix auf, füllt null Spalten links und rechts auf und glättet die Matrix.
s
ist eine Schablone, die auf das linke, rechte und untere Element zeigt. Die Schleife prüft jedes Element mit Ausnahme der letzten Zeile, ob es sich1
um ein Element handelt1
, und gibtFalse
ansonsten mindestens eine seiner Schablonen zurück . Überprüfen Sie anschließend, ob die letzte Zeile eine enthält1
.Zwei Testfälle für Sie:
Edit1:
1<0
ist kürzer alsFalse
Edit2:
flat
ist eine gute Alternativeflatten()
und Verwendung von Tabulatoren für die zweite Absicht in der Schleifequelle