Vẽ lưới 3d - Chất rắn Platonic


14

Đây là phiên bản cơ bản của lưới 3d Vẽ khá khó khăn - Chất rắn Archimedean .

Tôi có một điểm yếu đối với lưới 3d mà khi cắt ra và gấp lại cho phép bạn tạo các hình dạng 3d bằng giấy hoặc thẻ. Nhiệm vụ rất đơn giản, hãy viết chương trình ngắn nhất mà bạn có thể vẽ lưới cho 5 chất rắn Platonic. Đầu ra phải là một tệp hình ảnh ở bất kỳ định dạng hợp lý nào bạn chọn (png, jpg, v.v.).

Tất cả năm hình được mô tả tại http://en.wikipedia.org/wiki/Platonic_solid . Lưới của họ trông như thế này (lấy từ http://www.newscientist.com/gallery/unfolding-the-earth/2 ).

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

Dữ liệu vào: Một số nguyên từ 1 đến 5. Giả sử các hình được đánh số theo thứ tự số cạnh mà chúng có. Vì vậy, 1 sẽ là một tứ diện và 5 khối icosahedron.

Đầu ra: Một tệp hình ảnh chứa mạng cho hình dạng đó. Chỉ cần phác thảo bao gồm các dòng nội bộ là OK. Không cần phải điền nó với màu sắc

Bạn có thể sử dụng bất kỳ ngôn ngữ lập trình nào bạn thích cũng như bất kỳ thư viện nào không được tạo ra đặc biệt cho cuộc thi này. Cả hai nên có sẵn miễn phí tuy nhiên (theo cả hai nghĩa) trực tuyến.

Tôi sẽ chấp nhận câu trả lời với số lượng ký tự nhỏ nhất trong đúng một tuần.

Người chiến thắng. Chỉ có một người đăng ký nhưng thật tuyệt vời. Người chiến thắng là ... Raufio cho mảnh golf mã yêu thích của tôi từ trước đến giờ.

Câu trả lời:


8

Con trăn, 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")

Tôi đã triển khai một trình thông dịch nguyên thủy với các l r f btoán tử di chuyển con trỏ rùa xung quanh theo góc của các hình. Tại một thời điểm, nó chỉ quay một góc. Tôi đã nén các chuỗi bằng cách sử dụng lại các chuỗi (giống như các chương trình con psuedo), ngoài ra, tôi không kiểm tra xem liệu tôi có đang sử dụng đường dẫn tốt nhất không. Nó xuất ra một tập tin postcript.

Một lời giải thích nhỏ về mã không chơi gôn:

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

