Dans un monde 2D fictif, un ensemble d'instructions d'impression 2D pour un objet peut être représenté par une liste d'entiers comme suit:
1 4 2 1 1 2 5 3 4
Chaque nombre représente la hauteur de l'objet à ce point particulier. La liste ci-dessus se traduit par l'objet suivant lors de l'impression:
#
# # #
# ###
## ####
#########
Nous le remplissons ensuite avec autant d'eau que possible, ce qui se traduit par:
#
#~~~~#~#
#~~~~###
##~~####
#########
Nous définissons la capacité de l'objet à être les unités d'eau que l'objet peut contenir lorsqu'il est complètement rempli; dans ce cas, 11.
À strictement parler, une unité d'eau ( ~
) peut exister à un endroit si et seulement si elle est entourée de deux blocs solides ( #
) dans la même rangée.
Défi
Prenez une liste d'entiers positifs en entrée (dans n'importe quel format) et affichez la capacité de l'objet imprimé lorsque la liste est utilisée comme instructions.
Vous pouvez supposer que la liste contient au moins un élément et que tous les éléments sont compris entre 1 et 255.
Cas de test
+-----------------+--------+
| 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 |
+-----------------+--------+
la source
Réponses:
Haskell, 54 octets
Les expressions
scanl1 max l
etscanr1 max l
calculent le maximum courant de la liste en lisant vers l'avant et vers l'arrière, c'est-à-dire le profil de l'eau plus la terre si l'eau allait couler dans une direction.Orig:
La gauche:
Droite:
Ensuite, le profil de l'image globale est le minimum de ceux-ci, ce qui correspond à l'endroit où l'eau ne fuit dans aucune direction.
Le minimum:
Enfin, la quantité d'eau est la somme de cette liste, qui contient à la fois l'eau et la terre, moins la somme de la liste d'origine, qui ne contient que la terre.
la source
Gelée, 10 octets
Alors qu'APL nécessite plusieurs parenthèses et J symboles à deux caractères, l'algorithme est beau dans Jelly.
Essayez-le ici .
la source
MATL , 14
Ma réponse Matlab a été traduite en MATL. algorithme de xnor.
Explication
Y>
:cummax()
(l'entrée est implicitement poussée sur la pile)G
: pousser l'entrée (à nouveau)P
:flip()
Y>
:cummax()
P
:flip()
2$X<
:min([],[])
(minimum de deux arguments)G
: pousser l'entrée (à nouveau)-
:-
s
:sum()
la source
Dyalog APL, 17 octets
Il s'agit d'un train monadique qui prend le tableau d'entrée sur la droite.
L'algorithme est à peu près le même que xnor, bien que je l'ai trouvé indépendamment. Il recherche le maximum dans les deux directions (en arrière en inversant la matrice, en balayant et en inversant à nouveau), et trouve le minimum vectorisé de celles-ci. Ensuite, il soustrait le tableau et les sommes d'origine.
L'autre façon de procéder serait de diviser le tableau à chaque emplacement, mais c'est plus long.
Essayez-le ici .
la source
+/⊢-⍨⌈\⌊⌈\⍢⌽
.Matlab, 47
Utilisant également l'algorithme de xnor.
la source
MATLAB,
116113109106 OctetsCela fonctionne en stockant le point haut à gauche et, tout en parcourant chaque point suivant, trouve le point le plus haut à droite. Si le point actuel est inférieur aux deux points hauts, il ajoute la différence minimale au volume cumulé.
Code non golfé:
La première fois que j'ai essayé de jouer au golf, MATLAB ne semble pas le meilleur pour le faire en ....
la source
ES6, 101 octets
Un autre port de l'alghorithme de @ xnor.
la source
Python 2 , 68 octets
Essayez-le en ligne!
la source
Pip
-l
, 19 octetsPrend les nombres d'entrée comme arguments de ligne de commande. Ou ajoutez le
-r
drapeau pour les prendre comme lignes de stdin: Essayez-le en ligne!Explication
Contrairement à toutes les autres réponses, dans Pip, il était en fait plus court de construire (une version modifiée de) l'art ASCII et de compter les unités d'eau.
Commençons par
g
la liste des arguments.0Xg
produit une liste de chaînes de n zéros pour chaque n dansg
.ZD1
puis zippe ces chaînes ensemble, en utilisant1
pour combler les lacunes dans la liste imbriquée rectangulaire résultante:ST
convertit cette liste en chaîne. L'-l
indicateur spécifie que les listes sont formatées comme suit: chaque liste imbriquée est jointe sans séparateur et, au niveau supérieur, le séparateur est une nouvelle ligne. Nous obtenons donc cette chaîne multiligne - essentiellement, le diagramme de l'objet, mais à l'envers:On retrouve alors toutes les correspondances de l'expression régulière
`0.*0`
. Cela correspond aux deux murs les plus externes et tout ce qui les sépare sur chaque ligne.J
joint ces cordes en une seule grosse chaîne, et la$+
somme, donnant le nombre de1
s - qui est égal à la quantité d'eau que l'objet peut contenir.la source