Çizim 3B Ağlar - Platonik Katılar


14

Bu Arşimet katıları - oldukça zor Çizim 3d ağları temel bir sürümüdür .

Kesip katlandığında kağıt veya karttan 3d şekiller oluşturmanıza izin veren 3d ağlar için bir zayıflığım var. Görev basittir, 5 Platonik katı için ağları çeken mümkün olan en kısa programı yazın. Çıktı, seçtiğiniz herhangi bir mantıklı biçimde (png, jpg, vb.) Bir resim dosyası olmalıdır.

Beş şeklin tamamı http://en.wikipedia.org/wiki/Platonic_solid adresinde açıklanmaktadır . Ağları şöyle görünür ( http://www.newscientist.com/gallery/unfolding-the-earth/2 adresinden alınmıştır ).

resim açıklamasını buraya girin

Girdi: 1 ile 5 arasında bir tamsayı. Şekillerin sahip oldukları kenar sayısına göre numaralandığını varsayın. Yani, 1 tetrahedron ve 5 icosahedron olacaktır.

Çıktı: Bu şekle ilişkin ağı içeren bir görüntü dosyası. Sadece iç çizgileri içeren anahat tamam. Renklerle doldurmaya gerek yok

Beğendiğiniz herhangi bir programlama dilini ve özellikle bu yarışma için hazırlanmamış herhangi bir kütüphaneyi kullanabilirsiniz. Ancak her ikisi de çevrimiçi olarak (her iki anlamda) serbestçe kullanılabilir olmalıdır.

Tam bir hafta içinde en az karakter içeren cevabı kabul edeceğim.

Kazanan. Sadece bir katılımcı ama harikaydı. Kazanan ... En sevdiğim kod golf parçası için Raufio.

Yanıtlar:


8

Python, 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 bKaplumbağa imlecini şekillerin açısıyla hareket ettiren operatörler ile ilkel bir yorumlayıcı uyguladım . Bir kerede, sadece bir açıyı döndürür. Ben dizeleri (psuedo-subroutines gibi) yeniden kullanarak dizeleri sıkıştırdı, bunun dışında, ben en iyi yolu kullanıp kullanmadığımı kontrol etmedi. Bir postscript dosyasına çıktı verir.

Golf kodunun küçük bir açıklaması:

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

