Paketleme Çemberleri


21

Bu resme bir bakın. Spesifik olarak, uçlardaki deliklerin nasıl yerleştirildiği ile.

görüntü tanımını buraya girin

( Görüntü kaynağı )

Bu görüntüdeki boruların altıgen bir şekilde nasıl paketlendiğine dikkat edin. 2B'de altıgen bir kafesin en yoğun daire ambalajı olduğu bilinmektedir . Bu mücadelede, bir daire çemberinin çevresini en aza indirmeye odaklanacağız. Çevreyi görselleştirmenin kullanışlı bir yolu, daire koleksiyonunun etrafına lastik bir bant yerleştirmeyi hayal etmektir.

Görev

nGirdi olarak pozitif bir tamsayı verildiğinde nmümkün olduğunca sıkı paketlenmiş daireler topluluğunu gösterin .

Kurallar ve Açıklamalar

  • Dairelerin 1 birim çapında olduğunu varsayalım.
  • En aza indirilmesi için, değişken olarak tanımlanır çevre, uzunluğu dışbükey bölgesinin merkezleri grubunda çevrelerin. Şu resme bir bakın:

görüntü tanımını buraya girin

Düz bir çizgideki üç daire, 4'lük bir çevreye sahiptir (dışbükey gövde 2x0 dikdörtgendir ve 2, iki kere sayılır), 120 derecelik bir açıyla düzenlenmiş olanlar, yaklaşık 3.85'lik bir çevreye sahiptir ve üçgen sadece 3 adet. Asıl çevre olan ek pi birimlerini görmezden geldiğime dikkat edin, çünkü sadece çevrelerin merkezlerine bakıyorum, kenarlarını değil.

  • Herhangi biri için birden fazla çözüm olabilir (ve neredeyse kesinlikle olacaktır) n. Bunlardan herhangi birini kendi takdirinize bağlı olarak çıkarabilirsiniz. Oryantasyon önemli değil.
  • Daireler altıgen bir kafes üzerinde olmalıdır.
  • Dairelerin çapı en az 10 piksel olmalıdır ve doldurulabilir veya doldurulmayabilir.
  • Bir program veya işlev yazabilirsiniz.
  • Girdi, işlev argümanı veya en yakın eşdeğeri olarak STDIN üzerinden alınabilir.
  • Çıktı görüntülenebilir veya bir dosyaya aktarılabilir.

Örnekler

Aşağıda 1'den 10'a kadar n için geçerli ve geçersiz çıktılar var (yalnızca ilk beş için geçerli örnekler). Geçerli örnekler soldadır; sağdaki her örnek, karşılık gelen geçerli örnekten daha büyük bir çevreye sahiptir.

görüntü tanımını buraya girin

Bu zorluğu yazmada yardım için steveverrill'e çok teşekkürler. Mutlu paketleme!


3
Altıgen bekliyorum, bahse girerim. ; D
Addison Crump

@VoteToClose: Hexagony'nin grafik çıktısı olduğunu sanmıyorum ama MAN, bu harika olurdu!
El'endia Starman,

El'endiaStarman Well @, sen olabilir ... Stdout'a bir SVG yazma, ama ben gidiyorum sanmıyorum: P
Martin Ender

1
Vay be, kimse kum havuzundaki yorumlarım için bana cesurca teşekkür etmedi. Kızarıyorum :-D Tabii ki yorum yaptım çünkü mücadeleyi beğendim, ancak cevaplamak için zamanım olacak mı emin değilim.
Seviye Nehri St

User81655'in cevabı üzerine Reto Koradi ile yaptığım görüşmeye göre, keskin köşelerle göreceğimiz en büyük altıgenin kenar uzunluğu 7d (8 daire) olduğunu düşünüyorum. Bu toplam N = 169 daire. Sorunu bu numara ile sınırlamayı düşünebilirsiniz; bu, doğru bir cevap alma (şu anda hiç yok) ve kontrol edebilme şansı verir. Öte yandan, sorunu keyfi N'ye açık bırakmak daha ilginç olabilir
Level River St

Yanıtlar:


4

Mathematica 295 950 bayt

Not: Bu hala golf oyunu, Steve Merrill'in daha önceki girişimlerimle ilgili ortaya çıkardığı sorunları ele alıyor.

İlk versiyona göre bir gelişme olsa da, altıgen, genel bir şekil yerine bir genelge arayan en yoğun tutamaç konfigürasyonunu bulamayacaktır.

