Partitionnez un n X n
carré en plusieurs rectangles à côtés entiers non congruents. a(n)
est la plus petite différence possible entre la plus grande et la plus petite zone.
___________
| |S|_______|
| | | L |
| |_|_______|
| | | |
| |_____|___|
|_|_________| (fig. I)
Le plus grand rectangle ( L
) a une aire de 2 * 4 = 8
et le plus petit rectangle ( S
) a une aire de 1 * 3 = 3
. Par conséquent, la différence est 8 - 3 = 5
.
Étant donné un entier n>2
, affichez la différence la moins possible.
Toutes les valeurs connues de la séquence au moment de la publication:
2, 4, 4, 5, 5, 6, 6, 8, 6, 7, 8, 6, 8, 8, 8, 8, 8, 9, 9, 9, 8, 9, 10, 9, 10, 9, 9, 11, 11, 10, 12, 12, 11, 12, 11, 10, 11, 12, 13, 12, 12, 12
Alors a(3)=2
, a(4)=4
...
Liés - ce défi connexe permet des solutions non optimales, a des contraintes de temps et n'est pas du code-golf.
Pour plus d'informations, regardez cette vidéo de Numberphile
Befunge, 708 octets
Essayez-le en ligne!
Cela ne va évidemment pas gagner de prix pour la taille, mais c'est en fait assez rapide étant donné qu'il s'agit d'une implémentation de base de force bruce dans un langage ésotérique. Sur l'interpréteur de référence Befunge, il peut gérer jusqu'à n = 6 en quelques secondes. Avec un compilateur, il peut gérer jusqu'à n = 8 avant de commencer à devenir lent; n = 9 prend quelques minutes et n = 10 est proche de 2 heures.
En théorie, la limite supérieure est n = 11 avant de manquer de mémoire (c'est-à-dire qu'il n'y a pas assez d'espace laissé dans le champ de jeu pour s'adapter à un carré plus grand). Cependant, à ce stade, le temps nécessaire pour calculer la solution optimale est probablement plus long que quiconque serait prêt à attendre, même lors de la compilation.
La meilleure façon de voir comment fonctionne l'algorithme est de l'exécuter dans l'un des "débogueurs visuels" Befunge. De cette façon, vous pouvez regarder pendant qu'il tente d'adapter les différentes tailles de rectangle dans l'espace disponible. Si vous voulez "avancer rapidement" au point où il a une bonne correspondance, vous pouvez placer un point d'arrêt sur le
4
dans la séquence$_40p
près du milieu de la dixième ligne (9 s'il est basé sur zéro). La valeur en haut de la pile à ce point est la différence de zone actuelle.Ci-dessous, une animation montrant les premières images de ce processus pour n = 5:
Chaque rectangle distinct est représenté par une lettre différente de l'alphabet. Cependant, notez que le rectangle final n'est jamais écrit, de sorte que la section du carré sera simplement vide.
J'ai également écrit une version de débogage du code qui génère la disposition actuelle chaque fois qu'il trouve une nouvelle meilleure correspondance ( essayez-le en ligne! ). Pour les tailles plus petites, la première correspondance est souvent la solution optimale, mais une fois que vous aurez dépassé n = 6, vous aurez probablement la possibilité de voir plusieurs dispositions valides mais non optimales avant de se fixer sur la solution finale.
La meilleure disposition trouvée pour n = 10 ressemble à ceci:
la source