3D 네트 그리기-플라톤 솔리드


14

이것은 다소 어려운 Drawing 3d nets-Archimedean solid 의 기본 버전입니다 .

나는 잘라서 접을 때 종이나 카드로 3D 모양을 만들 수있는 3D 그물에 약점이 있습니다. 작업은 간단합니다. 5 Platonic 솔리드의 그물을 그리는 가장 짧은 프로그램을 작성하십시오. 출력은 원하는 형식 (png, jpg 등)으로 된 이미지 파일이어야합니다.

다섯 가지 모양 모두 http://en.wikipedia.org/wiki/Platonic_solid에 설명되어 있습니다. 그들의 그물은 http://www.newscientist.com/gallery/unfolding-the-earth/2 에서 가져온 것 같습니다 .

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

입력 : 1에서 5 사이의 정수 모양의면 수 순서에 따라 모양이 번호를 매 깁니다. 따라서 1은 4 면체이고 5는 20 면체입니다.

출력 : 해당 모양의 그물을 포함하는 이미지 파일. 내부 선을 포함한 외곽선 만 있으면됩니다. 색상으로 채울 필요가 없습니다

이 대회를 위해 특별히 제작되지 않은 라이브러리뿐만 아니라 원하는 프로그래밍 언어를 사용할 수 있습니다. 그러나 둘 다 온라인으로 자유롭게 사용할 수 있어야합니다.

정확히 일주일 안에 가장 적은 수의 문자로 답을 받아들입니다.

우승자. 단 한 명의 참가자이지만 훌륭했습니다. 우승자는 ... Raufio는 내가 가장 좋아하는 코드 골프입니다.

답변:


8

파이썬, 456 429 381

import turtle as t
L="fl"
R="fr"
d=L*3+R*3
b=(d+R)*3
a=[b,120,L*3+"fflflffflflfrflflfffl"+R*4+"flf",90,b+"ffrfrflffrffrfrfrflflf",120,(R*5+L*5+R+L)*5+"rrfr"+L*5+R*2+L*2+R*4+"f",72,(d+"f")*5+"rfl"+((d+"b")*5)[:-1],120]
l=t.lt
f=t.fd
b=t.bk
r=t.rt
p=input()*2-2 
t.setup(.9,.9)
t.goto(-200,150)
t.clear()
for c in a[p]:exec c+"(a[p+1])"
t.getscreen().getcanvas().postscript(file="o")

l r f b터틀 커서를 모양의 각도로 이동시키는 연산자로 기본 인터프리터를 구현했습니다 . 한 번에 한 각도 만 회전합니다. 나는 문자열 (psuedo-subroutines와 같은 종류)을 재사용하여 문자열을 압축했습니다. 포스트 스크립트 파일로 출력됩니다.

골프화되지 않은 코드에 대한 약간의 설명 :

import turtle as t
Left="fl"
Right="fr"
diamond= Left*3 + Right*3
tetrahedron=(d+R)*3 #used to be b

내장 거북이 모듈을 가져오고 문자열을 단축시키는 매크로를 정의합니다. 거북이 모듈은 명령을 사용하여 화면에서 '거북이'를 움직입니다 (예 : 앞으로 (100), 왼쪽 (90))

netList=[
   #tetrahedron
   tetrahedron,120,
   #cube
   Left*3+"fflflffflflfrflflfffl"+Right*4+"flf",90,
   #octohedron, builds off the tetrahedron
   tetrahedron+"ffrfrflffrffrfrfrflflf",120,
   #dodecahedron
   (Right*5 + Left*5 + Right + Left)*5
    +"rrfr"+
    Left*5 + Right*2 + Left*2 + Right*4 + "f",72,
   #icosahedron
   (diamond+"f")*5 +"rfl"+((diamond+"b")*5)[:-1],120
]

이 목록에는 각도와 이동 순서가 있습니다. 4 면체는 8 면체와 재사용하기 위해 저장되었습니다.

l=t.left
f=t.forward
b=t.back
r=t.right

이것은 내가 좋아하는 부분으로, 단일 문자 로컬 기능을 수행하므로 미리 정의 된 문자열을 통해 호출을 단축하고 자동화 할 수 있습니다.

input=int(raw_input())*2-2 
t.setup(.9,.9)
t.goto(-200,150)
t.clear()

입력을 받아 (1에서 5 사이) netList에서 모양 문자열을 가리키는 인덱스로 변환합니다. 이 설정 거북이는 전체 그물을 보여줍니다. 과제를 그리는 것이라면 이것들을 생략 할 수 있지만 그림 출력이 필요하기 때문에 필요합니다.

