포장 원


21

이 이미지를보십시오. 구체적으로, 단부의 구멍이 어떻게 배열되는지.

여기에 이미지 설명을 입력하십시오

( 이미지 소스 )

이 이미지의 파이프가 어떻게 육각형 패턴으로 포장되어 있는지 확인하십시오. 2D에서 6 각형 격자는 가장 밀집된 원 으로 알려져 있습니다. 이 과제에서 우리는 원의 묶음의 둘레를 최소화하는 데 중점을 둘 것입니다. 둘레를 시각화하는 유용한 방법 중 하나는 원의 컬렉션 주위에 고무 밴드를 배치하는 것을 상상하는 것입니다.

작업

n입력 으로 양의 정수가 주어지면 n가능한 한 단단히 묶인 원 모음을 표시 하십시오.

규칙 및 설명

  • 원의 지름이 1 단위라고 가정합니다.
  • 최소화 할 변수는 둘레의 길이이며 , 그룹에서 원 중심볼록 껍질 로 정의됩니다 . 이 이미지를 살펴보십시오.

여기에 이미지 설명을 입력하십시오

직선의 3 개의 원은 둘레가 4이고 (볼록 껍질은 2x0 직사각형이고 2는 두 번 계산됩니다) 120도 각도로 배열 된 것은 둘레가 약 3.85이며 삼각형은 둘레가 있습니다 단 3 대만 실제 둘레의 추가 pi 단위는 무시하지만 가장자리가 아닌 원의 중심 만보고 있기 때문입니다.

  • 주어진에 대해 여러 가지 솔루션이있을 수 있습니다 n. 귀하는 임의로 재량에 따라 이들을 출력 할 수 있습니다. 오리엔테이션은 중요하지 않습니다.
  • 원은 육각형 격자 위에 있어야합니다.
  • 원은 지름이 10 픽셀 이상이어야하며 채워지거나 채워지지 않을 수 있습니다.
  • 프로그램이나 함수를 작성할 수 있습니다.
  • STDIN을 통해 입력을 함수 인수 또는 가장 가까운 값으로 가져올 수 있습니다.
  • 출력은 파일로 표시되거나 출력 될 수 있습니다.

아래에는 1에서 10 사이의 n에 대한 유효 하고 유효하지 않은 출력 예가 있습니다 (처음 5 개에만 유효한 예). 유효한 예는 왼쪽에 있습니다. 오른쪽의 모든 예는 해당하는 유효한 예보다 둘레가 더 큽니다.

여기에 이미지 설명을 입력하십시오

이 과제를 작성하는 데 도움을 준 steveverrill에게 감사드립니다. 행복한 포장!


3
Hexagony를 기다리고 있습니다. ; D
애디슨 크럼프

@VoteToClose : Hexagony가 그래픽 출력을 가지고 있다고 생각하지 않지만 MAN은 훌륭합니다!
엘엔 디아 스타 먼

@ El'endiaStarman 글쎄, 당신 수 있었다 stdout에 SVG를 쓸 수는 있지만, 내가 갈 것이라고 생각하지 않습니다 ... : P
Martin Ender

1
와우, 아무도 샌드 박스에 대한 나의 의견에 대해 대담하게 감사하지 않았습니다. 나는 부끄러워 해요 : -D 물론 도전을 좋아했기 때문에 댓글을 달았지만 대답 할 시간이 있는지 확실하지 않습니다.
Level River St

user81655의 답변에 대한 Reto Koradi와의 토론에서 날카로운 모서리로 볼 수있는 가장 큰 육각형은 측면 길이 7d (8 서클)라고 생각합니다. 문제를 그 숫자로 제한하는 것을 고려하면 정답을 얻거나 (현재는 없음) 확인할 수있는 가능성이 높아집니다. 반면에 문제를 임의의 N으로 열어 두는 것이 더 흥미로울 수 있습니다.
Level River St

답변:


4

Mathematica 295950 바이트

참고 :이 골프 용 버전은 Steve Merrill이 이전에 시도한 문제와 관련하여 제기 된 문제를 해결합니다.

첫 번째 버전에 비해 개선되었지만 6 각형이 아닌 전체적인 모양이 아닌 가장 둥근 핸들 구성을 찾지 못합니다.

완전한 내부 육각형 (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 (대칭 포함)에 대해 10 만 건 이상의 사례를 비교했습니다. 총 34 개의 테스트 사례를 실행하는 데 약 5 분이 걸렸습니다. 말할 필요도없이, n's이 무차별 대입 방식이 더 커지면 곧 비실용적 일 것입니다. 보다 효율적인 접근 방식이 존재합니다.

각 포장의 오른쪽에있는 숫자는 각 파란색 볼록 껍질의 둘레입니다. 다음은에 대한 출력입니다 3 < n < 35. 빨간색 원은 일반 육각형 주위에 추가 된 원입니다.

디스크



1
사용자 81655의 답변에서 언급했듯이 22 (및 17, 25, 28, 31, 34)의 튀어 나온 단일 원은 원이 놓인 원의 중간에 더 잘 배치됩니다.
Level River St

나는 또한 그렇게 생각했지만 튀어 나온 원이있는 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 이전
Level River St

당신은 절대적으로 맞으며 이것은 측정에 의해 확인됩니다.
DavidC

대단해! 전환 30-> 31은 우리가 단지 이전 도형을 취할 수 없으며 외부에 원을 추가 할 수 없다는 것을 보여줍니다 (16.464의 둘레를 주었을 것입니다). 외부, 그러나 다른 배열을 선택했다 : 12-> 13
Level River St
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.