Wprowadzenie
Doświadczeni golfiści przygotowali nas na potop . Obszary zagrożone zostały ewakuowane, a ludność przeniosła się na wyżyny.
Nie doceniliśmy powodzi (a być może wystąpił błąd w kodzie @ user12345). Niektóre obszary położone na dużych obszarach szybko zbliżają się do poziomu morza. Ściany muszą zostać wzniesione, aby zapewnić przetrwanie gęsto zaludnionych obozowisk. Niestety rząd ma ograniczoną podaż ścian.
Problem
Nasz scenariusz zagłady opisany jest dwoma liczbami w jednym wierszu, n
oraz m
. Po tej linii znajdują się n
wiersze z m
wartościami na wiersz, oddzielone tylko jedną spacją. Każda wartość będzie miała jeden z czterech znaków.
x
Nieprzekraczalny. Woda nie może tutaj płynąć. Nie można tutaj wznosić ścian.-
Nietrwały. Woda może przez to przepływać. Nie można tutaj wznosić ścian..
Stabilny. Woda może tutaj przepływać. Można tutaj wznosić ściany.o
Obozowisko. Woda może tutaj przepływać. Jeśli tak, wszyscy umierają. Nie można tutaj budować ścian.
Woda będzie płynąć ze wszystkich krawędzi mapy, chyba że krawędź jest nieprzejezdna lub ściana zostanie zbudowana na kafelku. Napisz program, który może wygenerować minimalną liczbę ścian wymaganą do ochrony obozowiska.
Przykładowe dane wejściowe
6 7
x . . x x x x
x . . x - - x
x . x x - - x
x . o o o - .
x . o o o - .
x x x x x x x
Przykładowy wynik
3
Założenia
- Woda płynie tylko ortogonalnie
- Obozowiska istnieją tylko jako jeden ciągły prostokątny blok na scenariusz
- Rozwiązanie zawsze będzie istnieć (chociaż może wymagać dużej ilości ścian)
- Obozowiska nie mogą być zlokalizowane na krawędzi, ponieważ wtedy scenariusz nie miałby rozwiązania
- 2
n
<<16 - 2
m
<<16 - Dane wejściowe można podać ze standardowego wejścia, odczytać z „city.txt” lub zaakceptować jako pojedynczy argument
Najkrótszy kod wygrywa!
Odpowiedzi:
Mathematica,
257253 znakówDane wejściowe są odczytywane z
"city.txt"
.Wyjaśnienie:
Mathematica ma wiele funkcji do obsługi wykresów.
Najpierw czytam dane z
"city.txt"
.Następnie tworzę wykres siatki z 'm' * 'n' wierzchołkami (
GridGraph@d[[1,{2,1}]]
) i dodam do niego „wierzchołek w nieskończoności”, który jest połączony z każdym wierzchołkiem na „krawędziach” wykresu. Z tego wierzchołka wypływa woda.I
o
,x
is
oznaczają pozycje „O”, „X” i „”. odpowiednio.Następnie dla każdego podzbioru
w
zs
(podzbiory są klasyfikowane według długości), usunąć wierzchołki wx
iw
zg
(VertexDelete[g,x⋃w]
), i znaleźć długość najkrótszej ścieżki z wierzchołka „w nieskończoność” do obozowiskao
. Jeśli długość wynosi nieskończoność, obozowisko będzie bezpieczne. Tak więc długość pierwszego takiegow
jest minimalną liczbą ścian wymaganych do ochrony obozowiska.źródło
C
827 799522Gra w golfa:
Dane wejściowe są podawane jako argumenty z wysokością i jako jako argumenty wiersza poleceń, a następnie siatka jest odczytywana jako pojedynczy ciąg znaków na standardowym
./a.out 6 7 < input
wejściu, podobnie jak: gdzie dane wejściowe są w tej formie (od lewej do prawej, od góry do dołu):"Czytelny":
Nigdzie nie jest tak krótkie jak rozwiązanie @Claudiu, ale działa niesamowicie szybko. Zamiast zalewać brzegi, znajduje obozowisko i działa na zewnątrz z tokenów „o”.
Przykładowe miejsca na ścianie:
źródło
@
). Próbowałem uruchomić kod sam, ale nie działałoPython,
553525512449414404387368 znaków (+4? Do wywołania)Miałem za dużo zabawy w golfa. Jest 82 bajtów większy, jeśli spróbujesz go skompresować! Teraz jest to miara zwartości i braku powtarzalności.
Poziomy wcięcia to spacja, tab.
Zastosowanie :
Czyta z
city.txt
:Wywołaj w następujący sposób:
Ma
2>X
to na celu ukrycie stderr, ponieważ program kończy działanie, zgłaszając wyjątek. Jeśli zostanie to uznane za niesprawiedliwe, dodaj 4 znaki do wywołania.Objaśnienie :
Prosta brutalna siła.
C
wykonuje zalanie i zwraca wartość true, jeśli trafi na obozowisko. Bez dodatkowych wypełnień, ponieważ prawidłowe ustawienie wypełnienia zajęło zbyt dużo miejsca.D
, biorąc pod uwagę zestaw ścian do wypełnienia, wzywaC
z każdego punktu na krawędzi, tak żeC
uwzględnia te ściany, drukuje długość i wychodzi, jeśli żaden z nich nie dotrze do obozowiska. Lista ścian służy również do śledzenia zalania, więc nie jest wymagane kopiowanie planszy! Zręcznie,C
dołącza również wszystkie znalezione puste miejsca do listy,S
więc funkcjaD
służy również do konstruowania listy pustych miejsc. Z tego powodu używamsum
zamiastany
, aby upewnić się, że wszystkie.
s są zbierane przy pierwszym uruchomieniu.Wzywam
D
jeden raz, a następnie skopiować listę pustych miejsc doZ
ponieważS
zachowa dołączany (nieefektywne, ale tańsze o liczbie znaków). Następnie używamitertools.combinations
do wybierania każdej kombinacji pustych miejsc, od 0 miejsc w górę. Przeglądam każdą kombinacjęD
i wypisuje ona długość pierwszej, która działa, zgłaszając wyjątek, aby wyjść z programu. Jeśli nie znaleziono odpowiedzi, nic nie jest drukowane.Zauważ, że obecnie program nie działa, jeśli nie są potrzebne ściany. Zajmą się tym +3 znaki; nie jestem pewien, czy to konieczne.
Zauważ też, że jest to
O(2^n)
algorytm, w którymn
jest liczba pustych miejsc. Tak więc, dla całkowicie pustej planszy 15x15 z jednym obozem pośrodku, zajmie to2^(15*15-1)
=2.6959947e+67
iteracje, co naprawdę potrwa bardzo długo!źródło
Groovy:
841805754Nie golfowany:
Jeszcze więcej golfa ...
Zwraca 2E9, jeśli nie ma rozwiązania.
źródło
Dyalog APL , 91 bajtów
⊃∊{1∊a[⍸×{(×d)∧s 3∨/3∨⌿⍵}⍣≡4=d←0@⍵⊢a]:⍬⋄≢⍵}¨c[⍋≢¨c←(,⍳2⊣¨b)/¨⊂b←⍸2=a←(s←(4,4,⍨⍉)⍣2)'xo.'⍳⎕]
zakłada
⎕IO=0
, używa funkcji z wersji 16.0 (@
i⍸
), czas działania jest wykładniczy w liczbie.
-s⎕
jest analizowane wejście, musi być macierzą znaków'xo.'⍳
zamień nax
0, nao
1, na.
2, a wszystkie inne na 3s←(4,4,⍨⍉)⍣2
funkcja otaczająca macierz 4sa←
przypisz macierz numeryczną otoczoną 4s do zmienneja
b←⍸2=
b
to lista par współrzędnych, w których znajdują się 2s (tj..
-s)(,⍳2⊣¨b)/¨⊂b
generuj wszystkie kombinacje elementówb
c[⍋≢¨c←...]
posortuj je według rozmiaru{... :⍬⋄≢⍵}¨
dla każdej kombinacji sprawdź coś i zwróć jego długość lub pustą listę⊃∊
pierwszy niepusty wynikd←0@⍵⊢a
d
jesta
z niektórymi elementami zastąpionymi przez 04=
stworzyć macierz boolowską - gdzie są 4? tj. granicę, którą dodaliśmy{...}⍣≡
stosuj tę funkcję,{}
aż wynik się ustabilizuje3∨/3∨⌿⍵
„boolean” lub „każdy element wraz z sąsiadami”s
wynik będzie mniejszy, więc ponownie stwórzmy granicę(×d)∧
zastosuj niezerowe elementyd
(nie-ścian) jako maskę logicznąa[⍸× ...]
coa
odpowiada 1 w naszej macierzy boolowskiej?1∊
czy są jakieś 1, czylio
obozowiska?źródło