Em um mundo 2D fictício, um conjunto de instruções de impressão 2D para um objeto pode ser representado por uma lista de números inteiros da seguinte maneira:
1 4 2 1 1 2 5 3 4
Cada número representa a altura do objeto naquele ponto específico. A lista acima se traduz no seguinte objeto quando impressa:
#
# # #
# ###
## ####
#########
Em seguida, enchemos com o máximo de água possível, resultando no seguinte:
#
#~~~~#~#
#~~~~###
##~~####
#########
Definimos a capacidade do objeto como unidades de água que ele pode reter quando completamente cheio; neste caso, 11.
A rigor, uma unidade de água ( ~
) pode existir em um local se e somente se estiver cercada por dois blocos sólidos ( #
) na mesma linha.
Desafio
Pegue uma lista de números inteiros positivos como entrada (em qualquer formato) e imprima a capacidade do objeto impresso quando a lista for usada como instruções.
Você pode assumir que a lista contém pelo menos um elemento e todos os elementos estão entre 1 e 255.
Casos de teste
+-----------------+--------+
| 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 |
+-----------------+--------+
fonte
Respostas:
Haskell, 54 bytes
As expressões
scanl1 max l
escanr1 max l
calculam o máximo de execução da lista lendo para frente e para trás, ou seja, o perfil da água mais a terra, se a água fluir em uma direção.Orig:
Esquerda:
Direita:
Então, o perfil da imagem geral é o mínimo destes, que corresponde a onde a água não vaza em nenhuma direção.
Mínimo:
Finalmente, a quantidade de água é a soma desta lista, que contém água e terra, menos a soma da lista original, que contém apenas terra.
fonte
Gelatina, 10 bytes
Enquanto o APL requer vários parênteses e J símbolos de dois caracteres, o algoritmo é bonito no Jelly.
Experimente aqui .
fonte
MATL , 14
Minha resposta do Matlab foi traduzida para o MATL. algoritmo do xnor.
Explicação
Y>
:cummax()
(a entrada é empurrada implicitamente na pilha)G
: pressionar entrada (novamente)P
:flip()
Y>
:cummax()
P
:flip()
2$X<
:min([],[])
(mínimo de dois argumentos)G
: pressionar entrada (novamente)-
:-
s
:sum()
fonte
Dyalog APL, 17 bytes
Este é um trem monádico que leva a matriz de entrada à direita.
O algoritmo é praticamente o mesmo que o xnor, embora eu o tenha encontrado de forma independente. Ele verifica o máximo nas duas direções (para trás, invertendo a matriz, digitalizando e invertendo novamente) e encontra o mínimo vetorizado daquelas. Em seguida, subtrai a matriz original e as somas.
A outra maneira de fazer isso seria dividir a matriz em cada local, mas isso é mais longo.
Experimente aqui .
fonte
+/⊢-⍨⌈\⌊⌈\⍢⌽
.Matlab, 47
Também usando o algoritmo do xnor.
fonte
MATLAB,
116113109106 BytesIsso funciona armazenando o ponto alto à esquerda e, enquanto itera em cada próximo ponto, encontra o ponto mais alto à direita. Se o ponto atual for menor que os dois pontos altos, ele adicionará a diferença mínima ao volume acumulado.
Código não destruído:
A primeira vez que tentei jogar golfe, o MATLAB não parece o melhor para fazê-lo ....
fonte
ES6, 101 bytes
Outra porta do algoritmo do @ xnor.
fonte
Python 2 , 68 bytes
Experimente online!
fonte
Pip
-l
, 19 bytesAceita números de entrada como argumentos de linha de comando. Ou adicione a
-r
bandeira para tomá-las como linhas de stdin: Experimente online!Explicação
Ao contrário de todas as outras respostas, em Pip era realmente mais curto construir (uma versão modificada) da arte ASCII e contar as unidades de água.
Começamos com
g
a lista de argumentos.0Xg
produz uma lista de cadeias de n zeros para cada n polg
.ZD1
depois fecha essas seqüências de caracteres, usando1
para preencher as lacunas na lista aninhada retangular resultante:ST
converte esta lista em uma string. O-l
sinalizador especifica que as listas são formatadas da seguinte forma: todas as listas aninhadas são unidas sem um separador e, no nível superior, o separador é uma nova linha. Portanto, obtemos essa sequência multilinha - essencialmente, o diagrama do objeto, mas de cabeça para baixo:Em seguida, encontramos todas as correspondências da regex
`0.*0`
. Isso corresponde às duas paredes mais externas e a tudo entre elas em cada linha.J
une essas cordas em uma grande e$+
soma, fornecendo o número de1
s - que é igual à quantidade de água que o objeto pode conter.fonte