Bir kutuya spiral çizin


13

spiral

Bu geometrik spiral karmaşık görünüyor, ancak çizmek oldukça basit; aşağıdaki kutuyu al:

Kutu

Kutunun köşesi ile bir sonraki köşenin üzerinde ayarlanan mesafe arasında saat yönünün tersine düz bir çizgi çizin.

1 satır

Bu kalıbı içe doğru devam ettirin, ayarlanan mesafeyi daima bir sonraki satırın köşesinden uzak tutun. İşte size birkaç satır daha.

moar hatları

Gördüğünüz gibi, desen devam ettikçe, spiral merkeze yaklaşır ve çizdiğiniz kutular dönmeye başlar. Açıdan bağımsız olarak mesafenin sabit kaldığını unutmayın.

Meydan okuma

İlham (ve ayrıca beni bu kavramla tanıştıran harika kişiye teşekkürler <3)

1'den 25'e kadar sayısal (muhtemelen kesirli) bir giriş verildiğinde, bu deseni kullanan diske bir görüntü yazın veya çıktıyı ekranda görüntüleyin, burada her köşeden uzaklığın kutunun bir başlangıç ​​tarafının mesafeye girişe bölünmesi . Deseni, belirtilen köşeden olan mesafe bir sonraki tarafın uzunluğundan daha uzun olana kadar içeri doğru devam ettirin.

kurallar

  • Bu sarmal oluşturma için yerleşik öğeleri kullanamazsınız, ancak görüntü işleme yerleşiklerini kullanabilirsiniz.
  • Diske yazarsanız, .jpg, .gif, .tiff, .pbm, .ppm ve .png dosyalarının herhangi birinde bir görüntü çıktısı almanız gerekir.
  • İlk kenar uzunluğu en az 500 piksel olmalıdır.
  • İlk köşe hangisini seçerseniz seçin.
  • Her zaman olduğu gibi , Standart Loopholes'a izin verilmez.


Bu spiralin kaç seviye derin olması için bir minimum var?
LegionMammal978

@ LegionMammal978 Asla 25'ten daha büyük bir girdi istemezdim, bunu ekleyeceğim.
Addison Crump

.Pbm veya .ppm dahil olmak , daha az grafik dillerin bazılarına yardımcı olabilir.
trichoplax

Yanıtlar:


12

Ayakkabı (Yakut) 163 bayt

Shoes, yakut tabanlı bir GUI araç setidir.

Shoes.app{n=ask('').to_f
r=s=5E2
a=[0,s*i="i".to_c,s*i+s,s,0]
(q=a[-3]-a[-4]
r=q.abs/s*n
a<<a[-4]+q/r)while r>1
1.upto(a.size-1){|j|line *(a[j-1].rect+a[j].rect)}}

Ungolfed

Shoes.app{ 
  n=ask('').to_f                 #Open a dialog box with no message, get n from user
  r=s=5E2                        #Initialize s to sidelength=500. r can be initialized to any vale, we use the same one for convenience.
  a=[0,s*i="i".to_c,s*i+s,s,0]   #intialize array a with 5 points needed to draw a square, in complex number format (first point=0 is duplicated.)

  (
    q=a[-3]-a[-4]                #find the vector from point plotted 4 before to the following point (plotted 3 before)
    r=q.abs/s*n                  #r is the scale factor
    a<<a[-4]+q/r                 #add a new point derived from a[-4] by moving toward a[-3] by a distance s/n 
  )while r>1                     #break loop when length of line is less than s/n

  1.upto(a.size-1){|j|           #for all points except 1st and last one
    line *(a[j-1].rect+a[j].rect)#take the two complex numbers correspondimg to the current and previous point,
  }                              #convert to 2-element arrays (rectangular coordinates
}                                #combine to make a 4-element array, use * to splat into 4 parameters, and draw using the line method.

Çıkışlar n = 4 ve n = 25

resim açıklamasını buraya girin

Şeklin her zaman bir çizgiyle daha da daralan bir üçgenle sona erdiğini unutmayın. Değiştirme size-1ile sizeçıkış görünümünü hiç fark etmez ve 2 bayt kaydetmek istiyorum, ama teorik doğruluğundan içinde bıraktı.

Çıkış n = 300

OP'nin bir yorumundan esinlenerek, daha yüksek sayılar harika görünüyor!

resim açıklamasını buraya girin


lineAlt satırda aşağıdaki boşluk gerekli mi?
Addison Crump