for command in netList[input]:
    exec command+"(netList[input+1])"
t.getscreen().getcanvas().postscript(file="o")

for 루프는 명령 시퀀스 문자열에서 명령을 가져 와서 실행하므로 "fl"과 같은 문자열의 경우 "forward (angle); left (angle);" 새로 작성된 로컬 함수를 호출하여 마지막 행은 turtle 함수를 사용하여 포스트 스크립트 형식 형식 인 'o'라는 파일을 출력합니다.

실행하려면 :

파일로 복사하여 거기서부터 실행하십시오. 당신이 그것을 실행할 때, 그것은 1에서 5 사이의 숫자 입력을 기다릴 것입니다 (거북을 설정하기 전에 묻도록 방금 변경했습니다). 숫자를 입력하면 창이 나타나고 그물을 그립니다. 더 빨리 가고 싶다면 t.speed(200)전에 추가 할 수 있습니다 setup.

인터프리터에 복사하여 붙여 넣을 수 있지만 raw_input()호출 되면 "t.setup(.9,.9)"숫자 대신 입력 한 다음 문자열을 사용 합니다. 따라서이 작업을 수행 raw_input()하는 경우을 복사하고 나머지는 붙여 넣기보다 숫자를 입력하십시오. 전체적으로 실행되도록 고안되었습니다. 또는 함수에 복사하여 호출 할 수 있습니다.

출력 결과는 다음과 같습니다 (postscript에서 변환 됨).

참고 : 창의 위치는 변경되었지만 전체 모양은 동일합니다.

사면체 입방체 팔면체 십이 면체 정 이십 면체

코드 골프에는 약간의 힘이 있지만 모양 사이에서 일관된 패턴을 찾는 데 지쳤습니다.


아주 근접한. 십이 면체가 더 까다 롭습니다.
felipa

@Raufio 매우 좋습니다. 삼각형 (또는 정사각형 또는 오각형)을 정의한 다음 회전 / 이동할 수 없습니까? 아니면 효과적으로 당신이 한 일입니까?
felipa

실제로, 그렇습니다.하지만 더 큰 모양입니다. 예를 들어, 정 이십 면체는 하나의 삼각형 위에 다른 삼각형 하나를 그리고 5 번 앞으로 이동 한 다음 새 위치에서 재설정하여 다이아몬드를 다시 뒤로 이동 한 다음 5 번 반복하여 그려집니다. d두 개의 삼각형을 수행하는 문자열입니다.(d+'f')*5+setupPosition+(d+'b')*5
Raufio

@Raufio 골프 코드가 작동하지 않습니다. 대부분 비어있는 창을 엽니 다. 그런 다음 return 키를 누르면 p = (ord (raw_input ())-49) * 2 TypeError : ord () 문자를 예상했지만 길이가 0 인 문자열을 찾았습니다
felipa

1
@felipa setup는 거북이 창을 그물을 잡을 수있을만큼 크게 만듭니다. 와 같은 것 goto, 그것은, 150 -200로 '거북이'이동이 clear만든 선을 지 웁니다 goto. 도면 설정을위한 명령입니다. p=(ord(raw_input())-49)*2원하는 모양에 따라 1에서 5까지의 숫자를 사용합니다.
Raufio

6

매스 매 티카

무료 언어가 아닌 경쟁에서 벗어남 ( 무료 평가판무료로 계산 되지 않는 한 )

f[n_] := PolyhedronData[ Sort[PolyhedronData["Platonic", {"FaceCount","StandardName"}]][[n,2]],
                                                                                       "NetImage"]

용법:

f /@ Range@5

Mathematica 그래픽


1
Mathematica는 확실히 어느 쪽이든 자유롭지 않습니다. 그러나 아주 좋은 대답입니다.
felipa

@felipa Raspberry Pi의 맥주와 마찬가지로 무료입니다.
shrx

당신은 그 무료 컴퓨터에서, 라즈베리 파이
undergroundmonorail

6

Python 2 (cairo 포함)-239

from cairo import*
s=PSSurface(None,99,99)
g=Context(s)
g.move_to(30,20)
a=str([34,456,3455,568788,3454445555][input()-1])
f=6.28
for c in a+a[::-1]:exec'g.rel_line_to(8,0);g.rotate(f/int(a[0]));'*int(c);f=-f
g.stroke()
s.write_to_png('o')

결과 :

결과


3

로고, 199 바이트

