Dies ist eine lose Fortsetzung meiner früheren Herausforderung beim Erstellen von Diagrammen .
Hintergrund
Ein exzentrischer Künstler hat Sie beauftragt, die strukturelle Integrität seiner Skulpturen einzuschätzen. Er erschafft seine Kunstwerke, indem er ein paar würfelförmige Magnete eins nach dem anderen auf einen riesigen Stapel wirft. Um seine Methode besser analysieren zu können, verwenden wir das folgende zweidimensionale Modell. Wir beginnen mit einem leeren Boden und lassen einen Magneten #
an einer beliebigen Ganzzahlkoordinate fallen, sagen wir 0
:
|
v
#
===============
0
Wenn ein anderer Magnet fallen gelassen wird 0
, landet er oben auf dem vorherigen:
|
v
#
#
===============
0
Lassen Sie uns noch einen Magneten auf 0
und dann einen auf fallen 1
:
|
#v
##
#
===============
0
Wie oben zu sehen, haftet ein fallender Magnet am zweiten Magneten, den er passiert (der erste verlangsamt ihn lediglich). Der zweite Magnet muss nicht direkt unter dem ersten liegen, und ein Magnet auf beiden Seiten zählt immer noch als ein Magnet:
# #
##|##
# v #
### #
# #
===============
0
Der Künstler möchte, dass Sie die maximale vertikale Lücke in der endgültigen Skulptur berechnen, dh die maximale Anzahl von Leerstellen zwischen zwei Magneten auf derselben Säule oder einem Magneten und dem Boden darunter. Im obigen Bild wäre diese Zahl 3 (in der Spalte 2
).
Eingang
Eine Liste von Ganzzahlen, die die Koordinaten darstellen, bei denen der Künstler seine Magnete fallen lässt, wird von links nach rechts gelesen. Sie können davon ausgehen, dass die Koordinaten übereinstimmen -1024 <= i < 1024
und dass die Länge der Liste maximal ist 1024
, wenn dies hilft.
Ausgabe
Die maximale vertikale Lücke in der endgültigen Skulptur. Die leere Skulptur hat eine Lücke -1
, und dieser Fall muss eingeschlossen werden, da unser Bildhauer ein Dadaist ist.
Zusätzliche Regeln
Sie können eine Funktion oder ein vollständiges Programm angeben. Die kürzeste Byteanzahl gewinnt, und Standardlücken sind nicht zulässig. Code mit Erläuterungen wird bevorzugt.
Testfälle
[] -> -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 BytesVerwendung:
Diese Funktion erstellt eine weitere Funktion, die eine Liste der Magnet-Y-Positionen für eine bestimmte X-Position zurückgibt. Damit berechnet es die Lücken für alle x-Positionen -1024 .. 1024 und nimmt das Maximum (Edit: jetzt nehme ich das Minimum, weil die Lücken negativ sind: je niedriger die Zahl, desto größer die Lücke).
quelle
flip
das-
, gehen mit negativen Zahlen und nehmen dieminimum
.Javascript,
201193Oder lesbare Version
quelle
Python 2.7, 327
Vor dem White Space Golfen sieht es so aus:
Hier ist eine Erklärung der komplexeren Zeilen, hauptsächlich zu meinem eigenen Vorteil.
Dadurch wird ein Array von leeren Listen mit der Länge max (drops) -min (drops) +1 plus einem Platzhalter auf beiden Seiten erstellt. Ich möchte immer [[]] * K schreiben, um ein Array von leeren Listen zu erstellen, aber dadurch werden K-Zeiger auf dieselbe leere Liste gesetzt.
Die Funktion izip_longest von itertools ähnelt zip, füllt jedoch die kürzere Liste mit None, um die Listen zusammen zu komprimieren. Das Schneiden [:: - 1] kehrt die Liste der Nullen und Einsen aus dem "oder" -Vergleich um. Die Liste wird umgekehrt, um die Indexmethode in der nächsten Zeile zu verwenden, die die erste Instanz eines Elements findet. Da das letzte Element einer nicht leeren Spalte 1 sein muss, ist dies das erste Element in der umgekehrten Liste und wird über das Slice [1:] ignoriert.
Berechnen Sie zunächst die Differenz zwischen der Länge der Spalte i und der Position der zweiten 1 in den benachbarten Spalten. Wenn die Differenz positiv ist, fügen Sie der Spalte i so viele Nullen hinzu, bevor Sie eine 1 hinzufügen. Alle nicht positiven Zahlen, die mit [0] angegeben sind, sind leere Listen.
Die Funktionsgruppe von itertools teilt eine Liste in Teilfolgen aufeinanderfolgender Elemente auf. Diese Zeile ermittelt die maximale Länge aller Teilsequenzen von Nullen in allen Spalten. Es ist notwendig, jede Teilsequenz q in eine Liste umzuwandeln, da groupby (wie alle itertools-Funktionen) einen Generator zurückgibt, der natürlich keine len-Methode unterstützt.
quelle
Java - 281 Bytes
Ziemlich einfach.
Zuerst baut es die Skulptur in einem Array auf
Dann findet es die größte Lücke.
klein -
quelle
||
mit|
. Wenn Sie zurückkehren,y
anstatt zu drucken, werden 9 Byte gespart.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;}
. Zusammenfassung der Änderungen:z=9999
wurde hinzugefügt und verwendet;int
undint[][]
Feldinitialisierung wurde zu einer zusammengeführt; Sekunde||
wird ersetzt durch|
;for(r=9998;r>=0;r--)
wurde geändert infor(r=z;--r>-2;)