Polygrams regolari


16

Dato il numero di vertici n ≥ 3e la "dimensione del gradino" 1 ≤ m < n/2 (che indica la distanza tra due vertici collegati), emette una rappresentazione grafica del corrispondente poligrafo regolare . Se il poligrafo è costituito da più anelli chiusi, ogni ciclo deve essere reso con un colore di linea diverso. (Se questo sembra confuso, gli esempi seguenti dovrebbero sperare di chiarire le cose.)

Regole

Qualsiasi soluzione ragionevole al problema probabilmente soddisferà automaticamente queste regole: sono lì solo per mettere alcuni vincoli sui parametri dell'output al fine di prevenire risposte come "Questo blocco nero è totalmente un poligrafo, ma non puoi vederlo perché Ho impostato la larghezza della linea su oltre 9000. "

  • È possibile eseguire il rendering del poligrafo in un file (che può essere scritto su disco o nel flusso di output standard) o visualizzarlo sullo schermo.
  • È possibile utilizzare grafica vettoriale o raster. Se l'output è rasterizzato, l'immagine deve avere dimensioni pari o superiori a 400x400 pixel e il raggio del poligrafo (la distanza dal centro a ciascun vertice) deve essere compreso tra il 35% e il 50% della lunghezza laterale.
  • Le proporzioni del poligrafo devono essere 1 (in modo che i suoi vertici si trovino su un cerchio adeguato) - la tela dell'immagine può essere rettangolare.
  • Le linee del poligrafo non devono essere più spesse del 5% del raggio (e ovviamente devono avere uno spessore diverso da zero per essere visibili).
  • È possibile eseguire il rendering degli assi o di una cornice oltre al poligrafo, ma nient'altro.
  • Puoi scegliere qualsiasi colore di sfondo (solido).
  • Per i polgrammi costituiti da più anelli chiusi, è necessario supportare almeno 6 colori visivamente distinti , i quali devono essere diversi dallo sfondo. (La scala dei grigi va bene, a condizione che le sfumature siano sufficientemente distribuite attraverso lo spettro.) Il codice deve ancora funzionare per più di 6 loop, ma i colori non devono essere distinguibili per eventuali loop aggiuntivi (vale a dire che puoi anche riutilizzarli colori dai precedenti loop in quel punto).

Questo è il golf del codice, quindi vince la risposta più breve (in byte).

Esempi

Ecco tutti gli output fino a n = 16(dove corrisponde la colonna ne la riga a m):

inserisci qui la descrizione dell'immagine Clicca per una versione più grande.

Come esempi per i più grandi n, qui ci sono (n, m) = (29, 11)e (30, 12):

inserisci qui la descrizione dell'immagineinserisci qui la descrizione dell'immagine


Che dire di anti aliasing e roba del genere? (Dato che abbiamo a che fare con le linee angolate)
Ottimizzatore

1
@Optimizer Non ho intenzione di prescrivere un algoritmo anti-aliasing. Le linee possono essere aliasate o anti-alias purché siano chiaramente visibili. Usa il tuo miglior giudizio.
Martin Ender,

Risposte:


5

MATLAB, 85 81

La funzione visualizza un diagramma sullo schermo.

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

Risultato per n = 30, m = 12: f (30,12)


Non sono sicuro che funzioni; se l'ho fatto correttamente, produrrà questa immagine per 30, 12. Vedi: bit.ly/1GFZni7
durron597

@ durron597 In realtà funziona in Matlab, ma la funzione non è immediatamente riutilizzabile, perché i hold alllead alla trama successiva vengono disegnati sopra il primo ... Non so se abbiamo un consenso sulla riusabilità delle funzioni da onesto.
Martin Ender,

@ MartinBüttner Dovrebbe essere comunque hold onper salvare un byte; se aggiungi quattro byte diventa riutilizzabile ( clf\n)
durron597

Si scopre che abbiamo un consenso e ho persino pubblicato la domanda e mi sono risposto qualche mese fa. oO Quindi, per quel meta post, questo non sarebbe valido senza qualcosa per rilasciare il hold.
Martin Ender,

@ MartinBüttner Se cambi hold alla clf\nhold onrisolve il 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*

Emette l'immagine in formato ASCII PGM.

Puoi provarlo online , ma l'output è piuttosto lungo. È possibile modificare 400e 199numeri più piccoli per ridurre le dimensioni dell'immagine.

CJam non ha alcun concetto di immagini, disegno, linee o forme, quindi ho generato l'immagine in una matrice quadrata, pixel per pixel (un numero che rappresenta una sfumatura grigia per ogni pixel).

Ecco come appare il risultato 30 12:

Polygram


1

Mathematica, 70 byte

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

Bene ... questa è la mia implementazione di riferimento che finora batte entrambe le osservazioni. Non ho intenzione di vincere la mia sfida, quindi spero che qualcuno lo superi.

L'output è simile ai grafici nella sfida stessa, tranne per il fatto che non sto rimuovendo gli assi qui:

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.