Регулярні поліграми


16

Враховуючи кількість вершин n ≥ 3і "розмір кроку" 1 ≤ m < n/2 (із зазначенням відстані між двома з'єднаними вершинами), виведіть графічне зображення відповідної регулярної поліграми . Якщо поліграма складається з декількох замкнених петель, кожна петля повинна бути виведена в інший колір лінії. (Якщо це звучить заплутано, наведені нижче приклади повинні сподіватися, що все з’ясується.)

Правила

Будь-яке розумне рішення проблеми, ймовірно, автоматично задовольнить ці правила - вони просто там, щоб поставити деякі обмеження щодо параметрів виводу, щоб запобігти відповідям на кшталт "Цей чорний блок є повністю поліграмою, але ви не можете його бачити, оскільки Я встановив ширину лінії понад 9000. "

  • Ви можете надати поліграму або в файл (який може бути записаний на диск, або в стандартний вихідний потік) або відобразити його на екрані.
  • Ви можете використовувати або векторну, або растрову графіку. Якщо ваш вихідний сигнал растрований, зображення має мати розміри 400x400 пікселів або більше, а радіус поліграми (відстань від центру до кожної вершини) повинен бути між 35% і 50% від бічної довжини.
  • Співвідношення сторін поліграми повинно бути 1 (щоб вершини лежали на правильному колі) - полотно зображення може бути прямокутним.
  • Лінії поліграми повинні бути не товщими 5% радіусу (і, звичайно, вони повинні мати ненульову товщину, щоб бути видною).
  • Додатково до поліграми можна зобразити осі або рамку, але нічого іншого.
  • Ви можете вибрати будь-який (суцільний) колір фону.
  • Для поліграм, що складаються з декількох замкнених петель, ви повинні підтримувати щонайменше 6 візуально відмінних кольорів, всі вони повинні відрізнятися від фону. (Сіра гамма добре, за умови, що відтінки достатньо розповсюджені по спектру.) Ваш код все одно повинен працювати більше 6 циклів, але кольори не повинні відрізнятись від будь-яких додаткових циклів (тобто ви також можете повторно використовувати кольори з попередніх петель у цій точці).

Це кодовий гольф, тому найкоротша відповідь (у байтах) виграє.

Приклади

Ось усі результати до n = 16(де стовпець відповідає nі рядок до m):

введіть тут опис зображення Клацніть для збільшення версії.

В якості прикладів більше n, ось (n, m) = (29, 11)і (30, 12):

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


А як щодо антизбудження та інших матеріалів? (Оскільки ми маємо справу з кутовими лініями)
Оптимізатор

1
@Optimizer Я не збираюся прописувати алгоритм протизшивання. Рядки можуть бути псевдонімічними або антиаліасинговими, якщо вони добре видно. Скористайтеся своїм найкращим рішенням.
Мартін Ендер

Відповіді:


5

МАТЛАБ, 85 81

Функція відображає графік на екрані.

function f(n,m)
hold all
axis equal
for k=1:gcd(m,n)
plot(i.^(4*(k:m:n^2)/n))
end

Результат при n = 30, m = 12: f (30,12)


Я не впевнений, що це працює; якщо я це зробив правильно, він виведе це зображення протягом 30, 12. Див.: bit.ly/1GFZni7
durron597

@ durron597 Насправді це працює в Matlab, але функція не відразу використовується для повторного використання, тому що hold allведе до того, що наступний сюжет малюється поверх першого ... Я не знаю, чи є у нас консенсус щодо повторного використання функцій чесний.
Мартін Ендер

@ MartinBüttner Все одно слід hold onзберегти байт; якщо ви додасте чотири байти, він стає багаторазовим ( clf\n)
durron597

Виявляється, у нас є консенсус, і я навіть кілька місяців тому поставив запитання і відповів на себе. oO Отже, за допомогою цього мета-повідомлення це може бути недійсним, не випустивши що-небудь hold.
Мартін Ендер

@ MartinBüttner Якщо ви змінюєте , hold allщоб clf\nhold onробить це виправити цю проблему?
durron597

3

CJam, 114

"P2"N400:ASAN6N0aA*aA*q~:M;:K{:CK,f{M*+K%P*2*K/_[mc)\ms)]199f*}_+2ew{~1$.-Af/A,\ff*\f.+{:mo~_3$=@C6%)tt}/}/}/Sf*N*

Він виводить зображення у форматі ASCII PGM.

Можна спробувати в Інтернеті , але вихід досить довгий. Ви можете змінити 400і 199на менші числа, щоб зменшити розмір зображення.

У CJam немає поняття зображень, малюнків, ліній чи фігур, тому я генерував зображення у квадратній матриці, піксель за пікселем (одне число, що представляє сірий відтінок для кожного пікселя).

Ось як виглядає результат 30 12:

поліграма


1

Математика, 70 байт

ListPolarPlot[Table[{2Pi(i+j#2)/#,1},{i,GCD@##},{j,#+1}],Joined->1>0]&

Ну ... це моя референтна реалізація, яка досі перемагає обидва пропозиції. Я не маю на меті перемогти власний виклик, тому сподіваюся, що хтось переможе це.

Вихід є як графіки в самому виклику, за винятком того, що я тут не знімаю осі:

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

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