Spójrz na to zdjęcie. W szczególności, w jaki sposób rozmieszczone są otwory na końcach.
( Źródło obrazu )
Zauważ, jak rury na tym obrazie są upakowane w sześciokątny wzór. Wiadomo, że w 2D sieć sześciokątna jest najgęstszym upakowaniem kół. W tym wyzwaniu skupimy się na zminimalizowaniu obwodu wypełnienia kół. Jednym z przydatnych sposobów wizualizacji obwodu jest wyobrażenie sobie zakładania gumki wokół kolekcji kół.
Zadanie
Biorąc pod uwagę dodatnią liczbę całkowitą n
jako dane wejściowe, pokaż kolekcję n
kręgów spakowanych tak ciasno, jak to możliwe.
Zasady i wyjaśnienia
- Załóżmy, że koła mają średnicę 1 jednostki.
- Zmienna być zminimalizowane jest długość obwodu, który jest zdefiniowany jako kadłub wypukła z ośrodków z kręgów w grupie. Spójrz na ten obraz:
Trzy okręgi w linii prostej mają obwód 4 (wypukły kadłub to prostokąt 2x0, a 2 jest liczony dwukrotnie), te ustawione pod kątem 120 stopni mają obwód około 3,85, a trójkąt ma obwód tylko 3 jednostki. Zauważ, że ignoruję dodatkowe jednostki pi, którymi byłby rzeczywisty obwód, ponieważ patrzę tylko na środki okręgów, a nie na ich krawędzie.
- Może istnieć (i prawie na pewno będzie) wiele rozwiązań dla każdego
n
. Możesz wydać dowolne z nich według własnego uznania. Orientacja nie ma znaczenia. - Kręgi muszą znajdować się na siatce sześciokątnej.
- Koła muszą mieć co najmniej 10 pikseli średnicy i mogą być wypełnione lub nie.
- Możesz napisać program lub funkcję.
- Dane wejściowe mogą być pobierane przez STDIN, jako argument funkcji lub najbliższy odpowiednik.
- Dane wyjściowe mogą być wyświetlane lub w postaci pliku.
Przykłady
Poniżej mam przykładowe prawidłowe i nieprawidłowe dane wyjściowe dla n od 1 do 10 (prawidłowe przykłady tylko dla pierwszych pięciu). Prawidłowe przykłady znajdują się po lewej stronie; każdy przykład po prawej stronie ma większy obwód niż odpowiadający mu prawidłowy przykład.
Ogromne podziękowania dla Steveverrill za pomoc w napisaniu tego wyzwania. Miłego pakowania!