Załóżmy, że ta siatka przestrzeni i X
reprezentuje przekrój niektórych dziwnie ukształtowanych pustych tac kostek lodu :
X X X
X X X XX X XX X
XXXXXX XXXXXXXXXXXXX
Kolumny bez X
przedstawiają dziury lub luki w tacach, które nie mogą pomieścić wody, spływając do nieskończonej pojemności. Woda spadająca z lewej lub prawej krawędzi kratki również trafia do tego niekończącego się zlewu.
Gdybyśmy umieścili kran nad tacami i pozwolili im napełnić się wodą, aż poziom wody we wszystkich przedziałach pozostanie stabilny, dokładne przedziały, które zostaną wypełnione, będą zależeć dokładnie od tego, gdzie strumień wody został umieszczony nad tacami. (Załóżmy, że cienki, stały strumień wody nie rozpryskuje się.)
Na przykład, jeśli nasz kran znajduje się F
powyżej bardzo lewej kolumny siatki
F
X X X
X X X XX X XX X
XXXXXX XXXXXXXXXXXXX
woda spadałaby do najwyższego poziomu X
w tej kolumnie i rozprzestrzeniałaby się w lewo i prawo, lewa połowa rozlewała się do zlewu poniżej, a prawa połowa wypełniałaby komorę 2 × 1. Gdy komora się zapełni, prawa połowa strumienia wody nie ma już przepływu, ale do zlewu, a poziom wody wszędzie jest zasadniczo stabilny.
Po wyłączeniu kranu taca wygląda teraz tak: (z ~
wodą)
X X X
X~~X X XX X XX X
XXXXXX XXXXXXXXXXXXX
Podobnie, jeśli umieścimy kran w ten sposób:
F
X X X
X X X XX X XX X
XXXXXX XXXXXXXXXXXXX
Wypełni dwa skrajne lewe przedziały, ale reszta wody odpłynie:
X X X
X~~X~X XX X XX X
XXXXXX XXXXXXXXXXXXX
Jeśli ustawimy kran w ten sposób:
F
X X X
X X X XX X XX X
XXXXXX XXXXXXXXXXXXX
Lewa połowa strumienia wpłynie do zlewu, ale prawa połowa ostatecznie wypełni trzy przedziały po prawej stronie, ponieważ nie ma ograniczeń co do odległości, jaką woda może przepłynąć poziomo na płaskiej powierzchni:
X X~X
X X X XX~X~~XX~~~X
XXXXXX XXXXXXXXXXXXX
Ustawiono jednak tak:
F
X X X
X X X XX X XX X
XXXXXX XXXXXXXXXXXXX
Cała woda odpływa i żadne przedziały nie są wypełnione:
X X X
X X X XX X XX X
XXXXXX XXXXXXXXXXXXX
Wyzwanie
Napisz program lub funkcję, która przyjmuje prostokątną siatkę odstępów X
, i jeden F
. Górny rząd zawsze będzie zawierał, F
a poza tym tylko spacje. W X
„e w każdej kolumnie (jeśli istnieją) będzie rozciągać się w linii ciągłej w górę od podstawy kraty, to znaczy nie będzie jaskiniach nawisy.
Wydrukuj lub zwróć siatkę po F
napełnieniu kranu wodą, ~
tak jak to opisano powyżej. Pozostaw górny F
wiersz poza wyjściem.
Siatka poza rzędem kranów będzie wynosić co najmniej 1 × 1
F X
to najmniejsze wejście, które potrzebujesz wesprzeć.
Dane wejściowe pojawią się jako pełny prostokąt tekstowy. Wiodące i końcowe spacje mają znaczenie na wejściu i wyjściu. np. wejście
F X X XXXX
powinno skutkować
X~~X XXXX
(zwróć uwagę na spacje wiodące i końcowe)
Posiadanie pojedynczej nowej linii na wejściu lub wyjściu jest w porządku.
Można używać cztery odrębne druku ASCII znaków zamiast przestrzeni,
X
,F
,~
.
Najkrótszy kod w bajtach wygrywa.
Duży przykład:
Wkład:
F
X X
X X X
X XXX X X X X X
X X XXXXXXX X XXX XXXXXXX X X
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXX
Wydajność:
X~~~~~~~~~~~~~X
X~~~~~~~~~~~~~X~X
X~~~~~~~~~~~~XXX~~~~~~~X~~~~X~X~~~~~~~~~~~X X
X~~~X~~~~~XXXXXXX~~~~~~X~~~~XXX~~~~~XXXXXXX X X
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXXXX
zip()
<3Odpowiedzi:
perl -p0, 204 + 2 bajty
POMYSŁ
X *X
es zX~*X
es na tej wyspie.X *X
esX~*X
es pomiędzy odpływem na dolnej stronie i punktem najbliższym F, który jest wyższy niż góra dolnej strony.Teren bezpośrednio poniżej F liczy się tutaj jako część obu stron.
GOLF
UWAGI
Może być trudno rozpoznać oryginalny algorytm w tej implementacji, ponieważ Perl nie obsługuje wyszukiwań o zmiennej długości.
źródło
Lua 5.2, 581 bajtów
Znowu powolny start z tak nieskutecznym językiem gry w golfa i nieefektywnym algorytmem. Ale poprawię :)
Przypadki testowe (ze źródłem wody):
z bash można przetestować w ten sposób, ale nie wygląda to tak ładnie:
źródło
JavaScript, 460 bajtów
Demo online (w konsoli, przetestowane w obecnych Chrome i Firefox).
Stawianie sobie wyzwań nie jest tak zabawne, ale wciąż możliwe. Ten sam algorytm co Lua, teraz w javascript.
źródło