Nhập mô-đun rùa tích hợp và xác định các macro rút ngắn chuỗi. Mô-đun rùa sử dụng các lệnh để di chuyển một 'rùa' xung quanh màn hình (tức là chuyển tiếp (100), trái (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
]

Danh sách này giữ các góc và trình tự chuyển động. Các tứ diện đã được lưu để tái sử dụng với các bát diện.

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

Đây là phần mà tôi thích, nó tạo ra các hàm cục bộ ký tự đơn để các cuộc gọi có thể được rút ngắn và tự động thông qua các chuỗi được xác định trước.

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

Điều này bắt đầu bằng cách lấy đầu vào (từ 1 đến 5) và chuyển đổi nó thành một chỉ mục trỏ đến chuỗi hình dạng trong netList. Những thiết lập rùa để hiển thị toàn bộ mạng. Chúng có thể bị bỏ đi nếu nhiệm vụ chỉ là vẽ chúng, nhưng vì chúng ta cần một đầu ra hình ảnh nên chúng cần thiết.

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

Vòng lặp for nhận các lệnh trong chuỗi chuỗi lệnh và thực thi chúng, vì vậy đối với một chuỗi như "fl", điều này thực thi "về phía trước (góc); trái (góc);" bằng cách gọi các hàm cục bộ mới được tạo. dòng cuối cùng xuất ra một tệp có tên 'o' ở định dạng mô tả bằng cách sử dụng chức năng rùa.

Để chạy :

Sao chép nó vào một tập tin và chạy nó từ đó. Khi bạn chạy nó, nó sẽ đợi một đầu vào số từ 1 đến 5 (tôi chỉ thay đổi nó để nó hỏi trước khi thiết lập rùa). Khi bạn nhập một số, một cửa sổ bật lên và vẽ lưới. nếu bạn muốn nó đi nhanh hơn bạn có thể thêm t.speed(200)trước đó setup.

Bạn có thể sao chép-dán nó vào trình thông dịch, nhưng khi raw_input()được gọi, nó sẽ tiêu thụ chuỗi tiếp theo bạn nhập "t.setup(.9,.9)"thay vì số. Vì vậy, nếu bạn làm điều này, sao chép cho đến khi raw_input(), nhập một số, hơn là sao chép dán phần còn lại. Nó được dự định để được chạy như một toàn thể. Hoặc bạn có thể sao chép nó vào một chức năng và gọi nó.

Đây là kết quả đầu ra (được chuyển đổi từ postcript):

Lưu ý: vị trí của những thứ này trong cửa sổ đã thay đổi, nhưng hình dạng tổng thể của chúng là như nhau.

tứ diện khối lập phương khối tám mặt khối mười hai mặt nhựa thông

Đó là một chút sức mạnh cho golf mã, nhưng tôi đã mệt mỏi khi cố gắng tìm một mô hình nhất quán giữa các hình dạng.


Rất gần. Dodecahedron chắc chắn là khó khăn hơn.
felipa

@Raufio Nó rất đẹp. Có phải là không thể xác định một hình tam giác (hoặc hình vuông hoặc hình ngũ giác) và sau đó chỉ cần xoay / di chuyển nó về? Hay đó là hiệu quả những gì bạn đã làm?
felipa

Thực tế, đó là những gì tôi đã làm, nhưng với hình dạng lớn hơn. Chẳng hạn, hình chữ nhật được vẽ bằng cách vẽ hai hình tam giác, một hình trên đỉnh và di chuyển về phía trước 5 lần, sau đó đặt lại tại một vị trí mới, vẽ lại viên kim cương di chuyển trở lại sau đó lặp lại 5 lần. dlà chuỗi thực hiện hai hình tam giác, vì vậy nó là(d+'f')*5+setupPosition+(d+'b')*5
Raufio

@Raufio Mã golf không hoạt động đối với tôi. Nó mở một cửa sổ hầu như trống. Nếu sau đó nhấn return, tôi nhận được p = (ord (raw_input ()) - 49) * 2 TypeError: ord () mong đợi một ký tự, nhưng chuỗi có độ dài 0 được tìm thấy
felipa

1
@felipa setuplàm cho cửa sổ rùa đủ lớn để giữ lưới. Điều tương tự với goto, nó di chuyển 'con rùa' đến -200, 150. clearxóa dòng được tạo bởi goto. Họ chỉ cần lệnh để thiết lập bản vẽ. p=(ord(raw_input())-49)*2lấy một số, từ 1 đến 5, tương ứng với hình dạng bạn muốn.
Raufio

6

Toán học

Không có cạnh tranh, không phải là ngôn ngữ miễn phí (trừ khi dùng thử miễn phí được tính là miễn phí)

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

Sử dụng:

f /@ Range@5

Đồ họa toán học


1
Mathematica chắc chắn không miễn phí theo cả hai nghĩa. Câu trả lời rất hay tuy nhiên.
felipa

@felipa nó miễn phí như trong bia trên Raspberry Pi.
shrx

bạn đã biết, trên máy tính miễn phí, pi mâm xôi
undergroundmonorail

6

Python 2 (với 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')

Các kết quả:

các kết quả


3

Logo, 199 byte

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

Đọc lại tôi thấy phiên bản gốc của tôi không tuân thủ thông số kỹ thuật như đã viết (lấy một đối số bằng số và vẽ một hình) mà thay vào đó là một số câu trả lời khác (vẽ tất cả các hình dạng.) Phiên bản mới sửa lỗi này. Nó hy vọng sẽ được gọi là ví dụ q 5.csnên được thực hiện trước để xóa màn hình và chỉ con rùa về phía bắc.

q gọi chức năng chính p với 3 đối số. Cú pháp cho điều này là khá khó hiểu, vì vậy để đánh bại điểm số trước đây của tôi, tôi đã phải loại bỏ các byte ở nơi khác.

phiên bản mới pmất 3 đối số. Không cần xyvì chúng ta chỉ vẽ một mạng, nhưng dkhoảng cách giữa các tiểu đơn vị vẫn còn. s vẫn là số cạnh trên mỗi đa giác và nhiện mã hóa cho hai thứ khác nhau>n/8 là số lượng tiểu đơn vị được vẽ và n*45là một góc mà rùa phải được xoay trước khi bắt đầu (tận dụng mod 360 tự nhiên để quay. )

Cải thiện vòng lặp hoàn thành scác đường vẽ với xoay tay phải vàs+2 các đường với xoay vòng trái trong một vòng lặp.

trình thông dịch calormen dường như ít dung sai khoảng trắng bị thiếu hơn so với thời điểm đăng bài đầu tiên của tôi, nhưng mã chạy tốt trên http://turtleacademy.com/playground/en

Logo, 200 byte

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

Thông dịch viên tại http://www.calormen.com/jslogo/# Người ta cho rằng con rùa đang chỉ hướng Bắc trước khi chương trình được chạy. Sử dụng cslệnh để xóa màn hình, hướng con rùa về phía bắc và đặt nó ở điểm gốc ở giữa màn hình.

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

Đơn vị cơ bản của tất cả các lưới trên là một cặp đa giác back to back. Chúng được sắp xếp thành 2 hàng so le, tạo thành một tiểu đơn vị gồm 4 đa giác có thể được dịch theo chiều dọc để tạo ra tất cả các lưới (ngoại trừ khối tám mặt, cản trở việc đi trên bản vẽ của icosahedron và tứ diện). Tiểu đơn vị tạo thành 1 lưới tứ diện, 1/5 lưới icosahedron, 1/3 lưới dodecahedron và 2/3 lưới lập phương (hai tiểu đơn vị được vẽ, với hai hình vuông ở giữa chồng lên nhau.)

Mã mã

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, cảm ơn, tôi thực sự đã cân nhắc làm một htviệc để ẩn nó cho hình ảnh. Tôi rất vui vì tôi đã không làm thế!
Cấp sông 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.