Poligramas regulares

16

Dado el número de vértices n ≥ 3y el "tamaño del paso" 1 ≤ m < n/2 (que indica la distancia entre dos vértices conectados), genera una representación gráfica del correspondiente poligrafo regular . Si el poligrama consta de múltiples bucles cerrados, cada bucle debe representarse en un color de línea diferente. (Si esto suena confuso, los ejemplos a continuación deberían aclarar las cosas).

Reglas

Es probable que cualquier solución razonable al problema satisfaga estas reglas automáticamente: solo están allí para poner algunas restricciones en los parámetros de la salida a fin de evitar respuestas como "Este bloque negro es totalmente un poligrama, pero no puede verlo porque Configuré el ancho de línea en más de 9000 "

  • Puede representar el poligrama en un archivo (que puede escribirse en el disco o en la secuencia de salida estándar) o mostrarlo en la pantalla.
  • Puede usar gráficos vectoriales o de trama. Si su salida está rasterizada, su imagen debe tener dimensiones de 400x400 píxeles o más, y el radio del poligramo (la distancia desde el centro a cada vértice) debe estar entre el 35% y el 50% de la longitud del lado.
  • La relación de aspecto del poligrafo debe ser 1 (para que sus vértices se encuentren en un círculo apropiado): el lienzo de la imagen puede ser rectangular.
  • Las líneas del poligrafo no deben ser más gruesas que el 5% del radio (y, por supuesto, deben tener un grosor distinto de cero para ser visibles).
  • Puede renderizar ejes o un marco además del poligrafo, pero nada más.
  • Puede elegir cualquier color de fondo (sólido).
  • Para los poligramas que consisten en múltiples bucles cerrados, debe admitir al menos 6 colores visualmente distintos , todos los cuales deben ser diferentes del fondo. (La escala de grises está bien, siempre que los tonos estén lo suficientemente extendidos en todo el espectro). Su código aún debe funcionar para más de 6 bucles, pero los colores no tienen que distinguirse para ningún bucle adicional (es decir, también puede reutilizar colores de bucles anteriores en ese punto).

Este es el código de golf, por lo que gana la respuesta más corta (en bytes).

Ejemplos

Aquí están todas las salidas hasta n = 16(donde corresponde la columna ny la fila a m):

ingrese la descripción de la imagen aquí Haga clic para una versión más grande.

Como ejemplos para grandes n, aquí están (n, m) = (29, 11)y (30, 12):

ingrese la descripción de la imagen aquíingrese la descripción de la imagen aquí

Martin Ender
fuente
¿Qué pasa con el anti aliasing y esas cosas? (Ya que estamos lidiando con líneas en ángulo)
Optimizer
1
@Optimizer No voy a prescribir un algoritmo anti-aliasing. Las líneas pueden tener alias o anti-alias siempre que sean claramente visibles. Usa tu mejor juicio.
Martin Ender

Respuestas:

5

MATLAB, 85 81

La función muestra un gráfico en la pantalla.

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

Resultado para n = 30, m = 12: f (30,12)

Feersum
fuente
No estoy seguro de que esto funcione; si lo hice correctamente, generará esta imagen durante 30, 12. Ver: bit.ly/1GFZni7
durron597
@ durron597 En realidad funciona en Matlab, pero la función no se puede reutilizar de inmediato, ya que hold allconduce a que el siguiente diagrama se dibuje sobre el primero ... No sé si tenemos un consenso sobre la reutilización de las funciones honesto.
Martin Ender
@ MartinBüttner Debería ser hold onguardar un byte de todos modos; si agrega cuatro bytes se vuelve reutilizable ( clf\n)
durron597
Resulta que tenemos un consenso e incluso publiqué la pregunta y me respondí hace unos meses. oO Entonces, por esa meta publicación, esto sería inválido sin algo para liberar el hold.
Martin Ender
@ MartinBüttner Si cambia hold alla clf\nhold on¿eso soluciona el problema?
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*

Emite la imagen en formato ASCII PGM.

Puedes probarlo en línea , pero el resultado es bastante largo. Puede cambiar 400y 199a números más pequeños para reducir el tamaño de la imagen.

CJam no tiene ningún concepto de imágenes, dibujos, líneas o formas, por lo que generé la imagen en una matriz cuadrada, píxel por píxel (un número que representa un tono gris para cada píxel).

Así es como se ve el resultado 30 12:

polygram

aditsu
fuente
1

Mathematica, 70 bytes

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

Bueno ... esta es mi implementación de referencia que supera las dos presentaciones hasta ahora. No tengo la intención de ganar mi propio desafío, así que espero que alguien supere esto.

La salida es como las tramas en el desafío en sí, excepto que no estoy eliminando los ejes aquí:

ingrese la descripción de la imagen aquí

Martin Ender
fuente