Narysuj spiralę w pudełku


13

spirala

Ta geometryczna spirala wygląda na skomplikowaną, ale dość łatwo ją narysować; weź następujące pole:

pudełko

Narysuj linię prostą między rogiem pudełka a pewną ustaloną odległością nad następnym rogiem przeciwnie do ruchu wskazówek zegara.

1 linia

Kontynuuj ten wzór do wewnątrz, zawsze pozostając w tej odległości od narożnika następnej linii. Oto kilka kolejnych wierszy.

linie jęków

Jak widać, w miarę kontynuowania wzoru spirala zbliża się do środka, a rysowane pola zaczynają się obracać. Pamiętaj, że odległość pozostaje stała, niezależnie od kąta.

Wyzwanie

Inspiracja (a także dzięki cudownej osobie, która wprowadziła mnie do tej koncepcji <3)

Biorąc pod uwagę numeryczne (ewentualnie ułamkowe) dane wejściowe od 1 do 25, napisz obraz na dysk, który korzysta z tego wzoru lub wyświetl wynik na ekranie, gdzie odległość od każdego rogu jest odległością jednej początkowej strony pola podzielonej przez dane wejściowe . Kontynuuj wzór do wewnątrz, aż odległość od określonego rogu będzie większa niż długość następnej strony.

Zasady

  • Nie możesz używać wbudowanych funkcji do tworzenia spirali, ale możesz używać wbudowanych funkcji przetwarzania obrazu.
  • Jeśli piszesz na dysk, musisz wydrukować obraz w dowolnym z plików .jpg, .gif, .tiff, .pbm, .ppm i .png.
  • Początkowa długość boku musi wynosić co najmniej 500 pikseli.
  • Początkowy róg może być dowolny.
  • Jak zawsze, standardowe luki są niedozwolone.


Czy jest minimalne, ile poziomów musi mieć ta spirala?
— LegionMammal978

@ LegionMammal978 Nigdy nie prosiłbym o dane wejściowe większe niż 25, dodam to.
— Addison Crump,

W tym .pbm lub .ppm może pomóc niektórym z języków mniej graficznych.
— trichoplax

Odpowiedzi:


12

Buty (Rubinowy) 163 bajty

Buty to oparty na rubinie zestaw narzędzi GUI.

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)}}

Nie golfił

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.

Wyjścia n = 4 i n = 25

wprowadź opis zdjęcia tutaj

Pamiętaj, że kształt zawsze kończy się trójkątem, który zapada się dalej do linii. Zastąpienie size-1przez sizenie robi różnicy w wyglądzie wyjścia i zaoszczędziłoby 2 bajty, ale zostawiłem to dla teoretycznej poprawności.

Wyjście n = 300

Zainspirowane komentarzem OP, wyższe liczby wyglądają świetnie!

wprowadź opis zdjęcia tutaj


Czy potrzebne jest miejsce następujące linepo dolnej linii?
— Addison Crump,

@CoolestVeto niestety tak. *przekształca układ czterech elementów utworzony przez konwersję liczb zespolonych do czterech parametrów line. Standardowa składnia polega line(*(a[j-1].rect+a[j].rect))więc na usuwaniu nawiasów i dodawaniu spacji, która już oszczędza jeden bajt. Usunięcie spacji powoduje, że Ruby próbuje pomnożyć lineprzez zawartość nawiasów, co nie ma sensu i powoduje zgłoszenie błędu. Trzeba tu zagrać w golfa, ale nie tylko. Zajmę się tym później.
— Level River St

Jestem prawie pewien, że możesz pozbyć się parenów wokół argumentu upto. Czy próbowałeś też usunąć ('')później ask? Nie testowałem tego, ale może to być niepotrzebne
— pozew Fund Moniki z

3
Wynik dla 100 jest piękny .
— Addison Crump,

1
@CoolestVeto Uważam, że n = 100 jest trochę niepokojący; wyskakuje i przechodzi na mnie w 3D. Wysłałem n = 300, co jest ogólnie ciemniejsze i dlatego spokojniejsze.
— Level River St

3

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

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();}};}}

Dzięki CoolestVeto i ECS za jeszcze inne sposoby na zmniejszenie rozmiaru. :-)


Ok, grałem trochę w golfa, ale jest na pewno więcej możliwości, kodowałem zbyt obiektowo, aby był minimalistyczny dla postaci :-D
— Vampire

@AlexA. Jeśli później poprawię kod i skrócę go, czy mogę po prostu zaktualizować post za pomocą krótszej wersji?
— Wampir

@ BjörnKautler Tak, to dobrze! :) Pracuję teraz nad kilkoma miejscami do skrócenia.
— Addison Crump,

1
@ BjörnKautler Na pewno możesz!
— Alex A.,

1
Wow, nigdy nie widziałem, żeby więcej niż 500 bajtów zostało odrzuconych. : O
— Addison Crump

1

Groovy, 412 411 403 398 bajtów

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()}}

Mam problemy z uruchomieniem go z groovy 2.4.4: 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

W wersji 2.3.9 działa dla mnie dobrze.
— Wampir
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.