Contribution
Votre contribution à ce défi est une liste de paires entières. Ils représentent les coins sud-ouest des carrés d'unité dans l'avion, et la liste représente leur union en tant que sous-ensemble de l'avion. Par exemple, la liste
[(0,0),(1,0),(0,1),(1,1),(2,1),(1,2),(2,2)]
représente l'ensemble de couleur rouge dans cette image:
Sortie
Votre sortie est une liste de quadruples entiers, représentant des sous-ensembles rectangulaires du plan. Plus explicitement, un quadruple (x,y,w,h)
représente un rectangle de largeurw > 0
et de hauteur h > 0
dont l'angle sud-ouest est à (x,y)
. Les rectangles doivent former une couverture exacte de la région d'entrée, dans le sens où chacun des carrés unitaires est un sous-ensemble d'un rectangle, chaque rectangle est un sous-ensemble de la région et deux rectangles peuvent se chevaucher uniquement à leurs frontières. Pour interdire les solutions triviales, le revêtement ne doit pas contenir deux rectangles qui pourraient être fusionnés en un rectangle plus grand.
Par exemple, la liste
[(0,0,2,1),(0,1,3,1),(1,2,2,1)]
représente la couverture juridique
de la région susmentionnée, alors que la couverture
[(0,0,2,2),(2,1,1,1),(1,2,1,1),(2,2,1,1)]
est illégal, car les carrés 1 par 1 voisins pourraient être fusionnés:
Règles
Vous pouvez donner un programme complet ou une fonction. Le formatage précis de l'entrée et de la sortie n'est pas important, dans des limites raisonnables. Le nombre d'octets le plus court l'emporte et les failles standard sont interdites. Nous vous encourageons à fournir une explication de votre algorithme et quelques exemples de résultats.
Cas de test
Une région en U:
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(1,0),(1,1),(1,2),(1,3),(1,4),(1,5),(2,0),(2,1),(3,0),(3,1),(4,0),(4,1),(4,2),(4,3),(4,4),(4,5),(5,0),(5,1),(5,2),(5,3),(5,4),(5,5)]
Un grand triangle:
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(0,9),(1,0),(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),(2,0),(2,1),(2,2),(2,3),(2,4),(2,5),(2,6),(2,7),(3,0),(3,1),(3,2),(3,3),(3,4),(3,5),(3,6),(4,0),(4,1),(4,2),(4,3),(4,4),(4,5),(5,0),(5,1),(5,2),(5,3),(5,4),(6,0),(6,1),(6,2),(6,3),(7,0),(7,1),(7,2),(8,0),(8,1),(9,0)]
Un carré avec des trous:
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(1,0),(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),(1,9),(2,0),(2,1),(2,2),(2,3),(2,4),(2,5),(2,6),(2,7),(2,8),(2,9),(3,0),(3,1),(3,2),(3,4),(3,5),(3,6),(3,7),(3,8),(3,9),(4,0),(4,1),(4,2),(4,3),(4,4),(4,5),(4,6),(4,7),(4,8),(4,9),(5,0),(5,1),(5,2),(5,3),(5,4),(5,5),(5,7),(5,8),(5,9),(6,1),(6,2),(6,3),(6,5),(6,6),(6,7),(6,8),(6,9),(7,0),(7,1),(7,2),(7,3),(7,4),(7,5),(7,6),(7,7),(7,8),(7,9),(8,0),(8,1),(8,2),(8,3),(8,4),(8,5),(8,6),(8,7),(8,8),(8,9),(9,0),(9,1),(9,2),(9,3),(9,4),(9,5),(9,6),(9,7),(9,8),(9,9)]
Régions déconnectées:
[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(1,0),(1,1),(1,2),(1,3),(1,4),(1,6),(1,7),(1,8),(1,9),(2,1),(2,2),(2,3),(2,4),(2,5),(2,6),(2,7),(2,8),(2,9),(4,0),(4,1),(4,2),(4,4),(4,5),(4,6),(4,7),(4,8),(4,9),(5,0),(5,1),(5,2),(5,3),(5,4),(5,5),(5,6),(5,7),(5,8),(5,9),(6,0),(6,1),(6,2),(6,4),(6,5),(6,6),(6,7),(6,8),(6,9),(8,0),(8,1),(8,2),(8,3),(8,4),(8,5),(8,6),(8,7),(8,8),(8,9),(9,0),(9,1),(9,2),(9,3),(9,7),(9,8),(9,9),(10,0),(10,1),(10,2),(10,3),(10,4),(10,5),(10,6),(10,7),(10,8),(10,9)]
Vérifieur
Utilisez ce programme Python 2 pour vérifier votre solution. Il prend de STDIN une liste de tuples (l'entrée) et une liste de quadruples (votre sortie), séparés par une virgule.
J'ai également écrit ce programme Python 2 pour générer les images, et vous pouvez également l'utiliser. Il prend de STDIN une liste de tuples ou de quadruples et produit un fichier nommé out.png
. Il nécessite la bibliothèque PIL. Si vous le souhaitez, vous pouvez également modifier la taille des cellules de la grille et la largeur des lignes de ceinture.
3-h
pour~h
?Python -
272261258251224Je pense que je peux jouer au golf plus.
Je suis presque sûr que cela fonctionne, mais je n'ai pas encore fini de le tester sur tous les cas de test.J'ai fini de le tester. Cela fonctionne pour tous les cas de test.Je travaille sur l'ajout d'images des résultats.Edit: Voici les résultats de l'exemple et des cas de test:J'essaie d'écrire ceci en Perl, mais je ne peux pas comprendre comment obtenir des tableaux multidimensionnels à partir de stdin sans un grand nombre de caractères. Est-ce que quelqu'un a des suggestions?
la source
(i[0]+w,i[1]+j)not in c
pour{(i[0]+w,i[1]+j)}-c
et vous pouvez passerw=h=1
à lac=set(a)-set(b)
ligneb+=[(j+i[0],k+i[1])]
tob+=(j+i[0],k+i[1]),
et vous utilisezrange
trois fois donc il est plus court à attribuerr=range
x,y=i
ensuite en utilisantx
ety
au lieu dei[0]
eti[1]
? Cela économiserait beaucoup d'octets.while not[j for j in r(h)if(x+w,y+j)not in c]:w+=1
utiliserwhile all((x+w,y+j)in c for j in r(h)):w+=1
.Python 2, 139
Le programme accepte des listes de paires ordonnées entourées d'accolades sur une entrée standard. Par exemple,
{(0,0),(1,0),(0,1),(1,1),(2,1),(1,2),(2,2)}
Il est souvent irritant (pas seulement dans le golf) que Python n'autorise pas une affectation à l'intérieur d'un test de boucle. Pour contourner ce problème, j'ai utilisé des opérations de formatage de chaînes.
la source
Mathematica -
315 285267 octetsAvec l'aide de @ MartinBüttner.
Non golfé:
Usage:
Cas de test
Une région en U
Un grand triangle
Un carré avec des trous
Régions déconnectées
la source
Haskell, 158
des cas de test et des images seront bientôt disponibles.
Algorithme: prenez le premier carré. Atteignez l'extrême droite sans rencontrer un carré qui n'est pas dans l'entrée. Atteignez ensuite le plus haut possible sans avoir de carré non en entrée. Nous avons maintenant un rectangle sans carré manquant. Ajoutez-le à la sortie, supprimez tous ses carrés de l'entrée et appelez récursivement.
la source
not$all(\x->elem(x,i)s)
parany(\x->notElem(x,i)s)
.JavaScript (ES6) 148
155 199Edit2 Un peu plus de réglage
Modifier Some golfing + rewrite using recursion. Je ne m'attendais pas à une telle réduction. Maintenant, c'est un peu difficile à suivre, mais l'algorithme est le même.
L'algorithme est similaire à la réponse @jakube.
Oui? Le premier élément grandit, le deuxième élément est effacé, recommencez à l'étape 2
Sinon, passez à l'élément suivant
Tester dans l'extrait
la source
Mathematica,
153 151 144 136133 133Exemple:
Contribution:
Sortie:
Contribution:
Sortie:
Algorithme:
Couvrez la région avec des carrés d'unité, puis fusionnez-les.
la source