Schauen Sie sich dieses Bild an. Insbesondere, wie die Löcher an den Enden angeordnet sind.
( Bildquelle )
Beachten Sie, wie die Rohre in diesem Bild in einem sechseckigen Muster gepackt sind. Es ist bekannt, dass in 2D ein hexagonales Gitter die dichteste Packung von Kreisen ist. Bei dieser Herausforderung werden wir uns darauf konzentrieren, den Umfang einer Packung von Kreisen zu minimieren. Ein nützlicher Weg, um den Umfang zu visualisieren, besteht darin, sich vorzustellen, ein Gummiband um die Sammlung von Kreisen zu legen.
Die Aufgabe
n
Zeigen Sie bei einer positiven Ganzzahl als Eingabe eine Sammlung von n
Kreisen, die so eng wie möglich gepackt sind.
Regeln und Erläuterungen
- Angenommen, Kreise haben einen Durchmesser von 1 Einheit.
- Die zu minimierende Variable ist die Länge des Umfangs, die als konvexe Hülle der Zentren der Kreise in der Gruppe definiert ist. Schauen Sie sich dieses Bild an:
Die drei Kreise in einer geraden Linie haben einen Umfang von 4 (die konvexe Hülle ist ein 2x0-Rechteck und die 2 wird zweimal gezählt), die in einem Winkel von 120 Grad angeordneten Kreise haben einen Umfang von etwa 3,85 und das Dreieck hat einen Umfang von nur 3 Einheiten. Beachten Sie, dass ich die zusätzlichen pi-Einheiten ignoriere, die der tatsächliche Umfang darstellen würde, da ich nur die Zentren der Kreise und nicht deren Kanten betrachte.
- Es kann (und wird mit ziemlicher Sicherheit) mehrere Lösungen für jede gegebene geben
n
. Sie können diese nach eigenem Ermessen ausgeben. Orientierung spielt keine Rolle. - Die Kreise müssen sich auf einem sechseckigen Gitter befinden.
- Die Kreise müssen mindestens 10 Pixel im Durchmesser haben und dürfen gefüllt sein oder nicht.
- Sie können entweder ein Programm oder eine Funktion schreiben.
- Die Eingabe kann über STDIN als Funktionsargument oder über das nächste Äquivalent erfolgen.
- Die Ausgabe kann angezeigt oder in eine Datei ausgegeben werden.
Beispiele
Unten habe ich Beispiele für gültige und ungültige Ausgaben für n von 1 bis 10 (gültige Beispiele nur für die ersten fünf). Die gültigen Beispiele finden Sie links. Jedes Beispiel auf der rechten Seite hat einen größeren Umfang als das entsprechende gültige Beispiel.
Vielen Dank an steveverrill für die Hilfe beim Schreiben dieser Herausforderung. Viel Spaß beim Packen!
quelle
Antworten:
Mathematica
295950 BytesHinweis: Diese noch zu spielende Version befasst sich mit Problemen, die Steve Merrill in Bezug auf meine früheren Versuche angesprochen hat.
Obwohl es eine Verbesserung gegenüber der ersten Version ist, wird es nicht die dichteste Griffkonfiguration finden, bei der man eher eine kreisförmige als eine sechseckige Gesamtform anstreben würde.
Es wird eine Lösung gefunden, indem ein vollständiges inneres Sechseck (für n> = 6) erstellt und anschließend alle Konfigurationen zur Vervollständigung der äußeren Hülle mit den verbleibenden Kreisen untersucht werden.
Interessanterweise besteht, wie Steve Merrill in den Kommentaren feststellte, die Lösung für
n+1
Kreise nicht immer aus der Lösung für n Kreise mit einem weiteren Kreis. Vergleichen Sie die angegebene Lösung für 30 Kreise mit der angegebenen Lösung für 31 Kreise. (Hinweis: Es gibt eine eindeutige Lösung für 30 Kreise.)Einige der Überprüfungen umfassten Vergleiche von über einhunderttausend Fällen für einen einzelnen Wert von n (einschließlich Symmetrien). Es dauerte ungefähr 5 Minuten, um die insgesamt 34 Testfälle auszuführen. Es erübrigt sich zu erwähnen, dass sich
n's
dieser Brute-Force-Ansatz bei größerem Umfang bald als unpraktisch erweisen würde. Effizientere Ansätze sind mit Sicherheit vorhanden.Die Zahlen rechts von jeder Packung sind die Umfänge der jeweiligen blauen konvexen Rümpfe. Unten ist die Ausgabe für
3 < n < 35
. Die roten Kreise sind die, die um ein reguläres Sechseck hinzugefügt werden.quelle