Jest to luźna kontynuacja mojego wcześniejszego wyzwania dotyczącego konstruowania grafów .
tło
Ekscentryczny artysta zatrudnił cię do oceny integralności strukturalnej swoich rzeźb. Tworzy swoje dzieła sztuki, biorąc wiązkę magnesów w kształcie sześcianu i upuszczając je jeden po drugim na ogromny stos. Aby lepiej przeanalizować jego metodę, używamy następującego dwuwymiarowego modelu. Zaczynamy od pustej podłogi i upuszczamy magnes #
przy dowolnej współrzędnej całkowitej, powiedzmy 0
:
|
v
#
===============
0
Jeśli upuści się inny magnes 0
, kończy się on na poprzednim:
|
v
#
#
===============
0
Teraz upuśćmy jeszcze jeden magnes na 0
, a następnie jeden na 1
:
|
#v
##
#
===============
0
Jak widać powyżej, spadający magnes przyczepia się do drugiego magnesu, który mija (pierwszy tylko go spowalnia). Drugi magnes nie musi znajdować się bezpośrednio pod pierwszym, a magnes po obu stronach nadal liczy się jako jeden magnes:
# #
##|##
# v #
### #
# #
===============
0
Artyści chcą, abyś obliczył maksymalną pionową przerwę w ostatecznej rzeźbie, czyli maksymalną liczbę pustych przestrzeni między dwoma magnesami na tej samej kolumnie lub magnesem i ziemią pod nim. Na powyższym obrazku liczba ta wynosiłaby 3 (w kolumnie 2
).
Wejście
Lista liczb całkowitych reprezentujących współrzędne, w których artysta upuszcza magnesy, odczytywana od lewej do prawej. Możesz założyć, że współrzędne są spełnione -1024 <= i < 1024
i że długość listy wynosi co najwyżej 1024
, jeśli to pomaga.
Wynik
Maksymalna pionowa przerwa w ostatecznej rzeźbie. Pusta rzeźba ma szczelinę -1
i ten przypadek musi zostać uwzględniony, ponieważ nasz rzeźbiarz jest dadaistą.
Dodatkowe zasady
Możesz podać funkcję lub pełny program. Wygrywa najkrótsza liczba bajtów, a standardowe luki są niedozwolone. Preferowany jest kod z objaśnieniami.
Przypadki testowe
[] -> -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 bajtówStosowanie:
Ta funkcja tworzy kolejną funkcję, która zwraca listę pozycji y magnesu dla danej pozycji x. Za jego pomocą oblicza luki dla wszystkich pozycji x -1024 .. 1024 i przyjmuje maksimum (Edytuj: teraz biorę minimum, ponieważ luki są ujemne: im niższa liczba, tym większa luka).
źródło
flip
-
minimum
JavaScript,
201193Lub wersja do odczytu
źródło
Python 2.7, 327
Przed golfem w białej przestrzeni wygląda to tak:
Oto wyjaśnienie bardziej skomplikowanych linii, głównie dla mojej korzyści.
To konstruuje tablicę pustych list o długości max (drop) -min (drop) +1 plus symbol zastępczy po obu stronach. Zawsze chcę napisać [[]] * K, aby zbudować tablicę pustych list, ale dzięki temu wskaźniki K do tej samej pustej listy.
Funkcja izip_longest z itertools jest jak zip, ale wypełnia krótszą listę None, aby spakować listy razem. Krojenie [:: - 1] odwraca listę zer i jedynek z porównania „lub”. Lista jest odwrócona, aby użyć metody index w następnym wierszu, który znajduje pierwszą instancję elementu. Ponieważ ostatnim elementem niepustej kolumny musi być 1, jest to pierwszy element na odwróconej liście i jest ignorowany przez plasterek [1:].
Najpierw oblicz różnicę między długością kolumny i a pozycją drugiego 1 w sąsiednich kolumnach. Jeśli różnica jest dodatnia, dodaj tyle zer do kolumny i, zanim dodasz 1. Dowolna liczba dodatnia razy [0] jest pustą listą.
Grupa funkcji przez itertools dzieli listę na podsekwencje kolejnych elementów. Ta linia znajduje maks. Długości wszystkich podsekwencji zer we wszystkich kolumnach. Konieczne jest rzutowanie każdej podsekwencji q na listę, ponieważ groupby zwraca generator (podobnie jak wszystkie funkcje itertools), który naturalnie nie obsługuje metody len.
źródło
Java - 281 bajtów
Całkiem prosto.
Najpierw konstruuje rzeźbę w szeregu
Następnie znajduje największą lukę.
mały -
źródło
||
z|
. Zwracający
zamiast drukowania oszczędza 9 bajtów.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;}
. Podsumowanie zmian:z=9999
zostało dodane i wykorzystane;int
iint[][]
inicjalizacji pola zostały połączone w jeden; drugi||
otrzymuje brzmienie|
;for(r=9998;r>=0;r--)
został zmieniony nafor(r=z;--r>-2;)