Dada una lista de altura del horizonte entero no negativo, responda cuántos trazos de pincel horizontal ininterrumpido de 1 unidad de altura se necesitan para cubrirlo.
[1,3,2,1,2,1,5,3,3,4,2]
, visualizado como:
5
5 4
3 5334
32 2 53342
13212153342
necesita nueve pinceladas:
1
2 3
4 5555
66 7 88888
99999999999
Ejemplos
[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
Respuestas:
JavaScript (Node.js) , 38 bytes
Pruébalo en línea!
Simplemente un algoritmo codicioso que escanea de izquierda a derecha, solo dibuja líneas si es necesario y lo dibuja el mayor tiempo posible.
Gracias Arnauld, ahorre
23 bytesfuente
05AB1E ,
8 75 bytesGuardado 2 bytes gracias a @Adnan
Pruébalo en línea!
¿Cómo?
Esto está utilizando el algoritmo que fue encontrado por primera vez por @tsh . Si te gusta esta respuesta, ¡asegúrate de votarla también!
Cada vez que un rascacielos es más bajo o más alto que el anterior, se puede pintar 'gratis' simplemente extendiendo las pinceladas.
Por ejemplo, pintar los rascacielosB y C en la figura a continuación no cuesta nada.
Por otro lado, necesitamos 2 nuevas pinceladas para pintar el rascacielosE , sin importar si serán reutilizadas después de eso o no.
Para el primer rascacielos, siempre necesitamos tantas pinceladas como pisos.
Convirtiendo esto en matemáticas:
Si anteponemos a la lista, esto se puede simplificar a:0
Comentado
fuente
0š¥ʒd}O
te ahorra un byte.ʒd}
conþ
debería ahorrarle dos bytes.Python 3 , 37 bytes
Pruébalo en línea!
-5 bytes cambiando a Python 3, gracias a Sarien
Python 2 ,
474342 bytesPruébalo en línea!
Alt:
Pruébalo en línea!
fuente
Haskell , 32 bytes
Pruébalo en línea!
Una mejora en la solución de Lynn que rastrea el elemento anterior en
p
lugar de mirar el siguiente elemento. Esto acorta el caso base y la llamada recursiva a cambio de la necesidad de invocar(0%)
.max(h-p)0
podría sermax h p-p
de la misma longitud.fuente
Haskell , 35 bytes
Pruébalo en línea!
La línea 2 podría ser
f[a]=a
si no tuviera que manejar el caso[]
.fuente
K (oK) ,
127 bytes-5 bytes gracias a ngn!
Un puerto k (oK) de la solución 05AB1E de Arnauld (y la solución JavaScript de tsh):
Pruébalo en línea!
J , 15 bytes
Puerto AJ de la solución 05AB1E de Arnauld (y la solución JavaScript de tsh):
Pruébalo en línea!
Mi ingenua solución:
J , 27 bytes
Pruébalo en línea!
fuente
':
) usa un elemento de identidad implícito (0
para-
) antes de la lista, por lo que0,
es innecesario. se puede omitir{
x}
para que sea una composición:+/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 recortados por Lynn
Pruébalo en línea!
Entonces para empezar tenemos
zipWith(-)
. Esto toma dos listas y produce una nueva lista de sus diferencias por pares. Luego lo combinamos conx
y(0:x)
.(0:)
es una función que agrega cero al frente de una lista y al combinarlazipWith(-)
obtenemos las diferencias entre los elementos consecutivos de esa lista con un cero al frente. Luego convertimos todos los negativos a cero con(max 0<$>)
. Esto crea una nueva lista donde cada elemento es el número de nuevos trazos que deben iniciarse en cada torre. Para obtener el total solo sumamos estossum
.fuente
g x=sum$max 0<$>zipWith(-)x(0:x)
es de 32 bytes :)sum.zipWith((max 0.).(-))<*>(0:)
.
tiene mayor prioridad que<*>
.Japt , 8 bytes
-2 bytes de @Shaggy
Explicación
Pruébalo en línea!
fuente
mîT Õ¸¸è
A.y()
acolchado de, por cierto.MATL , 8 bytes
Pruébalo en línea!
Prácticamente el algoritmo de @ Arnauld. Se guardó un byte (gracias @LuisMendo) al enviar en
uint64
lugar de seleccionar)
entradas positivas.fuente
Jalea , 5 bytes
Un puerto de mi respuesta 05AB1E , que en sí es similar a la respuesta @tsh JS .
Pruébalo en línea!
Comentado
fuente
Japt ,
76 bytesIntentalo
1 byte guardado gracias a Oliver.
fuente
R , 30 bytes
Pruébalo en línea!
Portar de solución @Arnauld que a su vez deriva del gran solución @tsh
fuente
Retina 0.8.2 , 21 bytes
Pruébalo en línea! El enlace incluye casos de prueba. Explicación:
Convierte a unario.
Elimine todas las superposiciones con la siguiente torre, que no necesita un nuevo trazo.
Cuente los trazos restantes.
fuente
Lisp común,
8887 bytesno minificado
Pruébalo
Cuando se pinta una torre, requiere una cantidad de pinceladas igual a su altura. Estas pinceladas se traducen en todas las siguientes, lo que se indica aquí restando la altura de la torre actual de todas las otras torres (y de sí mismo, pero eso no importa). Si la siguiente torre es más corta, entonces será empujada a un número negativo, y este número negativo se restará posteriormente de las torres que siguen (lo que indica pinceladas que no se pudieron traducir de una torre anterior a las siguientes). En realidad, solo resta el número de todas las alturas de la torre, incluidas las anteriores, pero esto no importa porque no volvemos a ver las anteriores.
fuente
05AB1E ,
1310 bytesPruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
C # (compilador interactivo de Visual C #) con indicador
/u:System.Math
, 47 bytesPruébalo en línea!
Versión antigua, con bandera
/u:System.Math
, 63 bytes.Siento que esta solución es más elegante que la primera. Atraviesa la matriz con una tupla de dos valores como valor inicial, recogiendo valores y almacena el valor antes que él en la segunda parte de la tupla.
Pruébalo en línea!
fuente
Pyth, 8 bytes
Otro puerto de la maravillosa respuesta de @ tsh . Toma la suma (
s
) de los valores positivos (>#0
) de los deltas (. +) De la entrada con 0 antepuesto (+0Q
, Q final inferido).Pruébelo en línea aquí , o verifique todos los casos de prueba a la vez aquí .
Método de unión de cadenas, 10 bytes
Esta fue la solución que escribí antes de buscar las otras respuestas.
Banco de pruebas.
fuente
Clojure, 50 bytes
Pruébalo en línea! (¿Por qué esto no imprime nada?)
fuente
Java (JDK) , 57 bytes
Pruébalo en línea!
Otro puerto de TSH 's respuesta Javascript . Así que asegúrate de haberlos votado.
Tenga en cuenta que usé la resta en lugar de la suma porque me permitió escribir
(p=x)
como operando correcto en la misma declaración.fuente
MATL ,
151413 bytesLa entrada es un vector de columna, que se usa
;
como separador.Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
fuente
Perl 5, 21 bytes
TIO
Cómo
-p
+}{
+$\
truco//
coincide con la cadena vacía de modo que para la siguiente línea el postmatch$'
contendrá la línea anterior$\+=$_>$'&&$_-$'
para acumular la diferencia entre la línea actual y la anterior si la actual es mayor que la anterior (también se podría escribir$\+=$_-$' if$_>$'
, pero Perl no analiza$\+=$_-$'if$_>$'
lo mismo)fuente
Stax , 8 bytes
Ejecutar y depurarlo
Utiliza el enfoque ampliamente utilizado de la solución JavaScript de tsh.
fuente
Wolfram Language (Mathematica) , 34 bytes
Un puerto de @Arnauld 's solución .
Pruébalo en línea!
fuente