Намалюйте спіраль у коробці


13

спіраль

Ця геометрична спіраль виглядає складною, але малювати її досить просто; візьміть таке поле:

ящик

Проведіть пряму лінію між кутом коробки та деякою заданою відстані над наступним кутом проти годинникової стрілки.

1 рядок

Продовжуйте цю схему всередину, залишаючись завжди на відстані від кута наступного рядка. Ось ще кілька рядків у.

моарні лінії

Як ви бачите, як малюнок триває, спіраль наближається до центру, і ящики, які ви малюєте, починають обертатися. Зауважте, що відстань залишається постійною, незалежно від кута.

Змагання

Натхнення (а також завдяки чудовій людині, яка познайомила мене з цим поняттям <3)

Враховуючи числовий (можливо дробовий) вхід від 1 до 25, запишіть зображення на диск, який використовує цю схему, або виведіть вихід на екран, де відстань від кожного кута - відстань однієї початкової сторони поля, поділене на вхід . Продовжуйте візерунок всередину, поки відстань від вказаного кута не перевищить довжину наступної сторони.

Правила

  • Ви не можете використовувати вбудовані для цього спірального створення, але ви можете використовувати вбудовані зображення для обробки зображень.
  • Якщо ви пишете на диск, ви повинні вивести зображення в будь-який з .jpg, .gif, .tiff, .pbm, .ppm та .png.
  • Початкова довжина сторони повинна бути не менше 500 пікселів.
  • Початковий кут може бути обраний вами.
  • Як завжди, стандартні лазівки заборонені.


Чи є мінімум, на скільки рівнів має бути глибина цієї спіралі?
LegionMammal978

@ LegionMammal978 Я ніколи не просив би ввести більше 25, додам це.
Аддісон Кримп

Включення .pbm або .ppm може допомогти деяким менш графічним мовам.
трихоплакс

Відповіді:


12

Взуття (Ruby) 163 байт

Взуття - це набір рубійних інструментів 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)}}

Безумовно

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.

Виходи n = 4 і n = 25

введіть тут опис зображення

Зауважте, що форма завжди закінчується трикутником, який згортається далі до лінії. Заміна size-1на значення sizeне має ніякого значення для зовнішнього вигляду виводу і збереже 2 байти, але я залишив це для теоретичної коректності.

Вихід n = 300

Натхненний коментарем ОП, чим більше цифри виглядають чудово!

введіть тут опис зображення


Чи потрібний пробіл lineу нижньому рядку?
Аддісон Крамп

@CoolestVeto, на жаль, так. *перетворює масив чотири елементи , утворений шляхом перетворення комплексних чисел в чотирьох параметрів line. Стандартний синтаксис - line(*(a[j-1].rect+a[j].rect))це видалення дужок, а додавання пробілу - це вже економія одного байта. Видалення пробілу змушує Рубі намагатися помножити lineна вміст дужок, що не має сенсу і призводить до помилки. Тут потрібно зробити щось з гольфу, тільки не це. Я розгляну це пізніше.
Річка Рівня Св.

Я майже впевнений, що ви можете позбутися парен навколо суперечки upto. Також ви спробували видалити ('')після ask? Я не перевіряв цього, але це може бути непотрібним
позов Фонду Моніки

3
Вихід на 100 - прекрасний .
Аддісон Кримп

1
@CoolestVeto Я вважаю, що n = 100 трохи непокоїть; вона вискакує і переходить на мене все 3D. Я розмістив n = 300, який в цілому темніше і, отже, спокійніше.
Рівень р. Св.

3

Java, 1056 1005 985 948 522 508 507 504 502 501 493 492 488 474 465 458 байт

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

Завдяки CoolestVeto та ECS за ще інші способи зменшити розмір. :-)


Гаразд, я трохи пограв у нього в гольф, але є більше можливого напевно, я зашифрував занадто об'єктно-орієнтований, щоб бути символічним мінімалізмом :-D
Вампір

@AlexA. Якщо пізніше я вдосконалюю свій код і зроблю його коротшим, чи можу я просто оновити публікацію за допомогою коротшої версії?
Вампір

@ BjörnKautler Так, це добре! :) Я працюю над кількома місцями, щоб скоротити її зараз.
Аддісон Кримп

1
@ BjörnKautler Ви, звичайно, можете!
Олексій А.

1
Нічого, я ніколи не бачив, щоб відповідь відповіла більше 500 байт. : O
Аддісон Кримп

1

Groovy, 412 411 403 398 байт

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

У мене проблеми, щоб змусити його працювати з 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

З 2.3.9 це добре працює для мене.
Вампір
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.