Это свободное продолжение моей предыдущей задачи по построению графиков .
Фон
Эксцентричный художник нанял вас, чтобы оценить структурную целостность его скульптур. Он создает свои произведения искусства, взяв кучу кубовидных магнитов и бросая их один за другим в огромную кучу. Чтобы лучше проанализировать его метод, мы используем следующую двумерную модель. Мы начинаем с пустого этажа и опускаем магнит #
по любой целочисленной координате, скажем 0
:
|
v
#
===============
0
Если уронить другой магнит, он окажется 0
поверх предыдущего:
|
v
#
#
===============
0
Теперь, давайте бросим еще один магнит в 0
, а затем один в 1
:
|
#v
##
#
===============
0
Как видно выше, падающий магнит прилипает ко второму проходящему магниту (первый просто замедляет его). Второй магнит не обязательно должен быть непосредственно под первым, а магнит с обеих сторон по-прежнему считается одним магнитом:
# #
##|##
# v #
### #
# #
===============
0
Художники хотят, чтобы вы вычислили максимальный вертикальный зазор в окончательной скульптуре, то есть максимальное количество пустых пространств между двумя магнитами в одном столбце или магнитом и землей под ним. На изображении выше это число будет 3 (в столбце 2
).
вход
Список целых чисел, представляющих координаты, куда художник бросает свои магниты, читается слева направо. Вы можете предположить, что координаты удовлетворяют -1024 <= i < 1024
и что длина списка не более 1024
, если это помогает.
Выход
Максимальный вертикальный разрыв в итоговой скульптуре. Пустая скульптура имеет пробел -1
, и этот случай должен быть включен, так как наш скульптор - дадаист.
Дополнительные правила
Вы можете дать функцию или полную программу. Самый короткий счетчик байтов выигрывает, и стандартные лазейки запрещены. Код с пояснениями предпочтителен.
Контрольные примеры
[] -> -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 байтаИспользование:
Эта функция создает другую функцию, которая возвращает список магнитных у-позиций для данной х-позиции. С его помощью он вычисляет промежутки для всех x-позиций -1024 .. 1024 и берет максимум (Правка: теперь я беру минимум, потому что промежутки отрицательны: чем меньше число, тем больше разрыв).
источник
flip
-
minimum
Javascript,
201193Или читаемая версия
источник
Python 2.7, 327
Перед игрой в пустое пространство это выглядит так:
Вот объяснение более сложных линий, в основном для моей же пользы.
Это создает массив пустых списков длиной max (капли) -min (капли) +1 плюс заполнитель с обеих сторон. Я всегда хочу написать [[]] * K для создания массива пустых списков, но это делает K указателей на тот же пустой список.
Функция izip_longest из itertools похожа на zip, но заполняет более короткий список None для того, чтобы объединить списки вместе. Нарезка [:: - 1] переворачивает список 0 и 1 из сравнения "или". Список перевернут, чтобы использовать метод индекса в следующей строке, которая находит первый экземпляр элемента. Поскольку последний элемент непустого столбца должен быть равен 1, это первый элемент в обращенном списке, который игнорируется с помощью среза [1:].
Сначала вычислите разницу между длиной столбца i и позицией второго 1 в соседних столбцах. Если разница положительная, добавьте столько нулей в столбец i, прежде чем добавлять 1. Любое неположительное число, умноженное на [0], является пустым списком.
Функция groupby из itertools разбивает список на подпоследовательности последовательных элементов. Эта строка находит максимальную длину всех подпоследовательностей нулей во всех столбцах. Необходимо привести каждую подпоследовательность q к списку, потому что groupby возвращает генератор (как и все функции itertools), который, естественно, не поддерживает метод len.
источник
Java - 281 байт
Довольно прямо вперед.
Сначала он строит скульптуру в массиве
Тогда он находит самый большой пробел.
небольшой -
источник
||
на|
. Кроме того, возвратy
вместо печати экономит 9 байтов.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;}
. Краткое описание изменений:z=9999
добавлено и использовано;int
иint[][]
инициализация поля была объединена в одну; второй||
заменяется на|
;for(r=9998;r>=0;r--)
был изменен наfor(r=z;--r>-2;)