Yerleşik kaplumbağa modülünü içe aktarır ve dizeleri kısaltan makroları tanımlar. Kaplumbağa modülü, bir 'kaplumbağayı' ekranın etrafında hareket ettirmek için komutları kullanır (yani ileri (100), sola (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
]

Bu liste açıları ve hareket dizilerini tutar. Tetrahedron, oktohedren ile yeniden kullanılmak üzere kurtarıldı.

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

Bu benim sevdiğim kısmı, tek karakter yerel fonksiyonları yapar böylece aramalar önceden tanımlanmış dizeleri ile kısaltılabilir ve otomatikleştirilebilir.

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

Bu, girdiyi alarak (1 ile 5 arasında) ve bunu netList'teki şekil dizesine işaret eden bir dizine dönüştürerek başlar. Bu kurulum kaplumbağa tüm net göstermek için. Görev sadece onları çizmekse bunlar dışarıda bırakılabilir, ancak bir resim çıktısına ihtiyacımız olduğundan bunlara ihtiyaç vardır.

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

For döngüsü, komut dizisi dizesindeki komutları alır ve yürütür, bu nedenle "fl" gibi bir dize için bu, "ileri (açı); sol (açı);" yeni oluşturulan yerel işlevleri çağırarak. son satır, kaplumbağa işlevini kullanarak postscript formatında olan 'o' adlı bir dosya çıkarır.

Çalıştırmak için :

Bir dosyaya kopyalayın ve oradan çalıştırın. Çalıştırdığınızda, 1 ile 5 arasında bir sayı girişi bekleyecektir (kaplumbağayı kurmadan önce soracak şekilde değiştirdim). Bir sayı girdiğinizde, bir pencere açılır ve ağı çizer. daha hızlı gitmesini istiyorsanız daha t.speed(200)önce ekleyebilirsiniz setup.

Yorumlayıcıya kopyalayıp yapıştırabilirsiniz, ancak raw_input()çağrıldığında "t.setup(.9,.9)"sayı yerine girdiğiniz bir sonraki dizeyi tüketir . Bunu yaparsanız raw_input(), geri kalanını kopyalamak yerine bir sayı girin, kadar kopyalayın. Bir bütün olarak çalıştırılması amaçlanmıştır. Ya da bir işleve kopyalayıp çağırabilirsiniz.

İşte çıktıları (postscript'den dönüştürülür):

Not: Bunların penceredeki konumu değişti, ancak genel şekilleri aynı.

dört yüzlü şekil küp sekizyüzlü oniki yüzlü şekil ikosahedron

Kod golf için küçük bir kaba kuvvet, ama şekiller arasında tutarlı bir desen bulmaya çalışmaktan yoruldum.


Çok yakın. Dodecahedron kesinlikle daha zor.
felipa

@Raufio Çok güzel. Bir üçgen (veya kare veya beşgen) tanımlamak ve sonra sadece döndürmek / hareket ettirmek mümkün değil mi? Yoksa yaptığınız şey etkili mi?
felipa

Etkili, evet ben yaptım, ama daha büyük şekillerle. Örneğin, ikosahedron, biri üst üste iki üçgen çizerek ve 5 kez ileriye doğru hareket edip yeni bir yerde sıfırlayarak, elmayı tekrar hareket ettirip 5 kez tekrarlayarak çizilir. diki üçgeni yapan dizedir, bu yüzden(d+'f')*5+setupPosition+(d+'b')*5
Raufio

@Raufio Golf kodu benim için çalışmıyor. Çoğunlukla boş bir pencere açar. Daha sonra return tuşuna basarsam p = (ord (raw_input ()) - 49) * 2 TypeError: ord () bir karakter bekleniyordu, ancak uzunluk dizesi 0 bulundu
felipa

1
@felipa setup, kaplumbağa penceresinin ağı tutacak kadar büyük olmasını sağlar. Aynı şekilde goto, 'kaplumbağayı' -200, 150'ye taşır . clearTarafından yapılan çizgiyi temizler goto. Çizimleri ayarlamak için sadece komutları. p=(ord(raw_input())-49)*2istediğiniz şekle karşılık gelen 1'den 5'e kadar bir sayı alır.
Raufio

6

Mathematica

Yarışma dışı, özgür bir dil değil ( ücretsiz deneme ücretsiz sayılmazsa )

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

Kullanımı:

f /@ Range@5

Mathematica grafikleri


1
Mathematica her iki anlamda da kesinlikle özgür değildir. Ancak çok güzel bir cevap.
felipa

@felipa Ahududu Pi bira gibi ücretsizdir.
shrx

bilirsiniz, bu ücretsiz bilgisayarda, ahududu pi
undergroundmonorail

6

Python 2 (kahire ile) - 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')

Sonuçlar:

Sonuçlar


3

Logo, 199 bayt

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

Bunu geri okuduğumda, orijinal versiyonumun yazılı olarak spesifikliğe uymadığını (sayısal bir argüman alın ve bir şekil çizin) değil, diğer cevapların bazılarının (tüm şekilleri çizin) yorumladığı gibi görüyorum. Örneğin çağrılması bekleniyor q 5. csekranı temizlemek ve kaplumbağayı kuzeye doğrultmak için daha önce yapılmalıdır.

qana işlevi p3 argümanla çağırır . Bunun sözdizimi oldukça şişkin, bu yüzden önceki puanımı yenmek için başka bir yerde baytları tıraş etmek zorunda kaldım.

yeni sürümü p3 argüman alır. Gerek yok xve ysadece bir ağ dçizdiğimiz için alt üniteler arasındaki adım kaldı. s hala çokgen başına kenar sayısıdır ve nşimdi iki farklı şeyi kodlamaktadır> n/8çizilecek alt birim sayısıdır ve n*45başlamadan önce kaplumbağanın çevrilmesi gereken bir açıdır (rotasyonlar için doğal mod 360'tan yararlanılarak). )

İyileştirilmiş döngü , tek bir döngüde ssağ el döndürmeli çizim çizgileri ve s+2sol el döndürmeli çizgiler gerçekleştirir.

kalormen tercümanı şu anda ilk yazıma göre daha az boşluk bırakmaya daha az toleranslı görünüyor, ancak kod http://turtleacademy.com/playground/tr adresinde iyi çalışıyor

Logo, 200 bayt

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

Tercüman http://www.calormen.com/jslogo/# Program çalıştırılmadan önce kaplumbağanın kuzeyi işaret ettiği varsayılmaktadır. csEkranı temizlemek, kaplumbağayı kuzeye doğrultmak ve ekranın ortasındaki başlangıç ​​noktasına yerleştirmek için komutu kullanın .

resim açıklamasını buraya girin

Yukarıdaki tüm ağların temel birimi arka arkaya çokgenlerdir. Bunlar 2 kademeli sıra halinde düzenlenmiş ve tüm ağları yapmak için dikey olarak çevrilebilen 4 poligonun bir alt birimi haline getirilmiştir (icosahedron ve tetrahedronun çizimine binen oktahedron hariç). Alt birim 1 tetrahedron ağı, 1/5 icosahedron ağı, dodekahedron ağının 1 / 3'ü ve küp ağının 2 / 3'üdür (ortadaki iki kare üst üste gelecek şekilde iki alt birim çizilir).

Kod çözülmemiş kod

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, teşekkürler, aslında htgörüntü için gizlemek için bir yapmayı düşündüm . Yapmadığım için mutluyum!
Level River St
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.