Biorąc pod uwagę wejście „drogi” w sztuce ASCII, wyjmij drogę z oznaczonymi wszystkimi ślepymi zaułkami.
To jest droga:
########.....######..#..###
#......#######....#..#..#.#
#.##......#...#####..#..###
#..#####..#....#..#######.#
#......#...#####.....##...#
#..###.#...#...###...#..###
##########.#..#..##..#.##.#
..#......#.######.#..#.#.#.
..#......#.#..#.#.#..#.#.#.
..######.###..##..#########
To droga z ślepymi zaułkami oznaczonymi literą X
:
########.....######..X..###
#......#######....#..X..#.#
#.XX......X...X####..X..###
#..XXXXX..X....#..#######.#
#......X...#####.....##...#
#..###.X...#...###...#..###
##########.#..X..##..#.##.X
..X......#.#XXXXX.#..#.#.X.
..X......#.#..X.X.#..#.#.X.
..XXXXXX.###..XX..######XXX
Ślepy zaułek jest zdefiniowany jako dowolny płytki drogi że granice n inne płytki drogowe, co najmniej n-1 które są uważane za martwe końce już od tej reguły. „Granice” są w czterech głównych kierunkach, więc płytki graniczące po przekątnej nie liczą się.
Zasada ta jest stosowana wielokrotnie, ponieważ nowo utworzone ślepe zaułki mogą same tworzyć więcej ślepych zaułków . Należy również pamiętać, że każdy kafelek drogi, który graniczy tylko z jednym innym kafelkiem drogi, jest uważany za ślepy zaułek przy pierwszym zastosowaniu reguły.
Dane wejściowe i wyjściowe mogą być albo pojedynczym łańcuchem (z wierszami oddzielonymi dowolnym znakiem, który nie jest #
lub .
), albo tablicą / listą itp. Jeśli twój język to obsługuje, możesz również pobierać dane wejściowe, a każdy wiersz jest argumentem funkcji.
Możesz przyjąć następujące założenia dotyczące danych wejściowych:
Zawsze będzie przynajmniej jedna „pętla” - grupa
#
znaków, którą można śledzić w nieskończoność. (W przeciwnym razie każdy kafelek stałby się ślepym zaułkiem.)Oznacza to, że wejście będzie zawsze 2 × 2 lub większe, ponieważ najmniejsza pętla to:
## ##
(Nawiasem mówiąc, powinno być generowane bez zmian.)
Wszystkie
#
postacie zostaną połączone. Oznacza to, że jeśli wykonasz wypełnienie powodziowe na którymkolwiek#
z nich, wpłynie to na wszystkie z nich.
Ponieważ tak jest code-golf , wygra najkrótszy kod w bajtach.
Powyższy przykład i mała siatka 2 × 2 mogą być użyte jako przypadki testowe (w tym wyzwaniu nie ma zbyt wielu przypadków brzegowych).
'#
i"#"
różnią się w CJam?"#"
jest równy['#]
.JavaScript (ES6),
110109 bajtów1 bajt zapisany dzięki @ edc65 !
Wyjaśnienie
Bardzo proste podejście do problemu. Wyszukuje każde
#
, a jeśli#
wokół niego są mniej niż 2 s, zastępuje je znakiemX
. Powtarza ten proces wiele razy, dopóki nie zostanie zagwarantowane, że wszystkie ślepe zaułki zostaną zastąpione przezX
s.źródło
l=~r.search
zamiastl=1+r.search
. (Zapisano tylko 1 bajt)Python (3.5)
362331329314 bajtówdzięki @Alissa. pomaga mi wygrać ~ 33 bajty
Objaśnienia
Definicja funkcji
Dodaj granicę „.” po prawej i lewej stronie planszy
Dodaj granicę „.” na górze i na dole
Funkcja lambda do testowania „#”
Zapętlaj długość wejściową, aby mieć pewność, że nie zapomnimy ślepych zaułków
Pętla na kolumnach i liniach
Sprawdź, czy mamy „#” wokół i na pozycji
Zamień „#” na „X”
Przytnij granicę wypełnioną „.” i dołącz w ciąg
Stosowanie
źródło
split()
zamiastsplitlines()
. 2)t=['.'*(c+2)]+['.'+i+'.'for i in s]+['.'*(c+2)]
jest krótszy. Można to jeszcze bardziej skrócić:d='.';t=[d*c]+t+[d*c];t=[d+i+d for i in t]
3) nie potrzebujesz całej listy (zip (....)), użyjprint('\n'.join([''.join(i[1:-1])for i in t])
'str' object does not support item assignment
. lista pozwala mi użyć t [h] [x] = 'X'r
,g
id
) ze swojego funkcji (oszczędza trochę tabulacji). Może może pomóc trochę zabawy przy split ():,t=[d+list(i)+d for i in s.split()]
a następnie oblicz długości, następnie dodaj kropki na końcu i na początku, a następnie zmień cykle, aby pracować z tymi długimi długościami. Nie jestem pewien, czy skróci kod, ale może