TO p:d:n:s
rt :n*45 for[i 1 :n/8][pu setxy :d*:i 0 pd repeat 2[for[k 1 :s*2+2][fd 40 rt (360-720*(:k>:s))/:s] rt 720/:s]]END
TO q:j
apply "p item :j [[70 9 3][56 23 4][70 16 3][105 26 5][40 42 3]]END

이 글을 다시 읽었을 때 원래 버전이 작성된 사양 (숫자 인수를 취하고 하나의 모양을 그리는 것)이 아니라 다른 답변 중 일부 (모든 모양을 그리는 것)로 해석 된 것처럼 보입니다. 새로운 버전은 이것을 수정합니다. 예를 들어 호출 될 것으로 예상됩니다 q 5. cs화면을 비우고 거북이를 북쪽으로 향하게하기 전에 수행해야합니다.

q 메인 함수를 호출 p3 개의 인수로 를 . 이것에 대한 문법은 부풀어 오른 것이므로 이전 점수를이기려면 다른 곳에서 바이트를 깎아야했습니다.

새로운 버전 p은 3 개의 인수 를 취합니다. 필요가 없습니다 x그리고 y우리가 하나의 그물을 플롯 때문에,하지만 d서브 유닛 남아 사이의 피치는. s 는 여전히 다각형 당 변의 수이고 n이제는 두 가지 다른 것을 인코딩합니다.> 표시 n/8될 서브 유닛의 수이며, n*45시작하기 전에 거북이를 회전시켜야하는 각도입니다 (회전을 위해 자연 모드 360을 활용). )

향상된 루프 기능 은 단일 회전에서 s오른쪽 회전이있는 s+2선과 왼쪽 회전이있는 선을 그립니다.

칼로리 해석기는 내 첫 번째 게시물보다 공백 누락에 덜 관대 한 것처럼 보이지만 코드는 http://turtleacademy.com/playground/en 에서 정상적으로 실행됩니다.

로고, 200 바이트

TO p:x:y:d:n:s
for[i 1:n][pu setxy:x:y-:d*:i if:i<>6[pd]repeat 2[repeat:s[fd 40 rt 360/:s]repeat:s+2[fd 40 lt 360/:s]rt 720/:s]]END
p 0 200 40 7 3
p 70 0 80 2 3
p -200 200 105 3 5
rt 45
p 90 90 56 2 4

통역사 http://www.calormen.com/jslogo/# 프로그램이 실행되기 전에 거북이가 북쪽을 가리키고 있다고 가정합니다. cs명령을 사용하여 화면을 지우고 거북이를 북쪽으로 향하게 한 다음 화면 중앙의 원점에 배치하십시오.

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

위의 모든 그물의 기본 단위는 한 쌍의 연속적인 다각형입니다. 이것들은 2 개의 엇갈린 행으로 배열되어, 모든 그물을 만들기 위해 수직으로 변환 될 수있는 4 개의 폴리곤의 서브 유닛을 만듭니다 (8 면체 제외). 서브 유닛은 4 면체 그물, 1 면체 그물의 1/5, 12 면체 그물의 1/3 및 큐브 그물의 2/3를 형성합니다 (두 개의 서브 유닛이 그려지고 가운데 두 개의 사각형이 겹칩니다).

Ungolfed 코드

TO p :x :y :d :n :s                 ;x,y=starting point d=negative vertical offset for each iteration n=#of iterations s=# of sides on polygon
  for[i 1 :n][                      ;iterate n times 
    pu                              ;pen up
    setxy :x :y- :d* :i             ;move pen to start of iteration
    if :i<>6[pd]                    ;pen down (supressed for i=6 to enable part of octahedron to be drawn with icosahedron)
    repeat 2[                       ;draw lower row of 2 polygons, then upper row of 2 polygons
      repeat :s[fd 40 rt 360/ :s]   ;starting at lower left of polygon facing up, draw righthand polygon
      repeat :s+2[fd 40 lt 360/ :s] ;starting at lower right of polygon facing up, draw lefthand polygon, duplicating last two sides
      rt 720/ :s                    ;return turtle to upwards facing in order to draw second row
    ]
  ]
END
cs
p 0 200 40 7 3                      ;draw icosahedron and left side of octahedron (6th iteration is suppressed)
p 70 0 80 2 3                       ;draw right side of octahedron, and tetrahedron
p -200 200 105 3 5                  ;draw dodecahedron
rt 45                               ;turn turtle in preparation for drawing cube
p 90 90 56 2 4                      ;draw cube

@ phase haha, 감사합니다. 실제로 ht이미지를 숨기려고 생각했습니다. 내가하지 않은 것이 기쁘다!
Level River St
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.