Un mur de briques est un rectangle constitué de briques horizontales 1-sur-n empilées en rangées. Voici un mur de hauteur 4 et de largeur 8, avec les tailles de briques indiquées à droite.
[______][______] 4 4
[__][____][__][] 2 3 2 1
[][______][____] 1 4 3
[____][______][] 3 4 1
Ce mur est instable car il y a une faille , un endroit où deux fissures verticales entre des briques sont alignées, illustrées ci-dessous avec des parens dans les briques environnantes.
[______][______]
[__][____)(__][]
[][______)(____]
[____][______][]
Cependant, les fissures bordant les briques de taille 1 à droite ne constituent pas une faute, car elles sont séparées par une rangée.
Écrivez un code qui trouve et affiche un mur stable construit à partir de briques de tailles spécifiées. Le moins d'octets gagne.
Contribution
Une liste non vide de tailles de briques (nombres positifs) et une hauteur d'au moins 2. Cette liste peut être triée si vous le souhaitez. Vous pouvez également prendre en compte un nombre de briques de chaque taille.
Sortie
Une image d'un mur rectangulaire stable de la hauteur requise qui utilise toutes les briques données. Imprimez-le ou renvoyez-le sous forme de chaîne avec des nouvelles lignes.
Tracez une brique de taille n sous la forme de 2n caractères, soulignés par des crochets.
1: []
2: [__]
3: [____]
4: [______]
...
L'entrée est garantie d'avoir au moins une solution. S'il y en a plusieurs, vous ne devez toujours dessiner qu'un seul mur.
Il n'y a pas de limite de temps; utilisez autant de force brute que vous le souhaitez. Votre algorithme devrait en théorie fonctionner sur des entrées de toute taille.
Cas de test:
Il existe plusieurs solutions, vos sorties peuvent donc être différentes.
>> [1, 1, 2, 2], 2
[][__]
[__][]
>> [1, 1, 1, 2, 2, 2, 2, 3], 2
[__][____][__]
[][__][][__][]
>> [1, 1, 2, 2, 3, 3, 3, 3], 3
[][__][____]
[__][____][]
[____][____]
>> [1, 2, 3, 4, 5, 6, 7, 8, 9], 5
[][______________]
[__][____________]
[________________]
[____][__________]
[______][________]
>> [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2], 5
[][__][__]
[__][__][]
[][__][__]
[__][__][]
[][__][__]
n>1
et n'avais pas aimé la façon dont cela limitait les cas de test. Aussi, apparemment, il y a un précédent .Réponses:
Perl, 166
170 194Une tâche parfaite pour une langue créée par Larry Wall.
Force brute, mais assez rapide sur les cas de test (<1). Usage:
Testez - moi .
la source
CJam,
94 9282 octetsCeci est la version de 92 octets. La version de 82 octets suit.
Cela sépare les briques de toutes les manières possibles et n'utilise que celui qui est valide. Force assez brute pour le moment mais exécute toujours le dernier scénario de test en environ 10 secondes sur l' interpréteur Java sur ma machine.
Explication :
Le code est divisé en 5 parties:
1) Étant donné un tableau de longueur
L
, comment pouvons-nous tous le partitionner en plusieursH
parties?Après cela, nous avons tous les moyens possibles de diviser notre tableau d’entrée en couches H de briques.
2) Obtenez toutes les permutations du tableau d'entrée, puis toutes les partitions pour toutes les permutations
Après cela, nous avons toutes les dispositions possibles des briques d’entrée dans un
H
mur de briques en couches.3) Filtrez uniquement les dispositions dont les longueurs de briques sont identiques
Après la fin de ce filtre, toutes les dispositions restantes seraient des rectangles parfaits.
4) Sortez la première disposition de briques qui correspond aux critères de stabilité
Après cette étape, nous devons simplement imprimer la mise en page
5) Imprimer la mise en page
Essayez-le en ligne ici
82 octets
Ceci est presque similaire à la version à 92 octets, sauf qu’elle a une touche d’aléatoire. Si vous avez lu l'explication de la version à 92 octets, dans la version à 82 octets, les parties 3, 4 et 5 sont exactement identiques, alors qu'au lieu d'itérer toutes les permutations des parties 1 et 2, cette version génère simplement de manière aléatoire l'une des permutation à la fois, la teste en utilisant les parties 3 et 4, puis relance le processus si les tests des parties 3 et 4 échouent.
Ceci imprime les résultats très rapidement pour les 3 premiers cas de test. La hauteur = 5 cas de test est encore à donner une sortie sur mon ordinateur.
Explication de la différence
L'idée de cette version a été donnée par randomra (Get it?)
Essayez celui-ci en ligne
la source
Python 2,
680670660 octetsJe ne sais pas pourquoi j'insiste pour avoir ces super longs "golfs" ... mais bon, voilà.
Cela nécessite la sortie dans un ordre croissant trié et est appelé via
b(brick_sizes, height)
.Cas de test:
La façon dont cela fonctionne est:
la source
continue
de près de la fin. Aussireturn(N,N)
n'aura pas besoin de la parenthèse.continue
c'était une relique d'une version antérieure.W
etT
se transmet un argument supplémentaire.Haskell, 262 octets
Exemple d'utilisation:
Comment ça marche: la fonction principale
#
prend une listel
(liste de briques) et un nombreh
(hauteur) et divise toutes les permutations del
enh
sous-listes à toutes les positions possibles (via la fonction%
, par exemple2%[1,2,3,4]
->[ [[1],[2,3]] , [[1,2],[3]] , [[1,2,3],[]] ]
). Il conserve ceux où deux éléments consécutifs ont la même somme (c'est-à-dire la même longueur dans les briques) et les listes de sous-totaux n'ont pas d'éléments communs (les fissures ne s'alignent pas, ne fonctionnent pasv
). Prenez la première liste qui convient et construisez une chaîne de briques.la source
Python 2,
528,417,393, 381Très longue solution bruteforce. Cela fonctionne mais c’est à peu près tout, l’univers peut se terminer avant d’obtenir le résultat du dernier cas de test.
a est la fonction principale:
la source
from itertools import*
et en la supprimantitertools.
de l'permutations
appel. En outre, leif
s à la fin peut être changé enif all(x==w[0] for x in w)and~-f(o):return
... pour économiser 13 octets.f
toujours à la première itération? Cela a l'air bizarre. C'est soit un bug ou une énorme opportunité de golf.t=0
deux foisr()
; vous pouvez créer cette fonction enmap(sum,[x[:i] for i in range(len(x))])
une couche unique (appropriée pour le lambda-ing si vous le souhaitez). L'utilisation de isdisjoint et des paramètresf()
le réduirait considérablement (elle est également renvoyéef()
après un seul test, qu'elle détecte une erreur ou non). Personnellement, je réécriraisf()
commereturn not all(map(isdisjoint,map(set,map(r,w[:-1])),map(set,map(r,w[1:]))))
ou quelque chose de similaire.JavaScript (ES6) 222
232 265 279 319Reste à jouer au golfCelui-ci trouve toutes les solutions, ne sort que la dernière trouvée, et c'est assez rapide.Exécuter un extrait de code dans Firefox pour tester
Ungolfed Et expliqué
la source
Python 2, méthode grid (290 caractères)
La méthode ici est que vous transposez la grille et cherchez un
[[
ou]]
n'importe où dans les colonnes. Vous vérifiez également que toutes les briques des côtés gauche et droit du mur sont alignées: il est intéressant de vérifier que tous les éléments d'une chaîne sont identiques:'[[[[[['.strip('[')==''
mini version de ci-dessus:
Cela pourrait probablement être fait plus facilement dans un langage de manipulation matricielle.
... ou d'abus de expressions rationnelles, ce qui nous permet de combiner la condition "blocs alignés sur les extrémités" avec la condition "aucune fissure":
Disons que la largeur du mur était w = 6. Les emplacements de la sous-chaîne "[..... [" et "] .....]" doivent correspondre exactement à l'ensemble {0, w-1, w, 2w-1,2w, 3w-1 ,. ..}. La non-existence à ces points signifie que le banderolage des briques ressemble à ceci:
L'existence PAS à ces endroits signifie qu'il y a une "fissure" instable dans le mur:
Par conséquent, nous réduisons le problème pour définir l’équivalence, où les ensembles en question sont les indices d’une correspondance d’expression régulière.
Python, méthode regexp (304 caractères):
la source
x,h=input()
.Matlab (359)
Contribution
un vecteur d'entiers, exemple: p ([1 1 2 2 3])
Sortie
le schéma du mur exemple:
la source