Jetez un oeil à cette image. Plus précisément, comment les trous sur les extrémités sont disposés.
Remarquez comment les tuyaux de cette image sont placés dans un motif hexagonal. On sait qu'en 2D, un réseau hexagonal est le plus dense des cercles. Dans ce défi, nous nous concentrerons sur la minimisation du périmètre d'un emballage de cercles. Une façon utile de visualiser le périmètre est d'imaginer mettre un élastique autour de la collection de cercles.
La tâche
Étant donné un entier positif n
en entrée, montrez une collection de n
cercles aussi serrés que possible.
Règles et clarifications
- Supposons que les cercles ont un diamètre de 1 unité.
- La variable à minimiser est la longueur du périmètre, qui est définie comme étant la coque convexe des centres des cercles du groupe. Jetez un oeil à cette image:
Les trois cercles en ligne droite ont un périmètre de 4 (la coque convexe est un rectangle 2x0 et les 2 sont comptés deux fois), ceux disposés selon un angle de 120 degrés ont un périmètre d'environ 3,85 et le triangle a un périmètre de seulement 3 unités. Notez que j'ignore les unités pi supplémentaires que serait le périmètre réel parce que je ne regarde que les centres des cercles, pas leurs bords.
- Il peut y avoir (et il y en aura presque certainement) de multiples solutions pour tout
n
. Vous pouvez produire n'importe lequel de ces éléments à votre discrétion. L'orientation n'a pas d'importance. - Les cercles doivent être sur un réseau hexagonal.
- Les cercles doivent avoir au moins 10 pixels de diamètre et peuvent être remplis ou non.
- Vous pouvez écrire soit un programme soit une fonction.
- L'entrée peut être prise via STDIN, comme argument de fonction ou équivalent le plus proche.
- La sortie peut être affichée ou sortie dans un fichier.
Exemples
Ci-dessous, j'ai des exemples de sorties valides et invalides pour n de 1 à 10 (exemples valides uniquement pour les cinq premiers). Les exemples valides sont à gauche; chaque exemple à droite a un périmètre plus grand que l'exemple valide correspondant.
Un grand merci à steveverrill pour son aide à la rédaction de ce défi. Bon emballage!
la source
Réponses:
Mathematica
295950 octetsRemarque: Cette version encore à jouer résout les problèmes soulevés par Steve Merrill concernant mes tentatives précédentes.
Bien qu'il s'agisse d'une amélioration par rapport à la première version, il ne trouvera pas la configuration de poignée la plus dense où l'on chercherait une forme globale circulaire plutôt qu'hexagonale.
Il trouve des solutions en construisant un hexagone intérieur complet (pour n> = 6, puis examine toutes les configurations pour compléter la coque extérieure avec les cercles restants.
Fait intéressant, comme Steve Merrill l'a noté dans les commentaires, la solution pour les
n+1
cercles ne consiste pas toujours en la solution pour n cercles avec un autre cercle ajouté. Comparez la solution donnée pour 30 cercles à la solution donnée pour 31 cercles. (Remarque: il existe une solution unique pour 30 cercles.)Certaines vérifications ont entraîné des comparaisons de plus de cent mille cas pour une seule valeur de n (y compris les symétries). Il a fallu environ 5 minutes pour exécuter les 34 cas de test au total. Inutile de dire qu'avec une
n's
approche plus large, cette approche par force brute se révélerait bientôt impossible. Il est certain que des approches plus efficaces existent.Les nombres à droite de chaque emballage sont les périmètres des coques convexes bleues respectives. Ci-dessous la sortie pour
3 < n < 35
. Les cercles rouges sont ceux ajoutés autour d'un hexagone régulier.la source