Регулярные Полиграммы


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

MATLAB, 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:

Polygram


1

Mathematica, 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.