W tym wyzwaniu otrzymasz mapę dwuwymiarowego terenu widzianego z boku. Niestety niektóre części terenu unoszą się w powietrzu, co oznacza, że spadną. Twoim zadaniem jest przewidzieć, gdzie wylądują.
Wejście
Twoje dane wejściowe to jeden lub więcej ciągów oddzielonych znakiem nowej linii o równej długości, zawierających tylko znaki #
(znak liczbowy, oznaczający skałę) lub .
(kropka, oznaczająca puste miejsce).
Wyjście
Twoje dane wyjściowe mają ten sam format co dane wejściowe, ale z następującą modyfikacją. Zobaczmy łańcuch wejściowy jako dwuwymiarową siatkę skał. Każda skała na wejściu, która jest połączona z dnem siatki ścieżką sąsiednich skał, jest twarda ; inne skały są luźne . Skały przyległe po przekątnej nie są uważane za sąsiadujące. Wszystkie luźne skały spadną prosto w dół i wylądują jako stos na twardej skale lub w dolnym rzędzie. Luźne skały nie są ze sobą połączone, więc spadają indywidualnie, a nie jako duże formacje. Dane wyjściowe to wynikowa siatka.
Przykłady
Dane wejściowe
..###. .##.#. .#.... .##.#.
nie zawiera luźnych kamieni, więc wynik jest z nim identyczny.
Dane wejściowe
...#.. .#..#. .#..## .#...# .##### .#...#
zawiera jedną luźną skałę u góry, która spada na twardą skałę pod nią. Dane wyjściowe to
...... .#..#. .#..## .#.#.# .##### .#...#
Dane wejściowe
.#####.... .#....#### ###.###..# #.#...##.. .####..#.# ......###. ..#...#..# ..#...#..#
ma dużą grupę luźnych kamieni po lewej stronie. Grupa rozpada się, gdy skały spadają, więc wynik jest
.......... ....###### ..#.###..# . #...##.. .##....#.. .##...#### ####..#..# #####.#..#
Wyjaśnienia
- Możesz albo pobrać dane wejściowe ze STDIN, a dane wyjściowe do STDOUT, lub napisać funkcję.
- To jest golf golfowy, więc zwycięzcą jest najkrótszy program (w bajtach).
- Standardowe luki są niedozwolone.
Odpowiedzi:
CJam,
180 ... 133 101 ... 94 9087 bajtówGra w golfa jest zdecydowanie możliwa, ale chciałem opublikować ją po tym, jak całkowicie zacznie działać.Pobiera siatkę skał (utworzoną
.
i#
bez nowej linii) ze STDIN i drukuje dane wyjściowe do STDOUTAKTUALIZACJA : Wykorzystanie nieefektywnego, ale krótszego częściowego wypełnienia powodziowego w celu wykrycia twardych skał.
AKTUALIZACJA 2 : Zmieniono algorytm powodujący opadanie skał. Znacznie krótszy teraz!
AKTUALIZACJA 3 : Dokonałem kilku drobnych optymalizacji i ostatecznie udało mi się zmniejszyć liczbę bajtów do połowy oryginalnego kodu!
Jak to działa :
W przypadku wypełnienia zalewowego iterujemy razy całą długość siatki (siatki). W każdej iteracji gwarantujemy konwersję co najmniej 1,
#
który bezpośrednio dotyka spacji na(spację). Przestrzeń tutaj reprezentuje mocną grupę rockową. Zatem na końcu iteracji długości (siatki) gwarantujemy, że wszystkie twarde skały będą reprezentowane przez spacje.
Wypróbuj online tutaj
źródło
Perl 5: 98
98 w tym 2 flagi wiersza poleceń.
Wyjaśnienie:
źródło
JavaScript (ES6) 232
Jako funkcja z parametrem ciągu i zwracaniem ciągu.
Najpierw dodaj dolny wiersz „1”, aby zidentyfikować linię podłoża.
Pierwsze wyszukiwanie pętli dla ustalonych skał (które znajdują się w pobliżu „1”) i oznacza je również jako „1”. Wyszukiwanie jest powtarzane, dopóki nie zostaną znalezione twarde skały.
Druga pętla przesuwa pozostałe znaki „#” w kierunku dolnego rzędu. Ponownie, powtarza się to, dopóki nie można przenieść skały.
Na koniec zamień ponownie „1” na „#” i wytnij dolny rząd.
Mniej golfa
Test (możesz mieć dowód na to, jakie skały są twarde, a które spadły)
źródło
APL,
130119Ponieważ, o ile mi wiadomo, nie jest możliwe wprowadzanie nowych wierszy po wyświetleniu monitu, program ten przyjmuje macierz znaków jako dane wejściowe.
Zastosowany algorytm najpierw przekształca się w macierz binarną (
0
jest powietrzem i1
skałą), a następnie wypełnia zalew z dolnego rzędu, aby oznaczyć twarde skały jako2
. Następnie podziel każdą kolumnę na „przestrzenie między twardymi skałami” i uporządkuj każdą przegrodę, aby luźna skała „spadła” w powietrze.Edycja1: Grałeś w golfa przy użyciu innego algorytmu wypełniania zalewem
Testy przebiegają
Uruchom 1
Zdefiniuj matrycę znaków
A
i wydrukuje ją:Następnie wprowadź
A
do programu:Uruchom 2
źródło
JS - 443 bajty
Powódź wypełnia skały od dołu, a następnie spuszcza skały niewypełnione. Wykorzystuje dużo rekurencji z wypełnieniem powodziowym, więc może nieco opóźnić przeglądarkę.
To funkcja - nazwij to za pomocą
g("input")
JSFiddle: http://jsfiddle.net/mh66xge6/1/
Ungolfed JSFiddle: http://jsfiddle.net/mh66xge6/
źródło
Python 3, 364 bajty
Jestem pewien, że można by z tego wycisnąć więcej ... ale i tak nigdy nie będzie konkurować z CJamem i Perlem.
Podobne do innych odpowiedzi. Jednym dziwactwem jest to, że najpierw odwraca siatkę do góry nogami (aby uczynić indeksy pętlowe wygodniejszymi) i dodaje dodatkowy wiersz i kolumnę
.
(aby uniknąć problemów z zawijaniem-1
indeksów). Uruchom, dzwoniącP(string)
.źródło