Il s'agit d'une continuation lâche de mon défi précédent sur la construction de graphiques .
Contexte
Un artiste excentrique vous a engagé pour estimer l'intégrité structurelle de ses sculptures. Il crée ses œuvres d'art en prenant un tas d'aimants en forme de cube et en les déposant un par un dans un énorme tas. Pour mieux analyser sa méthode, nous utilisons le modèle bidimensionnel suivant. Nous commençons avec un sol vide et déposons un aimant #
à n'importe quelle coordonnée entière, disons 0
:
|
v
#
===============
0
Si un autre aimant tombe 0
, il se retrouve au-dessus du précédent:
|
v
#
#
===============
0
Maintenant, laissons tomber un aimant de plus à 0
, puis un à 1
:
|
#v
##
#
===============
0
Comme vu ci-dessus, un aimant qui tombe colle au deuxième aimant qu'il passe (le premier le ralentit simplement). Le deuxième aimant n'a pas besoin d'être directement en dessous du premier, et un aimant des deux côtés compte toujours comme un aimant:
# #
##|##
# v #
### #
# #
===============
0
Les artistes veulent que vous calculiez l'écart vertical maximal dans la sculpture finale, c'est-à-dire le nombre maximal d'espaces vides entre deux aimants sur la même colonne, ou un aimant et le sol en dessous. Dans l'image ci-dessus, ce nombre serait 3 (sur la colonne 2
).
Contribution
Une liste d'entiers, représentant les coordonnées où l'artiste laisse tomber ses aimants, lue de gauche à droite. Vous pouvez supposer que les coordonnées satisfont -1024 <= i < 1024
et que la longueur de la liste est au maximum 1024
, si cela vous aide.
Production
L'écart vertical maximal dans la sculpture finale. La sculpture vide a un écart -1
, et ce cas doit être inclus, car notre sculpteur est un dadaïste.
Règles supplémentaires
Vous pouvez donner une fonction ou un programme complet. Le nombre d'octets le plus court l'emporte et les failles standard sont interdites. Un code avec des explications est préférable.
Cas de test
[] -> -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 octetsUsage:
Cette fonction crée une autre fonction qui renvoie une liste de positions y magnétiques pour une position x donnée. Avec lui, il calcule les écarts pour toutes les positions x -1024 .. 1024 et prend le maximum (Edit: maintenant je prends le minimum, car les écarts sont négatifs: plus le nombre est faible, plus l'écart est grand).
la source
flip
le faites pas-
, allez avec des nombres négatifs et prenez leminimum
.Javascript,
201193Ou version lisible
la source
Python 2.7, 327
Avant de jouer au golf en espace blanc, cela ressemble à ceci:
Voici une explication des lignes plus complexes, principalement pour mon propre bénéfice.
Cela construit un tableau de listes vides de longueur max (gouttes) -min (gouttes) +1 plus un espace réservé de chaque côté. Je veux toujours écrire [[]] * K pour construire un tableau de listes vides, mais cela fait K pointeurs vers la même liste vide.
La fonction izip_longest d'itertools est comme zip, mais remplit la liste plus courte avec None afin de compresser les listes ensemble. Le découpage [:: - 1] inverse la liste des 0 et des 1 de la comparaison "ou". La liste est inversée afin d'utiliser la méthode index dans la ligne suivante, qui trouve la première instance d'un élément. Étant donné que le dernier élément d'une colonne non vide doit être 1, il s'agit du premier élément de la liste inversée et est ignoré via la tranche [1:].
Calculez d'abord la différence entre la longueur de la colonne i et la position du second 1 dans les colonnes adjacentes. Si la différence est positive, ajoutez autant de zéros à la colonne i avant d'ajouter un 1. Tout nombre non positif multiplié par [0] est la liste vide.
La fonction groupby d'itertools divise une liste en sous-séquences d'éléments consécutifs. Cette ligne trouve le maximum des longueurs de toutes les sous-séquences de zéros dans toutes les colonnes. Il est nécessaire de transtyper chaque sous-séquence q dans une liste, car groupby renvoie un générateur (comme toutes les fonctions itertools) qui, naturellement, ne prend pas en charge une méthode len.
la source
Java - 281 octets
Assez simple.
Il construit d'abord la sculpture en réseau
Ensuite, il trouve le plus grand écart.
petit -
la source
||
par|
. En outre, le retoury
au lieu d'imprimer permet d'économiser 9 octets.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;}
. Résumé des changements:z=9999
a été ajouté et utilisé;int
et l'int[][]
initialisation de champ a été fusionnée en une seule; le second||
est remplacé par|
;for(r=9998;r>=0;r--)
a été changé enfor(r=z;--r>-2;)