กลุ่มบรรจุภัณฑ์


21

ลองดูที่ภาพนี้ โดยเฉพาะอย่างยิ่งวิธีการจัดหลุมที่ปลาย

ป้อนคำอธิบายรูปภาพที่นี่

( แหล่งรูปภาพ )

สังเกตว่าท่อในภาพนี้บรรจุในรูปแบบหกเหลี่ยมได้อย่างไร เป็นที่ทราบกันดีว่าใน 2 มิติโครงตาข่ายหกเหลี่ยมนั้นเป็นที่บรรจุวงกลมที่หนาแน่นที่สุด ในความท้าทายนี้เราจะมุ่งเน้นไปที่การลดขอบเขตของวงกลมให้เหลือน้อยที่สุด วิธีหนึ่งที่มีประโยชน์ในการมองเห็นเส้นรอบนอกคือการจินตนาการให้ใส่ยางรัดรอบคอลเลกชันของวงกลม

งาน

รับค่าnเป็นจำนวนเต็มบวกเป็นอินพุตแสดงชุดของnวงกลมที่อัดแน่นที่สุด

กฎและคำชี้แจง

  • สมมติว่าวงกลมมีเส้นผ่านศูนย์กลาง 1 หน่วย
  • ตัวแปรที่จะย่อเล็กสุดคือความยาวของเส้นรอบวงซึ่งถูกกำหนดให้เป็นฮัลล์นูนของกึ่งกลางของวงกลมในกลุ่ม ดูรูปนี้:

ป้อนคำอธิบายรูปภาพที่นี่

วงกลมสามวงในแนวเส้นตรงมีเส้นรอบวงของ 4 (ตัวเรือนูนเป็นสี่เหลี่ยมผืนผ้า 2x0 และ 2 นับเป็นสองเท่า) ที่จัดเรียงในมุม 120 องศาจะมีเส้นรอบวงประมาณ 3.85 และสามเหลี่ยมมีเส้นรอบวง เพียง 3 หน่วย โปรดทราบว่าฉันไม่สนใจหน่วย pi เพิ่มเติมที่ขอบเขตปริมณฑลที่แท้จริงจะเป็นเพราะฉันแค่ดูที่ศูนย์กลางของวงกลมไม่ใช่ขอบของพวกเขา

  • อาจมี (และเกือบจะแน่นอนจะ) nการแก้ปัญหาหลายสำหรับการใดก็ตาม คุณสามารถส่งออกสิ่งเหล่านี้ตามดุลยพินิจของคุณ การวางแนวไม่สำคัญ
  • วงกลมจะต้องอยู่บนโครงตาข่ายหกเหลี่ยม
  • วงกลมต้องมีเส้นผ่านศูนย์กลางอย่างน้อย 10 พิกเซลและอาจมีการเติมได้หรือไม่
  • คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่น
  • อินพุตอาจถูกใช้ผ่าน STDIN เป็นอาร์กิวเมนต์ฟังก์ชันหรือเทียบเท่าที่ใกล้เคียงที่สุด
  • เอาท์พุทอาจจะปรากฏขึ้นหรือส่งออกไปยังไฟล์

ตัวอย่าง

ด้านล่างฉันมีตัวอย่างเอาต์พุตที่ถูกต้องและไม่ถูกต้องสำหรับ n ตั้งแต่ 1 ถึง 10 (ตัวอย่างที่ถูกต้องสำหรับห้ารายการแรกเท่านั้น) ตัวอย่างที่ถูกต้องอยู่ทางซ้าย ทุกตัวอย่างทางด้านขวามีเส้นรอบวงมากกว่าตัวอย่างที่ใช้ได้

ป้อนคำอธิบายรูปภาพที่นี่

ขอบคุณสตีฟเวอร์ริลล์มากสำหรับความช่วยเหลือในการเขียนความท้าทายนี้ มีความสุขบรรจุ!


3
รอ Hexagony ฉันเดิมพัน ; D
Addison Crump

@VoteToClose: ฉันไม่คิดว่า Hexagony จะมีกราฟิกเอาท์พุท แต่ MAN นั่นจะยอดเยี่ยม!
El'endia Starman

@ El'endiaStarman เอาละคุณสามารถเขียน SVG เพื่อ stdout ได้ แต่ฉันไม่คิดว่าฉันจะไป ... : P
Martin Ender

1
ว้าวไม่มีใครขอบคุณตัวหนาสำหรับความคิดเห็นของฉันในกล่องทรายมาก่อน ฉันหน้าแดง :-D แน่นอนว่าฉันแสดงความคิดเห็นเพราะฉันชอบความท้าทาย แต่ฉันไม่แน่ใจว่าฉันจะมีเวลาตอบคำถามหรือไม่
เลเวลริเวอร์

ตามการสนทนาของฉันกับ Reto Koradi จากคำตอบของ user81655 ฉันคิดว่ารูปหกเหลี่ยมที่ใหญ่ที่สุดที่เราจะเห็นด้วยมุมที่คมชัดคือ sidelength 7d (8 แวดวง) นั่นคือ N = 169 วงกลมทั้งหมด คุณสามารถพิจารณา จำกัด ปัญหาให้กับหมายเลขนั้นซึ่งจะให้โอกาสมากขึ้นในการรับคำตอบที่ถูกต้อง (ปัจจุบันยังไม่มีข้อใดข้อหนึ่ง) และสามารถตรวจสอบได้ ในทางกลับกันมันอาจน่าสนใจกว่าที่จะปล่อยให้ปัญหาเปิดขึ้นโดยพลการ N.
Level River St

