Esta é uma continuação frouxa do meu desafio anterior na construção de gráficos .
fundo
Um artista excêntrico contratou você para estimar a integridade estrutural de suas esculturas. Ele cria suas obras de arte pegando um monte de ímãs em forma de cubo e largando-os um a um em uma pilha enorme. Para analisar melhor seu método, usamos o seguinte modelo bidimensional. Começamos com um piso vazio e soltamos um ímã #
em qualquer coordenada inteira, digamos 0
:
|
v
#
===============
0
Se outro ímã cair 0
, ele termina em cima do anterior:
|
v
#
#
===============
0
Agora, vamos soltar mais um ímã em 0
e depois um em 1
:
|
#v
##
#
===============
0
Como visto acima, um ímã em queda adere ao segundo ímã por onde passa (o primeiro apenas o retarda). O segundo ímã não precisa estar diretamente abaixo do primeiro, e um ímã de ambos os lados ainda conta como um ímã:
# #
##|##
# v #
### #
# #
===============
0
Os artistas querem que você calcule o intervalo vertical máximo na escultura final, ou seja, o número máximo de espaços vazios entre dois ímãs na mesma coluna ou um ímã e o solo abaixo dela. Na figura acima, esse número seria 3 (na coluna 2
).
Entrada
Uma lista de números inteiros, representando as coordenadas em que o artista coloca seus ímãs, lida da esquerda para a direita. Você pode assumir que as coordenadas são satisfatórias -1024 <= i < 1024
e que o comprimento da lista é no máximo 1024
, se isso ajudar.
Resultado
A lacuna vertical máxima na escultura final. A escultura vazia tem lacunas -1
, e este caso deve ser incluído, pois nosso escultor é um dadaísta.
Regras adicionais
Você pode atribuir uma função ou um programa completo. A menor contagem de bytes vence e as brechas padrão não são permitidas. Código com explicações é o preferido.
Casos de teste
[] -> -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:
Essa função cria outra função que retorna uma lista de posições y do ímã para uma determinada posição x. Com ele, calcula os intervalos para todas as posições x -1024 .. 1024 e leva o máximo (Edit: agora estou levando o mínimo, porque os intervalos são negativos: quanto menor o número, maior o intervalo).
fonte
flip
o-
, ir com os números negativos e tomar ominimum
.Javascript,
201193Ou versão legível
fonte
Python 2.7, 327
Antes do espaço em branco, fica assim:
Aqui está uma explicação das linhas mais complexas, principalmente para meu próprio benefício.
Isso constrói uma matriz de listas vazias de comprimento max (drops) -min (drops) +1 mais um espaço reservado em ambos os lados. Eu sempre quero escrever [[]] * K para construir uma matriz de listas vazias, mas isso faz com que K aponte para a mesma lista vazia.
A função izip_longest do itertools é como zip, mas preenche a lista mais curta com None para compactar as listas. A divisão [:: - 1] inverte a lista de 0 e 1 da comparação "ou". A lista é revertida para usar o método index na próxima linha, que localiza a primeira instância de um elemento. Como o último elemento de uma coluna não vazia deve ser 1, este é o primeiro elemento da lista invertida e é ignorado pela fatia [1:].
Primeiro, calcule a diferença entre o comprimento da coluna ie a posição do segundo 1 nas colunas adjacentes. Se a diferença for positiva, adicione muitos zeros à coluna i antes de adicionar um 1. Qualquer número não positivo vezes [0] é a lista vazia.
O grupo de funções de itertools divide uma lista em subsequências de elementos consecutivos. Esta linha encontra o máximo dos comprimentos de todas as subsequências de zeros em todas as colunas. É necessário converter cada subsequência q em uma lista, porque groupby retorna um gerador (como todas as funções de ferramentas) que naturalmente não suporta um método len.
fonte
Java - 281 bytes
Bem direto.
Primeiro ele constrói a escultura em uma matriz
Então encontra a maior lacuna.
pequeno -
fonte
||
por|
. Além disso, ao retornar emy
vez de imprimir, ele salva 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;}
. Resumo das alterações:z=9999
foi adicionado e usado;int
e aint[][]
inicialização do campo foi mesclada em um; o segundo||
é substituído por|
;for(r=9998;r>=0;r--)
foi alterado parafor(r=z;--r>-2;)