@CoolestVeto maalesef evet. *dört parametre içine karmaşık sayılar dönüştürülmesiyle oluşturulan dört elemanlı bir dizi dönüştürür line. Standart sözdizimi line(*(a[j-1].rect+a[j].rect))böylece parantezleri kaldırmak ve bir boşluk eklemek zaten bir bayt tasarruf. Boşluğu kaldırmak, Ruby'nin lineparantezin içeriği ile çarpmaya çalışmasını sağlar, bu da bir anlam ifade etmez ve hata atmasına neden olur. Burada yapılması gereken bazı golf var, sadece bu değil. Daha sonra bakacağım.
Level River St

Tartışmanın etrafındaki parenslerden kurtulabileceğinden neredeyse eminim upto. Ayrıca, ('')sonrasını kaldırmayı denediniz askmi? Test etmedim, ama gereksiz olabilir
Monica'nın Davasını

3
100 için çıktı güzel .
Addison Crump

1
@CoolestVeto n = 100'ü biraz rahatsız edici buluyorum; dışarı atlar ve tüm 3D üzerime gider. Ben genel olarak daha koyu ve bu nedenle daha sakin n = 300 yayınladım.
Level River St

3

Java, 1056 1005 985 948 522 508 507 504 502 501 493 492 488 474 465 458 bayt

import java.awt.*;interface G{static void main(String[]a){new Frame(){int s=499,o=s,e,i,x,y;{o/=new Float(a[0]);add(new Component(){public void paint(Graphics g){g.drawRect(0,0,s,s);int[]p={s,s,s,0,0,0,0,s};for(double d=s,t;d>o;t=o/d,i=e*2,x=(int)((1-t)*p[i]+t*p[(2+i)%8]+.5),y=(int)((1-t)*p[1+i]+t*p[(3+i)%8]+.5),g.drawLine(p[(6+i)%8],p[(7+i)%8],x,y),p[i]=x,p[1+i]=y,e=++e%4,i=e*2,x=p[(2+i)%8]-p[i],y=p[(3+i)%8]-p[1+i],d=Math.sqrt(x*x+y*y));}});show();}};}}

Boyutu azaltmak için başka yollar için CoolestVeto ve ECS sayesinde. :-)


Tamam, biraz golf oynadım, ama kesin olarak daha çok şey var, karakter minimalist olmak için çok nesne yönelimli kodladım:
Vampire

@AlexA. Daha sonra kodumu geliştirir ve kısaltırsam, daha sonra yazıyı daha kısa sürümle güncelleyebilir miyim?
Vampir

@ BjörnKautler Yup, bu iyi! :) Şu anda kısaltmak için birkaç yer üzerinde çalışıyorum.
Addison Crump

1
@ BjörnKautler Kesinlikle yapabilirsiniz!
Alex

1
Vay canına, 500 bayttan daha önce bir cevap aldatmadım. : O
Addison Crump

1

Gelenekselleşmiş, 412 411 403 398 bayt

import java.awt.*
new Frame(){
def s=499,o=s/(args[0]as float),e=0,i,a,b,d,t
{add new Component(){void paint(Graphics g){g.drawRect 0,0,s,s
p=[s,s,s,0,0,0,0,s]
for(d=s;d>o;d=Math.sqrt(a*a+b*b)){t=o/d
i=e*2
a=(int)((1-t)*p[i]+t*p[(2+i)%8]+0.5)
b=(int)((1-t)*p[1+i]+t*p[(3+i)%8]+0.5)
g.drawLine p[(6+i)%8],p[(7+i)%8],a,b
p[i]=a
p[1+i]=b
e=++e%4
i=e*2
a=p[(2+i)%8]-p[i]
b=p[(3+i)%8]-p[1+i]}}}
show()}}

Ben groovy 2.4.4 ile çalıştırmak için sorunları var: Caught: groovy.lang.MissingMethodException: No signature of method: static s.div() is applicable for argument types: (java.lang.Float) values: [25.0] Possible solutions: is(java.lang.Object), wait(), run(), run(), find(), any() groovy.lang.MissingMethodException: No signature of method: static s.div() is applicable for argument types: (java.lang.Float) values: [25.0] Possible solutions: is(java.lang.Object), wait(), run(), run(), find(), any() at s$1.<init>(s.groovy:3) at s.run(s.groovy:2)
dieter

2.3.9 ile benim için iyi çalışıyor.
Vampir
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.