Dada uma lista de altura do horizonte inteiro não negativa, responda quantas pinceladas horizontais ininterruptas com 1 unidade de altura são necessárias para cobri-la.
[1,3,2,1,2,1,5,3,3,4,2]
, visualizado como:
5
5 4
3 5334
32 2 53342
13212153342
precisa de nove pinceladas:
1
2 3
4 5555
66 7 88888
99999999999
Exemplos
[1,3,2,1,2,1,5,3,3,4,2]
→ 9
[5,8]
→ 8
[1,1,1,1]
→ 1
[]
→ 0
[0,0]
→ 0
[2]
→ 2
[2,0,2]
→ 4
[10,9,8,9]
→ 11
Respostas:
JavaScript (Node.js) , 38 bytes
Experimente online!
Simplesmente um algoritmo ganancioso que escaneia da esquerda para a direita, apenas desenha linhas se necessário e desenha o maior tempo possível.
Obrigado Arnauld, economize
23 bytesfonte
05AB1E ,
8 75 bytesGuardado 2 bytes graças a @Adnan
Experimente online!
Quão?
Isso está usando o algoritmo encontrado pela primeira vez por @tsh . Se você gosta desta resposta, não deixe de votar também na resposta !
Cada vez que um arranha-céu é menor ou igual ao anterior, ele pode ser pintado 'de graça', simplesmente estendendo as pinceladas.
Por exemplo, pintar arranha-céusB e C na figura abaixo não custa nada.
Por outro lado, precisamos de duas pinceladas novas para pintar o arranha-céuE , independentemente de serem reutilizadas depois ou não.
Para o primeiro arranha-céu, sempre precisamos de tantas pinceladas quanto de pisos.
Transformando isso em matemática:
Se anexarmos à lista, isso poderá ser simplificado para:0 0
Comentado
fonte
0š¥ʒd}O
economiza um byte.ʒd}
porþ
deve economizar dois bytes.Python 3 , 37 bytes
Experimente online!
-5 bytes mudando para Python 3, graças a Sarien
Python 2 ,
474342 bytesExperimente online!
Alt:
Experimente online!
fonte
Haskell , 32 bytes
Experimente online!
Uma melhoria na solução de Lynn que rastreia o elemento anterior em
p
vez de olhar para o próximo elemento. Isso torna o caso base e a chamada recursiva mais curtos em troca da necessidade de chamar(0%)
.max(h-p)0
pode termax h p-p
o mesmo comprimento.fonte
Haskell , 35 bytes
Experimente online!
A linha 2 poderia ser
f[a]=a
se eu também não tivesse que lidar com o caso[]
.fonte
K (oK) ,
127 bytes-5 bytes graças a ngn!
Uma porta k (oK) da solução 05AB1E da Arnauld (e a solução JavaScript da tsh):
Experimente online!
J , 15 bytes
Porta AJ da solução 05AB1E da Arnauld (e solução JavaScript da tsh):
Experimente online!
Minha solução ingênua:
J , 27 bytes
Experimente online!
fonte
':
) usa um elemento de identidade implícito (0
for-
) antes da lista, portanto,0,
é desnecessário. você pode omitir{
x}
para torná-lo uma composição:+/0|-':
Some primitive verbs result in a different special-cased initial value: +, *, - and & are provided with 0, 1, 0 or the first element of the sequence, respectively
Haskell ,
3432 bytes2 bytes aparados por Lynn
Experimente online!
Então, para começar, temos
zipWith(-)
. Isso leva duas listas e produz uma nova lista de suas diferenças aos pares. Em seguida, combinamos comx
e(0:x)
.(0:)
é uma função que adiciona zero à frente de uma lista e, combinando-azipWith(-)
, obtemos as diferenças entre elementos consecutivos dessa lista com um zero na frente. Então nós zeramos todos os negativos(max 0<$>)
. Isso cria uma nova lista onde cada elemento é o número de novos traçados que devem ser iniciados em cada torre. Para obter o total, basta somar issosum
.fonte
g x=sum$max 0<$>zipWith(-)x(0:x)
é de 32 bytes :)sum.zipWith((max 0.).(-))<*>(0:)
.
tem precedência maior do que<*>
.Japonês , 8 bytes
-2 bytes de @Shaggy
Explicação
Experimente online!
fonte
mîT Õ¸¸è
A.y()
estofamento, a propósito.MATL , 8 bytes
Experimente online!
Praticamente o algoritmo de @ Arnauld. Salvou um byte (obrigado @LuisMendo) ao transmitir, em
uint64
vez de selecionar)
entradas positivas.fonte
Geléia , 5 bytes
Uma porta da minha resposta 05AB1E , que é semelhante à resposta @tsh JS .
Experimente online!
Comentado
fonte
Japonês ,
76 bytesTente
1 byte economizado graças a Oliver.
fonte
R , 30 bytes
Experimente online!
Portabilidade da solução @Arnauld, que por sua vez deriva da ótima solução @tsh
fonte
Retina 0.8.2 , 21 bytes
Experimente online! O link inclui casos de teste. Explicação:
Converta para unário.
Exclua todas as sobreposições da próxima torre, que não precisam de um novo golpe.
Conte os traços restantes.
fonte
Lisp comum,
8887 bytesnão minificado
Teste-o
Quando uma torre é pintada, são necessárias várias pinceladas iguais à sua altura. Essas pinceladas são traduzidas para todas as seguintes, as quais são indicadas aqui subtraindo a altura da torre atual de todas as outras torres (e ela mesma, mas isso não importa). Se uma torre a seguir for mais curta, ela será empurrada para um número negativo, e esse número negativo será subtraído das torres que se seguem (indicando pinceladas que não puderam ser traduzidas de uma torre anterior para as próximas). Na verdade, apenas subtrai o número de todas as alturas da torre, incluindo as anteriores, mas isso não importa, porque não olhamos para as anteriores novamente.
fonte
05AB1E ,
1310 bytesExperimente online ou verifique todos os casos de teste .
Explicação:
fonte
C # (compilador interativo do Visual C #) com sinalizador
/u:System.Math
, 47 bytesExperimente online!
Versão antiga, com sinalizador
/u:System.Math
, 63 bytesEu sinto que esta solução é mais elegante que a primeira. Ele percorre a matriz com uma tupla de dois valores como valor inicial, captando valores e armazenando o valor antes dele na segunda parte da tupla.
Experimente online!
fonte
Pitão, 8 bytes
Mais um exemplo da maravilhosa resposta de @ tsh . Toma a soma (
s
) dos valores positivos (>#0
) dos deltas (. +) Da entrada com 0 prefixado (+0Q
, Q à direita inferido).Experimente online aqui ou verifique todos os casos de teste de uma vez aqui .
Método de união de cadeias, 10 bytes
Esta foi a solução que escrevi antes de procurar as outras respostas.
Suíte de teste.
fonte
Clojure, 50 bytes
Experimente online! (Por que isso não imprime nada?)
fonte
Java (JDK) , 57 bytes
Experimente online!
Outro porto de TSH 's resposta Javascript . Portanto, verifique se você os votou positivamente.
Observe que eu usei subtração em vez de adição porque me permitiu escrever
(p=x)
como operando certo na mesma instrução.fonte
MATL ,
151413 bytesEntrada é um vetor de coluna, usando
;
como separador.Experimente online! Ou verifique todos os casos de teste .
Explicação
fonte
Perl 5, 21 bytes
TIO
Como
-p
+}{
+$\
truque//
corresponde à sequência vazia, para que, para a próxima linha, a pós-$'
correspondência contenha a linha anterior$\+=$_>$'&&$_-$'
acumular diferença entre a linha atual e a anterior se a corrente for maior que a anterior (também pode ser escrita$\+=$_-$' if$_>$'
, mas o perl não analisa$\+=$_-$'if$_>$'
o mesmo)fonte
Stax , 8 bytes
Execute e depure
Usa a abordagem amplamente usada da solução JavaScript da tsh.
fonte
Wolfram Language (Mathematica) , 34 bytes
Uma porta de @Arnauld da solução .
Experimente online!
fonte