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.
Addison Crump
źródło
4
Blisko związane.
Martin Ender,
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
powiązane również
Cyfrowa trauma

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

Level River St
źródło
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. :-)

Wampir
źródło
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()}}
Wampir
źródło
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