Komple bir iç altıgen (n> = 6 için) oluşturarak çözümler bulur ve ardından dış kabuğun kalan dairelerle tamamlanması için tüm konfigürasyonları inceler.

İlginç bir şekilde, Steve Merrill'in yorumlarda belirttiği gibi, n+1daireler için çözüm her zaman eklenmiş başka bir çevreye sahip n daireler için çözümden oluşmuyor. 30 çember için verilen çözümü, 31 çember için verilen çözümü karşılaştırın. (Not: 30 daire için benzersiz bir çözüm var.)

m[pts_]:={Show[ConvexHullMesh[pts],Graphics[{Point/@pts,Circle[#,1/2]&/@ pts}], 
ImageSize->Tiny,PlotLabel->qRow[{Length[pts],"  circles"}]],
RegionMeasure[RegionBoundary[ConvexHullMesh[pts]]]};
nPoints = ((#+1)^3-#^3)&;pointsAtLevelJ[0] = {{0,0}};
pointsAtLevelJ[j_]:=RotateLeft@DeleteDuplicates@Flatten[Subdivide[#1, #2, j] &@@@
Partition[Append[(w=Table[j{Cos[k Pi/3],Sin[k Pi/3]},{k,0,5}]), 
w[[1]]], 2, 1], 1];nPointsAtLevelJ[j_] := Length[pointsAtLevelJ[j]]
getNPoints[n_] := Module[{level = 0, pts = {}},While[nPoints[level]<=n, 
pts=Join[pointsAtLevelJ[level],pts];level++];Join[Take[pointsAtLevelJ[level],n-Length[pts]],
pts]];ns={1,7,19,37,61,91};getLevel[n_]:=Position[Union@Append[ns,n],n][[1, 1]]-1;
getBaseN[n_] := ns[[getLevel[n]]];pack[1]=Graphics[{Point[{0,0}], Circle[{0, 0}, 1/2]}, 
ImageSize->Tiny];pack[n_]:=Quiet@Module[{base = getNPoints[getBaseN[n]], 
outerRing = pointsAtLevelJ[getLevel[n]], ss},ss=Subsets[outerRing,{n-getBaseN[n]}];
SortBy[m[Join[base,#]]&/@ss,Last][[1]]]

Kontrollerden bazıları, yüz binden fazla vakanın tek bir n değeriyle (simetriler dahil) karşılaştırılmasını gerektirmiştir. Toplam 34 test vakasını çalıştırmak yaklaşık 5 dakika sürdü. Söylemeye gerek yok, daha büyük olan n'sbu kaba kuvvet yaklaşımı yakında pratik olmazdı. Daha verimli yaklaşımların var olduğu kesindir.

Her bir paketlemenin sağındaki sayılar, ilgili mavi dışbükey kabukların çevresini oluşturur. Aşağıda için çıktı 3 < n < 35. Kırmızı daireler normal altıgenlerin etrafına eklenenlerdir.

diskler



1
81655 nolu kullanıcının cevabında bahsettiğim gibi, 22'deki (ve 17, 25, 28, 31, 34) çıkıntılı tek dairenin oturduğu daire sırasının ortasına yerleştirilmesi daha iyi olacaktır.
Seviye Nehri St

Ben de öyle düşünmüştüm, fakat sonra bir çıkıntılı daireye sahip olan 9'un da doğru olduğunu düşündüm. Biraz zamanım olduğunda, dışbükey gövdelerinin (merkezlerin) ölçümlerini karşılaştıracağım.
DavidC

9'da çıkıntılı daire, düz sıra boyunca 1/4 veya 3/4'tür, bu nedenle farketmez. 17, 22, 25, 28, 31'de çıkıntı yapan daire 1/6, 3/6 veya 5/6 boyuncadır, bu nedenle orta konum daha iyidir (bir ipi yana doğru çekmeyi düşünün: ortadan çekmek daha kolaydır, çünkü Dize yapmak için daha az uzantıya sahipse, 34 (ve 35) 'de düz taraf boyunca 1/8, 3/8, 5/8 ve 7/8 vardır, bu nedenle bunlar için 3/8 ve 5/8 seçmeliyiz 1/8 ve 7/8'den önce
Seviye Nehri St

Kesinlikle haklısın ve bu ölçümlerle onaylandı.
DavidC

Bu harika! 30-> 31 geçişi, sadece önceki şekle giremediğimizi ve dışına bir daire ekleyemeyeceğimizi gösteriyor (bu, 16.464'te bir sınır verecekti.) dışarıda, ancak farklı bir düzenleme seçti: 12-> 13
Level River St
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.