Vòng tròn đóng gói


21

Hãy nhìn vào hình ảnh này. Cụ thể, tại cách các lỗ trên các đầu được sắp xếp.

nhập mô tả hình ảnh ở đây

( Nguồn hình ảnh )

Lưu ý cách các đường ống trong hình ảnh này được đóng gói theo mô hình lục giác. Được biết , trong 2D, một mạng lục giác là nơi chứa các vòng tròn dày đặc nhất. Trong thử thách này, chúng tôi sẽ tập trung vào việc giảm thiểu chu vi của một vòng tròn. Một cách hữu ích để hình dung chu vi là tưởng tượng đặt một dải cao su xung quanh bộ sưu tập các vòng tròn.

Nhiệm vụ

Cho một số nguyên dương nlàm đầu vào, hiển thị một tập hợp các nvòng tròn được đóng gói càng chặt chẽ càng tốt.

Quy tắc và làm rõ

  • Giả sử các vòng tròn có đường kính 1 đơn vị.
  • Biến được thu nhỏ là chiều dài của chu vi, được xác định là thân lồi của tâm của các vòng tròn trong nhóm. Hãy nhìn vào hình ảnh này:

nhập mô tả hình ảnh ở đây

Ba đường tròn trên một đường thẳng có chu vi là 4 (vỏ lồi là hình chữ nhật 2x0 và 2 được tính hai lần), những đường tròn được sắp xếp theo góc 120 độ có chu vi khoảng 3,85 và tam giác có chu vi chỉ có 3 chiếc. Lưu ý rằng tôi đang bỏ qua các đơn vị pi bổ sung rằng chu vi thực tế sẽ là do tôi chỉ nhìn vào tâm của các vòng tròn chứ không phải các cạnh của chúng.

  • Có thể (và gần như chắc chắn sẽ có) nhiều giải pháp cho bất kỳ n. Bạn có thể xuất bất kỳ thứ nào trong số này theo ý của bạn. Định hướng không quan trọng.
  • Các vòng tròn phải nằm trên một mạng lục giác.
  • Các vòng tròn phải có đường kính ít nhất 10 pixel và có thể được lấp đầy hoặc không.
  • Bạn có thể viết một chương trình hoặc một chức năng.
  • Đầu vào có thể được lấy thông qua STDIN, dưới dạng đối số chức năng hoặc tương đương gần nhất.
  • Đầu ra có thể được hiển thị hoặc xuất ra một tập tin.

Ví dụ

Dưới đây tôi có ví dụ đầu ra hợp lệ không hợp lệ cho n từ 1 đến 10 (ví dụ hợp lệ chỉ cho năm đầu tiên). Các ví dụ hợp lệ ở bên trái; mỗi ví dụ bên phải có chu vi lớn hơn ví dụ hợp lệ tương ứng.

nhập mô tả hình ảnh ở đây

Rất cám ơn steveverrill đã giúp đỡ viết bài thách thức này. Chúc mừng đóng gói!


3
Chờ đợi trên Hexagony, tôi đang đặt cược. ; D
Addison Crump

@VoteToC Đóng: Tôi không nghĩ Hexagony có đầu ra đồ họa, nhưng MAN, điều đó thật tuyệt vời!
El'endia Starman

@ El'endiaStarman Chà, bạn có thể viết một SVG cho thiết bị xuất chuẩn, nhưng tôi không nghĩ rằng tôi sẽ ...: P
Martin Ender

1
Wow, không ai đã cảm ơn tôi một cách táo bạo cho ý kiến ​​của tôi trong hộp cát trước đây. Tôi đỏ mặt: Tất nhiên tôi đã nhận xét vì tôi thích thử thách, mặc dù tôi không chắc liệu mình có kịp trả lời không.
Cấp sông St

Theo cuộc thảo luận của tôi với Reto Koradi về câu trả lời của người dùng, tôi nghĩ rằng hình lục giác lớn nhất mà chúng ta sẽ thấy với các góc nhọn là chiều dài 7d (8 vòng tròn.) Đó là tổng số N = 169 vòng tròn. Bạn có thể xem xét việc hạn chế vấn đề với con số đó, điều này sẽ mang lại nhiều cơ hội nhận được câu trả lời chính xác (hiện tại không có) và có thể kiểm tra. Mặt khác, có thể thú vị hơn khi để vấn đề mở ra cho tùy ý N.
Level River St

