Bei Eingabe einer ASCII-Kunst- "Straße" wird die Straße mit allen gekennzeichneten Sackgassen ausgegeben.
Dies ist eine Straße:
########.....######..#..###
#......#######....#..#..#.#
#.##......#...#####..#..###
#..#####..#....#..#######.#
#......#...#####.....##...#
#..###.#...#...###...#..###
##########.#..#..##..#.##.#
..#......#.######.#..#.#.#.
..#......#.#..#.#.#..#.#.#.
..######.###..##..#########
Dies ist die Straße mit den Sackgassen, die mit dem Buchstaben gekennzeichnet sind X
:
########.....######..X..###
#......#######....#..X..#.#
#.XX......X...X####..X..###
#..XXXXX..X....#..#######.#
#......X...#####.....##...#
#..###.X...#...###...#..###
##########.#..X..##..#.##.X
..X......#.#XXXXX.#..#.#.X.
..X......#.#..X.X.#..#.#.X.
..XXXXXX.###..XX..######XXX
Eine Sackgasse ist definiert als jedes Straßenplättchen, das an n andere Straßenplättchen grenzt , von denen mindestens n-1 nach dieser Regel bereits als Sackgasse gelten . "Angrenzen" erfolgt in den vier Hauptrichtungen, daher zählen diagonal angrenzende Kacheln nicht.
Diese Regel wird wiederholt angewendet, da neu erstellte Sackgassen selbst mehr Sackgassen erstellen können . Beachten Sie außerdem, dass jedes Straßenkärtchen, das nur an ein anderes Straßenkärtchen angrenzt, beim ersten Anwenden der Regel als Sackgasse eingestuft wird.
Eingabe und Ausgabe können entweder eine einzelne Zeichenfolge (mit durch ein beliebiges Zeichen getrennten Zeilen #
oder .
) oder ein Array / eine Liste / usw. Sein. Wenn Ihre Sprache dies unterstützt, können Sie auch Eingaben vornehmen, wobei jede Zeile ein Funktionsargument ist.
In Bezug auf die Eingabe können Sie Folgendes annehmen:
Es wird immer mindestens eine "Schleife" geben - das ist eine Gruppe von
#
Zeichen, der unendlich gefolgt werden kann. (Andernfalls würde jedes einzelne Plättchen eine Sackgasse werden.)Dies impliziert, dass die Eingabe immer 2 × 2 oder größer ist, da die kleinste Schleife:
## ##
(Was übrigens unverändert ausgegeben werden soll.)
Alle
#
Charaktere werden verbunden. Das heißt, wenn Sie eine Überflutung durchführen#
, sind alle davon betroffen.
Da es sich um Code-Golf , wird der kürzeste Code in Bytes gewinnen.
Das obige Beispiel und das winzige 2 × 2-Raster können als Testfälle verwendet werden (es gibt nicht viele Randfälle, die in dieser Herausforderung behandelt werden müssen).
'#
und"#"
anders in CJam?"#"
ist gleich['#]
.JavaScript (ES6),
110 bis109 Byte1 Byte gespart dank @ edc65 !
Erläuterung
Sehr einfache Herangehensweise an das Problem. Sucht nach jedem
#
und#
ersetzt es durch ein , wenn es weniger als 2 Sekunden um ihn herum gibtX
. Wiederholt diesen Vorgang so oft, bis garantiert ist, dass alle Sackgassen durchX
s ersetzt wurden.quelle
l=~r.search
anstelle von berechnenl=1+r.search
. (Nur 1 Byte gespeichert)Python (3.5)
362331329314 Bytesdanke an @Alissa. Sie hilft mir, ~ 33 Bytes zu gewinnen
Erklärungen
Funktionsdefinition
Fügen Sie einen Rand von '.' rechts und links von der Tafel
Fügen Sie einen Rand von '.' oben und unten
Lambda-Funktion zum Testen von '#'
Durchlaufen Sie die Eingabe, um sicherzustellen, dass wir keine Sackgassen vergessen
Schleife auf Spalten und Zeilen
Testen Sie, ob wir ein "#" in der Nähe und an der Position haben
Ersetze '#' durch 'X'
Schneiden Sie den Rand mit '.' und mach mit
Verwendung
quelle
split()
statt verwendensplitlines()
. 2)t=['.'*(c+2)]+['.'+i+'.'for i in s]+['.'*(c+2)]
ist kürzer. Und es kann noch mehr verkürzt werden:d='.';t=[d*c]+t+[d*c];t=[d+i+d for i in t]
3) Sie brauchen nicht alle Liste (zip (....)) Sache, verwenden Sieprint('\n'.join([''.join(i[1:-1])for i in t])
'str' object does not support item assignment
. Die Liste der Liste ermöglicht es mir, t [h] [x] = 'X'r
,g
undd
) aus Ihrer Funktion (erspart Ihnen einige tabellarische). Vielleicht hilft ein wenig Herumspielen von split ():t=[d+list(i)+d for i in s.split()]
Berechnen Sie dann die Längen, fügen Sie Punktlinien am Ende und am Anfang hinzu und ändern Sie dann Ihre Zyklen, um mit diesen erweiterten Längen zu arbeiten. Nicht sicher, ob es den Code verkürzen wird, aber es könnte