In einer fiktiven 2D-Welt kann ein Satz von 2D-Druckanweisungen für ein Objekt durch eine Liste von Ganzzahlen wie folgt dargestellt werden:
1 4 2 1 1 2 5 3 4
Jede Zahl steht für die Höhe des Objekts an diesem bestimmten Punkt. Die obige Liste wird beim Drucken in das folgende Objekt übersetzt:
#
# # #
# ###
## ####
#########
Wir füllen es dann mit so viel Wasser wie wir können, was dazu führt:
#
#~~~~#~#
#~~~~###
##~~####
#########
Wir definieren die Kapazität des Objekts als die Wassereinheiten, die das Objekt halten kann, wenn es vollständig gefüllt ist. in diesem Fall 11.
Genau genommen kann eine Wassereinheit ( ~
) genau dann an einem Ort existieren, wenn sie von zwei festen Blöcken ( #
) in derselben Reihe umgeben ist.
Herausforderung
Nehmen Sie eine Liste positiver Ganzzahlen als Eingabe (in einem beliebigen Format) und geben Sie die Kapazität des Objekts aus, das gedruckt wird, wenn die Liste als Anweisung verwendet wird.
Sie können davon ausgehen, dass die Liste mindestens ein Element enthält und alle Elemente zwischen 1 und 255 liegen.
Testfälle
+-----------------+--------+
| 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 |
+-----------------+--------+
quelle
Antworten:
Haskell, 54 Bytes
Die Ausdrücke
scanl1 max l
undscanr1 max l
berechnen das laufende Maximum der Liste vorwärts und rückwärts, dh das Profil des Wassers plus Land, wenn Wasser in eine Richtung fließen würde.Herkunft:
Links:
Recht:
Dann ist das Profil des Gesamtbildes das Minimum von diesen, was dort entspricht, wo das Wasser in keiner Richtung austritt.
Minimum:
Schließlich ist die Wassermenge die Summe dieser Liste, die sowohl Wasser als auch Land enthält, abzüglich der Summe der ursprünglichen Liste, die nur Land enthält.
quelle
Gelee, 10 Bytes
Während APL mehrere Klammern und J zwei Zeichen erfordert, ist der Algorithmus in Jelly wunderschön.
Probieren Sie es hier aus .
quelle
MATL , 14
Meine Matlab-Antwort wurde in MATL übersetzt. xnors Algorithmus.
Erläuterung
Y>
:cummax()
(Eingabe wird implizit auf den Stack gepusht)G
: Eingang drücken (erneut)P
:flip()
Y>
:cummax()
P
:flip()
2$X<
:min([],[])
(mindestens zwei Argumente)G
: Eingang drücken (erneut)-
:-
s
:sum()
quelle
Dyalog APL, 17 Bytes
Dies ist ein monadischer Zug, der das Eingabe-Array auf der rechten Seite übernimmt.
Der Algorithmus ist so ziemlich der gleiche wie der von xnor, obwohl ich ihn unabhängig gefunden habe. Es sucht nach dem Maximum in beiden Richtungen (rückwärts durch Umkehren des Arrays, Scannen und erneutes Umkehren) und findet das vektorisierte Minimum von diesen. Dann subtrahiert es das ursprüngliche Array und summiert.
Die andere Möglichkeit wäre, das Array an jedem Ort zu teilen, aber das ist länger.
Probieren Sie es hier aus .
quelle
+/⊢-⍨⌈\⌊⌈\⍢⌽
.Matlab, 47
Auch unter Verwendung von xnors Algorithmus.
quelle
MATLAB,
116113109106 BytesDies funktioniert, indem der höchste Punkt links gespeichert und beim Durchlaufen des nächsten Punkts der höchste Punkt rechts gefunden wird. Wenn der aktuelle Punkt kleiner als die beiden höchsten Punkte ist, wird die minimale Differenz zum kumulierten Volumen hinzugefügt.
Ungolfed-Code:
Das erste Mal, dass ich versucht habe, irgendetwas zu golfen, scheint MATLAB nicht das Beste zu sein, um es zu tun.
quelle
ES6, 101 Bytes
Ein weiterer Hafen von @ xnors Alghorithmus.
quelle
Python 2 , 68 Bytes
Probieren Sie es online!
quelle
Pip
-l
, 19 BytesNimmt Eingabenummern als Befehlszeilenargumente. Oder fügen Sie die
-r
Flagge hinzu, um sie als Standardzeilen zu verwenden: Probieren Sie es online aus!Erläuterung
Im Gegensatz zu allen anderen Antworten war es in Pip tatsächlich kürzer, die ASCII-Kunst zu konstruieren (eine modifizierte Version davon) und die Wassereinheiten zu zählen.
Wir beginnen mit
g
der Liste der Argumente.0Xg
Erzeugt eine Liste von Strings mit n Nullen für jedes n ing
.ZD1
Zippen Sie dann diese Zeichenfolgen zusammen, indem Sie1
Lücken in der resultierenden rechteckigen verschachtelten Liste ausfüllen:ST
konvertiert diese Liste in einen String. Das-l
Flag gibt an, dass Listen wie folgt formatiert sind: Jede verschachtelte Liste wird ohne Trennzeichen zusammengefügt, und auf der obersten Ebene ist das Trennzeichen Newline. So erhalten wir diese mehrzeilige Zeichenfolge - im Wesentlichen das Diagramm des Objekts, aber verkehrt herum:Wir finden dann alle Übereinstimmungen des regulären Ausdrucks
`0.*0`
. Dies passt zu den beiden äußersten Wänden und zu allem dazwischen in jeder Zeile.J
Fügt diese Zeichenfolgen zu einer großen Zeichenfolge zusammen und$+
summiert sie. Dabei wird die Anzahl1
s angegeben, die der Menge an Wasser entspricht, die das Objekt aufnehmen kann.quelle