Esta es una continuación floja de mi desafío anterior sobre la construcción de gráficos .
Antecedentes
Un artista excéntrico te ha contratado para estimar la integridad estructural de sus esculturas. Él crea sus obras de arte tomando un montón de imanes en forma de cubo y colocándolos uno por uno en una enorme pila. Para analizar mejor su método, utilizamos el siguiente modelo bidimensional. Comenzamos con un piso vacío y colocamos un imán #
en cualquier coordenada entera, digamos 0
:
|
v
#
===============
0
Si se deja caer otro imán 0
, termina encima del anterior:
|
v
#
#
===============
0
Ahora, dejemos caer un imán más en 0
, y luego uno en 1
:
|
#v
##
#
===============
0
Como se ve arriba, un imán que cae se pega al segundo imán que pasa (el primero simplemente lo ralentiza). El segundo imán no necesita estar directamente debajo del primero, y un imán en ambos lados todavía cuenta como un imán:
# #
##|##
# v #
### #
# #
===============
0
Los artistas quieren que calcules el espacio vertical máximo en la escultura final, es decir, el número máximo de espacios vacíos entre dos imanes en la misma columna, o un imán y el suelo debajo de él. En la imagen de arriba, este número sería 3 (en la columna 2
).
Entrada
Una lista de enteros, que representan las coordenadas donde el artista deja caer sus imanes, leídos de izquierda a derecha. Puede suponer que las coordenadas satisfacen -1024 <= i < 1024
y que la longitud de la lista es como máximo 1024
, si eso ayuda.
Salida
La brecha vertical máxima en la escultura final. La escultura vacía tiene un hueco -1
, y este caso tiene que ser incluido, ya que nuestro escultor es dadaísta.
Reglas adicionales
Puede dar una función o un programa completo. El conteo de bytes más corto gana, y las lagunas estándar no se permiten. Se prefiere el código con explicaciones.
Casos de prueba
[] -> -1
[0,2,1] -> 0
[0,0,0,0,0,1,-1] -> 3
[0,0,0,0,0,1,1,1,2] -> 4
[1,1,2,2,2,2,2,2,1] -> 2
[1,1,2,2,2,2,2,2,1,0,1,0] -> 2
[1,2,1,2,1,2,1,2,2,2,2,1,0] -> 3
[-1,-1,-1,1,1,1,0] -> 1
[-1,-1,-1,-1,2,2,1,1,2,2,2,1,0] -> 2
[-2,-2,-2,-1,-1,-1,0,0,0,1,1,1,2,2,2,3,3,4,4,5,5,5,6] -> 6
Haskell -
217185182 BytesUso:
Esta función genera otra función que devuelve una lista de posiciones y de imán para una posición x dada. Con él, calcula los huecos para todas las posiciones x -1024 .. 1024 y toma el máximo (Editar: ahora estoy tomando el mínimo, porque los huecos son negativos: cuanto menor es el número, mayor es el hueco).
fuente
flip
el-
, ir con los números negativos y tomar elminimum
.Javascript,
201193O versión legible
fuente
Python 2.7, 327
Antes del golf de espacios en blanco, se ve así:
Aquí hay una explicación de las líneas más complejas, principalmente para mi propio beneficio.
Esto construye una matriz de listas vacías de longitud máxima (gotas) -min (gotas) +1 más un marcador de posición a cada lado. Siempre quiero escribir [[]] * K para construir una matriz de listas vacías, pero eso hace que K apuntes a la misma lista vacía.
La función izip_longest de itertools es como zip, pero llena la lista más corta con None para comprimir las listas. La división [:: - 1] invierte la lista de 0 y 1 de la comparación "o". La lista se invierte para usar el método de índice en la siguiente línea, que encuentra la primera instancia de un elemento. Dado que el último elemento de una columna no vacía debe ser 1, este es el primer elemento de la lista invertida y se ignora a través del segmento [1:].
Primero calcule la diferencia entre la longitud de la columna i y la posición del segundo 1 en las columnas adyacentes. Si la diferencia es positiva, agregue esa cantidad de ceros a la columna i antes de agregar un 1. Cualquier número no positivo multiplicado por [0] es la lista vacía.
La función groupby de itertools divide una lista en subsecuencias de elementos consecutivos. Esta línea encuentra el máximo de las longitudes de todas las subsecuencias de ceros en todas las columnas. Es necesario convertir cada subsecuencia q en una lista, porque groupby devuelve un generador (como todas las funciones de itertools) que naturalmente no admite un método len.
fuente
Java - 281 bytes
Muy claro.
Primero construye la escultura en una matriz.
Entonces encuentra la mayor brecha.
pequeño -
fuente
||
con|
. Además, regresar eny
lugar de imprimir ahorra 9 bytes.int a(int[]b){int z=9999,d[][]=new int[z][z],g,r,t,y=-1;for(int c:b){c+=z/2;g=0;for(r=z;--r>-2;){if(r==0||d[c][r-1]==1){d[c][r]=1;break;}if((d[c-1][r]==1|d[c+1][r]==1)&&++g==2){d[c][r]=1;break;}}}for(int[]k:d){t=0;for(int i:k){if(i==0)t++;else{if(t>y)y=t;t=0;}}}return y;}
. Resumen de los cambios:z=9999
se ha agregado y utilizado;int
y laint[][]
inicialización de campo se ha fusionado en una; segundo||
es reemplazado por|
;for(r=9998;r>=0;r--)
ha sido cambiado afor(r=z;--r>-2;)