Ein Labyrinth wird als Matrix von Nullen (Wände) und Einsen (begehbarer Raum) in einem beliebigen Format angegeben. Jede Zelle gilt als mit ihren vier (oder weniger) orthogonalen Nachbarn verbunden. Eine verbundene Komponente ist ein Satz von begehbaren Zellen, die alle transitiv miteinander verbunden sind. Ihre Aufgabe ist es, die Schnittpunkte zu identifizieren - begehbare Zellen, die, wenn sie zu Wänden werden, die Anzahl der verbundenen Komponenten verändern würden. Geben Sie nur an diesen Stellen eine boolesche Matrix mit 1-s aus. Das Ziel ist es, dies in den wenigsten Byte Code zu tun.
Die Eingabematrix besteht aus mindestens 3 Zeilen und 3 Spalten. Mindestens eine der Zellen ist eine Wand und mindestens eine ist begehbar. Ihre Funktion oder Ihr Programm muss in der Lage sein, eines der folgenden Beispiele in weniger als einer Minute auf TIO zu verarbeiten weniger als (oder auf Ihrem eigenen Computer, wenn die Sprache von TIO nicht unterstützt wird) zu verarbeiten.
in:
11101001
11011101
00000001
11101111
11110101
00011111
10110001
11111111
out:
01000000
00001001
00000001
00000101
00110000
00010000
00000000
11100000
in:
1111111111111111
1000000000000001
1111111111111101
0000000000000101
1111111111110101
1000000000010101
1011111111010101
1010000001010101
1010111101010101
1010101111010101
1010100000010101
1010111111110101
1010000000000101
1011111111111101
1000000000000001
1111111111111111
out:
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
in:
1011010001111010
1111111011101101
1110010101001011
1111001110010010
1111010000101001
0111101001000101
0011100111110010
1001110011111110
0101000011100011
1110110101001110
0010100111000110
1000110111011010
0100101000100101
0001010101100011
1001010000111101
1000111011000010
out:
0000000000111010
1011110001001000
0000000000000011
0000000100010000
0000010000101000
0000001000000100
0000000011000000
1001100000011110
0000000001000010
0110100001000110
0000100101000010
1000100000000000
0100001000000100
0000000100100001
0000010000111000
0000010000000010
Antworten:
Stax , 40 Bytes
Führen Sie Testfälle aus und debuggen Sie sie
Dieses Programm nimmt Eingaben als durch Leerzeichen getrennte Zeichenfolge entgegen, die Zeilen enthält. Die Ausgabe erfolgt im gleichen Format. Hier ist die entpackte ASCII-Darstellung.
Die grundlegende Operation zum Zählen einer Insel funktioniert so.
'1'
durch einen'2'
.'12|21'
durch'22'
.'1'
die Zeichenfolge kein a mehr enthält . Die Anzahl der Wiederholungen ist die Anzahl der Inseln..
Bonus 44-Byte-Programm - diese Version gibt im Rasterformat ein und aus.
quelle
MATL , 26 Bytes
Die Eingabe ist eine numerische Matrix mit
;
als Zeilentrennzeichen verwendet wird.Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
quelle
Perl 5 ,
-p0
10510196939089 BytesVerwendet
b
anstelle von1
in der Eingabe.Stellen Sie sicher, dass die Matrix auf STDIN mit einem Zeilenumbruch abgeschlossen ist
Probieren Sie es online!
Verwendet 3 Substitutionsstufen!
Diese 87-Byte-Version ist sowohl im Eingabe- als auch im Ausgabeformat einfacher zu interpretieren, konkurriert jedoch nicht, da sie drei verschiedene Zeichen in der Ausgabe verwendet:
Probieren Sie es online!
Es ist einfach, ein weiteres Byte (den regulären Ausdruck) zu speichern
s
Modifikator) in beiden Versionen indem ein anderes (nicht alphanumerisches) Zeichen als Zeilenabschlusszeichen (anstelle von Zeilenvorschub) verwendet wird. Dadurch ist die Eingabe jedoch wieder ziemlich unlesbar.Wie es funktioniert
Betrachten Sie die Substitution
Dies findet zwei Buchstaben, die horizontal oder vertikal nebeneinander liegen und ersetzt sie durch
c
. In einem Labyrinth, dessen Wege vollständig aus dem Buchstaben bestehenb
, passiert nichts, da die Buchstaben gleich sind, aber sobald einer der Buchstaben durch einen anderen ersetzt wird (z. B.z
), werden dieser Buchstabe und ein Nachbar durch einen anderen ersetzt,c
und die wiederholte Anwendung ist a Fülle die verbundene Komponente mitc
aus Samenz
.In diesem Fall möchte ich jedoch keine vollständige Überflutung. Ich möchte nur einen der benachbarten Arme ausfüllen
z
, also möchte ich nach dem ersten Schritt denz
verschwunden haben. Das funktioniert bereits mit demc$2c
Ersatz, aber ich möchte später eine Überflutung entlang eines anderen Arms ab dem gleichen Punkt neu starten, und ich weiß nicht, welcher der beidenc
s ursprünglichz
war. Also benutze ich stattdessenb | a
istc
,b | c
istc
undz | a
ist{
. In einem Labyrinth mit Pfaden ausb
und einem Samen wirdz
im ersten Schrittb
ersetzt durchc
undz
ersetzt durch,{
der kein Buchstabe ist und nicht übereinstimmt\w
und daher keine weiteren Füllungen verursacht. Das wirdc
jedoch eine weitere Überflutung am Laufen halten und ein Nachbararm des Samens wird gefüllt. ZB abIch kann dann alles c durch einen Nicht-Buchstaben (zB
-
) ersetzen und{
durchz
erneutes ersetzen , um die Überflutung neu zu starten:und wiederholen Sie diesen Vorgang, bis alle Nachbarn des Samens konvertiert wurden. Wenn ich dann nochmal
{
durch ersetzez
und fülle:Das
z
bleibt am Ende zurück, weil es keinen Nachbarn gibt, mit dem man eine Transformation machen kann. Das macht deutlich, was im folgenden Codefragment passiert:Finde den ersten Zeilenumbruch. Der Startoffset ist jetzt in
@-
Der oben diskutierte reguläre Ausdruck mit
@{-}
der Anzahl der Spalten (da plain@-
den Perl-Parser verwirrt und nicht richtig ersetzt)Das
/\n/
gelingt immer und die Substitution ist so lange wahr, wie wir uns noch überfluten können. Der Teil danach&&
wird also ausgeführt, wenn die Überflutung eines Arms erfolgt ist. Wenn nicht, ergibt die linke Seite eine leere ZeichenfolgeStarten Sie die Überflutung neu und geben Sie 1 zurück, wenn die vorherige Überflutung etwas bewirkt hat. Anderenfalls geben Sie die leere Zeichenfolge zurück. Dieses ganze Stück Code ist darin eingewickelt
Wenn dies also an einer Startzeichenfolge
$_
mit einemz
an der Startposition ausgeführt wird, wird der darin enthaltene Code mehrmals ausgeführt, wobei meistens nur ein Code zurückgegeben wird,1
wenn ein Nachbararm überflutet wird. Effektiv$_
zerstört und durch so viele ersetzt,1
wie angeschlossene Komponenten vorhanden sindz
. Beachten Sie, dass die Schleife bis zur Summe der Komponentengrößen und der Anzahl der Arme ausgeführt werden muss. Dies ist jedoch in Ordnung, da die Anzahl der Zeichen einschließlich der Zeilenumbrüche 2 + 1 beträgt.Das Labyrinth wird getrennt, wenn keine vorhanden sind
1
(leere Zeichenfolge, ein isolierter Scheitelpunkt) oder wenn mehr als 1 Arme vorhanden sind (mehr als 21
s). Dies kann mit dem regulären Ausdruck überprüft werden/\B/
(dies gibt0
anstelle von1
älteren Perl-Versionen. Es ist fraglich, welcher falsch ist). Wenn es nicht passt, wird leider eine leere Zeichenfolge anstelle von angezeigt0
. Dies:|.: code :seg
wurde entwickelt , um immer so eine ungerade Zahl zurückgeben , indem Sie ein&
mit/\B/
diesem geben0
oder1
.Alles, was übrig bleibt, ist das Gehen des gesamten Eingabearrays und bei jeder begehbaren Position den Samen mit
z
und Zählen der verbundenen Arme. Das geht ganz einfach mit:Das einzige Problem ist, dass in den nicht begehbaren Positionen der alte Wert beibehalten wird. Da wir
0
s dort benötigen , bedeutet dies, dass sich das ursprüngliche Eingabearray0
in den nicht begehbaren Positionen befinden muss und in der ursprünglichen Substitution0
übereinstimmt\w
und Überschwemmungen auslösen würde. Deshalb verwende ich\pL
stattdessen (nur Matchbuchstaben).quelle
Java 8,
503489459455 Bytes-18 Bytes dank @ceilingcat .
Erläuterung:
Probieren Sie es online aus.
quelle
Python 2 , 290 Bytes
Probieren Sie es online!
-11 Bytes dank Rod
-11 Bytes dank Lynn
quelle
F(m,i,j)
für jedes Element zu verwenden und spart 11 Bytesfor q in((i,j+1),(i,j-1),(i+1,j),(i-1,j)):
->for q in(i,j+1),(i,j-1),(i+1,j),(i-1,j):
- rm äußere parensF
implizit zurückgibtNone
, können SieF(m,i,j)or c
anstelle von verwenden[F(m,i,j)]and c
.and m[i][j]
kann sein>0<m[i][j]
, und[q[:]for q in m]
kann seineval(`m`)
.Wolfram Language (Mathematica) , 118 Byte
Probieren Sie es online!
quelle
Javascript 122 Bytes
Eingabe / Ausgabe als mehrzeiliger String.
Setzen Sie für jede begehbare Zelle einen Block und versuchen Sie, die 4 Nachbarzellen zu füllen. Wenn die aktuelle Zelle kein Schnittpunkt ist, werden alle von einem offenen Nachbarn aus gefüllt. Ansonsten benötige ich mehr als eine Fülloperation, um alle Nachbarzellen zu erreichen.
Weniger golfen
Prüfung
quelle