คำตอบ:


4

Mathematica 295 950 ไบต์

หมายเหตุ: ฉบับนี้ยังคงเป็นเรื่องของปัญหาที่สตีฟเมอร์ริลพูดถึงเกี่ยวกับความพยายามครั้งก่อนของฉัน

แม้ว่าจะเป็นการปรับปรุงในเวอร์ชันแรก แต่จะไม่พบการกำหนดค่าการจัดการที่หนาแน่นที่สุดโดยที่หนึ่งจะหารูปวงกลมแทนที่จะเป็นรูปทรงหกเหลี่ยมโดยรวม

ค้นหาวิธีแก้ปัญหาด้วยการสร้างรูปหกเหลี่ยมด้านในที่สมบูรณ์ (สำหรับ n> = 6 จากนั้นตรวจสอบการกำหนดค่าทั้งหมดสำหรับการทำเปลือกนอกด้วยวงกลมที่เหลือ

สิ่งที่น่าสนใจอย่างที่ Steve Merrill ได้กล่าวไว้ในความคิดเห็นนั้นการแก้ปัญหาสำหรับn+1แวดวงนั้นไม่ได้รวมถึงการแก้ปัญหาสำหรับแวดวง n ที่เพิ่มแวดวงอื่นอีกด้วย เปรียบเทียบโซลูชันที่กำหนดสำหรับ 30 วงกลมกับโซลูชันที่กำหนดสำหรับ 31 วงกลม (หมายเหตุ: มีวิธีแก้ปัญหาเฉพาะสำหรับ 30 วงกลม)

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]]]

เช็คบางรายการมีการเปรียบเทียบมากกว่าหนึ่งแสนคดีสำหรับค่าเดียวของ n (รวมถึงสมมาตร) ใช้เวลาประมาณ 5 นาทีในการเรียกใช้กรณีทดสอบทั้งหมด 34 กรณี ไม่จำเป็นต้องพูดด้วยn'sวิธีการที่ใช้กำลังดุร้ายที่ใหญ่กว่านี้ในไม่ช้าก็จะพิสูจน์ได้ว่าทำไม่ได้ วิธีการที่มีประสิทธิภาพมากขึ้นแน่นอนอยู่

ตัวเลขทางด้านขวาของการบรรจุแต่ละอันคือขอบเขตของลำตัวนูนสีน้ำเงินที่เกี่ยวข้อง 3 < n < 35ด้านล่างเป็นผลลัพธ์สำหรับ วงกลมสีแดงนั้นถูกเพิ่มเข้ามารอบหกเหลี่ยมปกติ

ดิสก์



1
ดังที่ฉันได้กล่าวถึงคำตอบของผู้ใช้ 81655 แล้ววงกลมเดี่ยวที่ยื่นออกมาในวันที่ 22 (และ 17, 25, 28, 31, 34) จะถูกวางไว้ที่กลางแถวของวงกลมที่อยู่
เลเวลริเวอร์เซนต์

ฉันก็คิดเช่นนั้น แต่จากนั้นฉันสังเกตว่า 9 ซึ่งมีวงกลมที่ยื่นออกมาก็ถือว่าถูกต้อง เมื่อฉันมีเวลาฉันจะเปรียบเทียบการวัดลำตัวนูน (ของกึ่งกลาง)
DavidC

ใน 9 วงกลมที่ยื่นออกมาอาจเป็น 1/4 หรือ 3/4 ตามแนวราบดังนั้นจึงไม่แตกต่างกัน ใน 17, 22, 25, 28, 31 วงกลมที่ยื่นออกมาคือ 1/6, 3/6 หรือ 5/6 ตามดังนั้นตำแหน่งตรงกลางจะดีกว่า (คิดเกี่ยวกับการดึงสตริงด้านข้าง: มันง่ายกว่าที่จะดึงออกมาจากกลางเพราะมัน วิธีที่สตริงมีส่วนขยายน้อยกว่าให้ทำใน 34 (และ 35) เรามี 1/8, 3/8, 5/8 และ 7/8 ตามแนวราบดังนั้นสำหรับสิ่งเหล่านี้เราควรเลือก 3/8 และ 5/8 ก่อน 1/8 และ 7/8
ระดับแม่น้ำเซนต์

คุณพูดถูกและยืนยันด้วยการวัด
DavidC

นี่มันเจ๋งมาก! ช่วงการเปลี่ยนภาพ 30-> 31 แสดงให้เห็นว่าเราไม่สามารถนำรูปร่างก่อนหน้านี้และเพิ่มวงกลมไปด้านนอก (ซึ่งจะให้ปริมณฑลของ 16.464) นอกจากนี้ยังมีกรณีอย่างน้อยหนึ่งกรณีที่คุณสามารถเพิ่มวงกลมหนึ่งวงไปยัง ภายนอก แต่เลือกการจัดเรียงที่แตกต่างกัน: 12-> 13
ระดับแม่น้ำเซนต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.