Câu trả lời:


4

Toán học 295 950 byte

Lưu ý: Phiên bản vẫn được đánh gôn này giải quyết các vấn đề do Steve Merrill nêu ra liên quan đến những nỗ lực trước đây của tôi.

Mặc dù đây là một cải tiến so với phiên bản đầu tiên, nhưng nó sẽ không tìm thấy cấu hình tay cầm dày nhất mà người ta sẽ tìm kiếm một hình tròn, thay vì hình lục giác, tổng thể.

Nó tìm giải pháp bằng cách xây dựng một hình lục giác bên trong hoàn chỉnh (cho n> = 6, và sau đó kiểm tra tất cả các cấu hình để hoàn thành lớp vỏ bên ngoài với các vòng tròn còn lại.

Thật thú vị, như Steve Merrill đã lưu ý trong các bình luận, giải pháp cho các n+1vòng tròn không phải lúc nào cũng bao gồm giải pháp cho n vòng tròn với một vòng tròn khác được thêm vào. So sánh giải pháp đã cho cho 30 vòng tròn với giải pháp đã cho cho 31 vòng tròn. (Lưu ý: có một giải pháp duy nhất cho 30 vòng tròn.)

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

Một số kiểm tra đòi hỏi phải so sánh hơn một trăm nghìn trường hợp cho một giá trị n (bao gồm cả đối xứng). Mất khoảng 5 phút để chạy tổng cộng 34 trường hợp thử nghiệm. Không cần phải nói, với n'scách tiếp cận mạnh mẽ hơn này sẽ sớm chứng minh không thực tế. Cách tiếp cận hiệu quả hơn là chắc chắn tồn tại.

Các con số ở bên phải của mỗi bao bì là chu vi của các thân lồi màu xanh tương ứng. Dưới đây là đầu ra cho 3 < n < 35. Các vòng tròn màu đỏ là những hình được thêm vào xung quanh một hình lục giác thông thường.

đĩa



1
Như tôi đã đề cập trên câu trả lời của người dùng 81655, vòng tròn đơn nhô ra trên 22 (và 17, 25, 28, 31, 34) sẽ được đặt tốt hơn ở giữa hàng vòng tròn mà nó nằm.
Cấp sông St

Tôi cũng nghĩ vậy, nhưng sau đó tôi lưu ý rằng 9, cũng có một vòng tròn nhô ra được coi là chính xác. Khi tôi có thời gian, tôi sẽ so sánh các phép đo của vỏ lồi (của các trung tâm).
DavidC

trong 9 vòng tròn nhô ra là 1/4 hoặc 3/4 dọc theo hàng phẳng, do đó nó không tạo ra sự khác biệt. trong 17, 22, 25, 28, 31 vòng tròn nhô ra là 1/6, 3/6 hoặc 5/6, do đó, vị trí giữa sẽ tốt hơn (nghĩ về việc kéo một chuỗi sang một bên: dễ dàng kéo từ giữa hơn vì điều đó dễ dàng hơn Cách chuỗi có ít phần mở rộng hơn. Trong 34 (và 35), chúng ta có 1/8, 3/8, 5/8 và 7/8 dọc theo mặt phẳng. Vì vậy, chúng ta nên chọn 3/8 và 5/8 trước ngày 1/8 và 7/8.
Cấp sông St

Bạn hoàn toàn đúng và điều này được xác nhận bằng các phép đo.
DavidC

Điều này thật tuyệt! Quá trình chuyển đổi 30-> 31 cho thấy rằng chúng ta không thể lấy hình dạng trước đó và thêm một vòng tròn ra bên ngoài (sẽ có chu vi là 16.464.) Cũng có ít nhất một trường hợp bạn có thể thêm một vòng tròn vào bên ngoài, nhưng đã chọn một cách sắp xếp khác: 12-> 13
Level River St
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.