Polygrames réguliers

16

Compte tenu du nombre de sommets n ≥ 3et de la "taille de pas" 1 ≤ m < n/2 (indiquant la distance entre deux sommets connectés), affichez une représentation graphique du polygramme régulier correspondant . Si le polygramme se compose de plusieurs boucles fermées, chaque boucle doit être rendue dans une couleur de ligne différente. (Si cela vous semble confus, les exemples ci-dessous devraient, espérons-le, clarifier les choses.)

Règles

Toute solution raisonnable au problème satisfera probablement ces règles automatiquement - elles sont juste là pour imposer des contraintes sur les paramètres de la sortie afin d’empêcher des réponses comme "Ce bloc noir est totalement un polygramme, mais vous ne pouvez pas le voir car J'ai défini une largeur de ligne supérieure à 9 000. "

  • Vous pouvez rendre le polygramme dans un fichier (qui peut être écrit sur un disque ou dans le flux de sortie standard) ou l'afficher à l'écran.
  • Vous pouvez utiliser des graphiques vectoriels ou raster. Si votre sortie est tramée, votre image doit avoir des dimensions de 400x400 pixels ou plus, et le rayon du polygramme (la distance du centre à chaque sommet) doit être compris entre 35% et 50% de la longueur du côté.
  • Le rapport d'aspect du polygramme doit être 1 (de sorte que ses sommets se trouvent sur un cercle approprié) - la toile de l'image peut être rectangulaire.
  • Les lignes du polygramme ne doivent pas être plus épaisses que 5% du rayon (et bien sûr, elles doivent avoir une épaisseur non nulle pour être visibles).
  • Vous pouvez rendre des axes ou un cadre en plus du polygramme, mais rien d'autre.
  • Vous pouvez choisir n'importe quelle couleur d'arrière-plan (solide).
  • Pour les polygrammes composés de plusieurs boucles fermées, vous devez prendre en charge au moins 6 couleurs visuellement distinctes , qui doivent toutes être différentes de l'arrière-plan. (L'échelle de gris est fine, à condition que les nuances soient suffisamment réparties dans le spectre.) Votre code doit toujours fonctionner pour plus de 6 boucles, mais les couleurs ne doivent pas être distinguables pour les boucles supplémentaires (c'est-à-dire que vous pouvez également réutiliser couleurs des boucles précédentes à ce point).

Il s'agit du code golf, donc la réponse la plus courte (en octets) l'emporte.

Exemples

Voici toutes les sorties jusqu'à n = 16(où la colonne correspond net la ligne à m):

entrez la description de l'image ici Cliquez pour une version plus grande.

À titre d'exemples pour les plus grands n, voici (n, m) = (29, 11)et (30, 12):

entrez la description de l'image icientrez la description de l'image ici

Martin Ender
la source
Qu'en est-il de l'anticrénelage et d'autres choses? (Puisque nous avons affaire à des lignes inclinées)
Optimizer
1
@Optimizer Je ne vais pas prescrire d'algorithme anti-aliasing. Les lignes peuvent être aliasées ou anti-aliasées tant qu'elles sont clairement visibles. Utilisez votre meilleur jugement.
Martin Ender

Réponses:

5

MATLAB, 85 81

La fonction affiche un tracé à l'écran.

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

Résultat pour n = 30, m = 12: f (30,12)

feersum
la source
Je ne suis pas certain que cela fonctionne; si je l'ai fait correctement, il affichera cette image pour 30, 12. Voir: bit.ly/1GFZni7
durron597
@ durron597 Cela fonctionne en fait dans Matlab, mais la fonction n'est pas immédiatement réutilisable, car les hold allpistes menant au tracé suivant sont tracées en haut du premier ... Je ne sais pas si nous avons un consensus sur la réutilisabilité des fonctions à honnête.
Martin Ender
@ MartinBüttner Cela devrait être hold onde toute façon de sauvegarder un octet; si vous ajoutez quatre octets, il devient réutilisable ( clf\n)
durron597
Il s'avère que nous avons un consensus et j'ai même posté la question et répondu moi-même il y a quelques mois. oO Donc, par ce méta-post, ce serait invalide sans quelque chose pour libérer le hold.
Martin Ender
@ MartinBüttner Si vous changez hold allen clf\nhold onest-ce que cela résout le problème?
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*

Il produit l'image au format ASCII PGM.

Vous pouvez l' essayer en ligne , mais la sortie est assez longue. Vous pouvez modifier 400et 199en nombres plus petits pour réduire la taille de l'image.

CJam n'a pas de concept d'images, de dessins, de lignes ou de formes, j'ai donc généré l'image dans une matrice carrée, pixel par pixel (un nombre représentant une nuance de gris pour chaque pixel).

Voici à quoi ressemble le résultat 30 12:

polygram

aditsu
la source
1

Mathematica, 70 octets

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

Eh bien ... c'est mon implémentation de référence qui bat les deux soumissions jusqu'à présent. Je n'ai pas l'intention de gagner mon propre défi, j'espère donc que quelqu'un va battre cela.

La sortie est comme les tracés du défi lui-même, sauf que je ne supprime pas les axes ici:

entrez la description de l'image ici

Martin Ender
la source