W fikcyjnym świecie 2D zestaw instrukcji drukowania 2D dla obiektu może być reprezentowany przez listę liczb całkowitych w następujący sposób:
1 4 2 1 1 2 5 3 4
Każda liczba reprezentuje wysokość obiektu w tym konkretnym punkcie. Powyższa lista po wydrukowaniu tłumaczy na następujący obiekt:
#
# # #
# ###
## ####
#########
Następnie napełniamy go możliwie dużą ilością wody, co powoduje:
#
#~~~~#~#
#~~~~###
##~~####
#########
Definiujemy pojemność obiektu jako jednostki wody, które obiekt może utrzymać, gdy jest całkowicie pełny; w tym przypadku 11.
Ściśle mówiąc, jednostka wody ( ~
) może istnieć w miejscu tylko wtedy, gdy jest otoczona dwoma stałymi blokami ( #
) w tym samym rzędzie.
Wyzwanie
Weź listę dodatnich liczb całkowitych jako dane wejściowe (w dowolnym formacie) i wyświetl pojemność obiektu wydrukowanego, gdy lista jest używana jako instrukcja.
Możesz założyć, że lista zawiera co najmniej jeden element, a wszystkie elementy mają wartość od 1 do 255.
Przypadki testowe
+-----------------+--------+
| Input | Output |
+-----------------+--------+
| 1 | 0 |
| 1 3 255 1 | 0 |
| 6 2 1 1 2 6 | 18 |
| 2 1 3 1 5 1 7 1 | 7 |
| 2 1 3 1 7 1 7 1 | 9 |
| 5 2 1 3 1 2 5 | 16 |
| 80 80 67 71 | 4 |
+-----------------+--------+
Odpowiedzi:
Haskell, 54 bajty
Wyrażenia
scanl1 max l
iscanr1 max l
obliczają maksymalną liczbę odczytów listy do przodu i do tyłu, tj. Profil wody plus ląd, jeśli woda płynie w jednym kierunku.Orig:
Lewo:
Dobrze:
Profil ogólnego obrazu jest więc ich minimum, co odpowiada miejscu, w którym woda nie przecieka w żadnym kierunku.
Minimum:
Wreszcie ilość wody jest sumą tej listy, która zawiera zarówno wodę, jak i ziemię, pomniejszoną o sumę oryginalnej listy, która zawiera tylko ziemię.
źródło
Galaretka, 10 bajtów
Podczas gdy APL wymaga wielu nawiasów i dwuznakowych symboli J, algorytm jest piękny w galaretce.
Wypróbuj tutaj .
źródło
MATL , 14
Moja odpowiedź Matlaba przetłumaczona na MATL. algorytm xnora.
Wyjaśnienie
Y>
:cummax()
(dane wejściowe są domyślnie wypychane na stos)G
: push input (ponownie)P
:flip()
Y>
:cummax()
P
:flip()
2$X<
:min([],[])
(minimum dwa argumenty)G
: push input (ponownie)-
:-
s
:sum()
źródło
Dyalog APL, 17 bajtów
Jest to monadyczny ciąg, który bierze tablicę wejściową po prawej stronie.
Algorytm jest prawie taki sam jak xnor, chociaż znalazłem go niezależnie. Skanuje maksimum w obu kierunkach (wstecz poprzez odwrócenie tablicy, skanowanie i cofanie ponownie) i znajduje wektoryzowane minimum tych. Następnie odejmuje oryginalną tablicę i sumuje.
Innym sposobem na to byłoby podzielenie tablicy w każdej lokalizacji, ale to dłużej.
Wypróbuj tutaj .
źródło
+/⊢-⍨⌈\⌊⌈\⍢⌽
.Matlab, 47
Również przy użyciu algorytmu xnor.
źródło
MATLAB,
116113109106 bajtówDziała to poprzez zapisanie najwyższego punktu po lewej stronie i podczas iteracji przez każdy następny punkt znajduje najwyższy punkt po prawej stronie. Jeśli bieżący punkt jest mniejszy niż oba najwyższe punkty, dodaje minimalną różnicę do objętości skumulowanej.
Nieskluczony kod:
Za pierwszym razem, gdy próbowałem grać w golfa, MATLAB nie wydaje się najlepszy w ...
źródło
ES6, 101 bajtów
Kolejny port algorytmu @ xnor.
źródło
Python 2 , 68 bajtów
Wypróbuj online!
źródło
Pip
-l
, 19 bajtówPobiera liczby wejściowe jako argumenty wiersza poleceń. Lub dodaj
-r
flagę, aby wziąć je jako linie standardowe: Wypróbuj online!Wyjaśnienie
W przeciwieństwie do wszystkich innych odpowiedzi, w Pipie zbudowanie (zmodyfikowana wersja) sztuki ASCII i policzenie jednostek wodnych było krótsze.
Zaczynamy
g
od listy argumentów.0Xg
tworzy listę ciągów n zer dla każdego n wg
.ZD1
następnie zamyka te ciągi razem,1
wypełniając wszelkie luki w wynikowej prostokątnej liście zagnieżdżonej:ST
konwertuje tę listę na ciąg. W-l
Określa flag że listy są sformatowane w następujący sposób: każda lista zagnieżdżona jest połączone bez separatora, a na najwyższym poziomie separatorem jest znak nowej linii. Otrzymujemy więc ten ciąg multilinii - zasadniczo schemat obiektu, ale do góry nogami:Następnie znajdujemy wszystkie dopasowania wyrażenia regularnego
`0.*0`
. To pasuje do dwóch najbardziej zewnętrznych ścian i wszystkiego między nimi w każdej linii.J
łączy te ciągi razem w jeden duży ciąg i$+
sumuje je, podając liczbę1
s - równą ilości wody, którą może pomieścić obiekt.źródło