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.