Polygrams regulares

16

Dado o número de vértices n ≥ 3e o "tamanho da etapa" 1 ≤ m < n/2 (indicando a distância entre dois vértices conectados), produza uma representação gráfica do polígrama regular correspondente . Se o polígrama consistir em vários loops fechados, cada loop deverá ser renderizado em uma cor de linha diferente. (Se isso parecer confuso, os exemplos abaixo devem esclarecer as coisas.)

Regras

Qualquer solução razoável para o problema provavelmente satisfará essas regras automaticamente - elas existem apenas para colocar algumas restrições nos parâmetros da saída, a fim de evitar respostas como "Este bloco preto é totalmente um polígono, mas você não pode vê-lo porque Defino a largura da linha para mais de 9000 ".

  • Você pode renderizar o polígono em um arquivo (que pode ser gravado em disco ou no fluxo de saída padrão) ou exibi-lo na tela.
  • Você pode usar gráficos vetoriais ou raster. Se sua saída for rasterizada, sua imagem deverá ter dimensões de 400x400 pixels ou mais, e o raio do polígrama (a distância do centro a cada vértice) deverá estar entre 35% e 50% do comprimento lateral.
  • A proporção do polígono deve ser 1 (para que seus vértices fiquem em um círculo adequado) - a tela da imagem pode ser retangular.
  • As linhas do polígono não devem ter mais que 5% do raio (e, é claro, devem ter uma espessura diferente de zero para serem visíveis).
  • Você pode renderizar eixos ou um quadro além do polígrama, mas nada mais.
  • Você pode escolher qualquer cor de fundo (sólida).
  • Para polígramas que consistem em vários loops fechados, você deve suportar pelo menos 6 cores visualmente distintas , todas diferentes do plano de fundo. (A escala de cinza é boa, desde que as tonalidades estejam suficientemente espalhadas pelo espectro.) Seu código ainda deve funcionar por mais de 6 loops, mas as cores não precisam ser distinguíveis para quaisquer loops adicionais (ou seja, você também pode reutilizar cores dos loops anteriores nesse ponto).

Isso é código de golfe, então a resposta mais curta (em bytes) vence.

Exemplos

Aqui estão todas as saídas até n = 16(onde a coluna corresponde ne a linha a m):

insira a descrição da imagem aqui Clique para uma versão maior.

Como exemplos para maiores n, aqui estão (n, m) = (29, 11)e (30, 12):

insira a descrição da imagem aquiinsira a descrição da imagem aqui

Martin Ender
fonte
E quanto a anti-aliasing e outras coisas? (Como estamos lidando com linhas angulares)
Optimizer
11
@ Otimizador Não vou prescrever um algoritmo anti-aliasing. As linhas podem ser alias ou anti-alias desde que sejam claramente visíveis. Use seu melhor julgamento.
Martin Ender

Respostas:

5

MATLAB, 85 81

A função exibe uma plotagem na tela.

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
fonte
Estou incerto de que isso funciona; se eu tiver feito isso corretamente, ela exibirá esta imagem por 30, 12. Veja: bit.ly/1GFZni7
durron597
@ durron597 Na verdade, ele funciona no Matlab, mas a função não é imediatamente reutilizável, porque os resultados hold alldo próximo gráfico são desenhados no topo do primeiro ... Não sei se temos um consenso sobre a reutilização das funções a serem executadas. honesto.
Martin Ender
@ MartinBüttner Deve ser hold onpara salvar um byte de qualquer maneira; se você adicionar quatro bytes, ele se tornará reutilizável ( clf\n)
durron597 13/10
Acontece que temos um consenso e eu até postei a pergunta e me respondi alguns meses atrás. oO Então, por esse meta post, isso seria inválido sem algo para liberar o hold.
Martin Ender
@ MartinBüttner Se você mudar hold allpara clf\nhold on, isso resolve o 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*

Ele gera a imagem no formato ASCII PGM.

Você pode experimentá-lo online , mas a saída é bastante longa. Você pode mudar 400e 199para números menores para reduzir o tamanho da imagem.

Como o CJam não possui conceito de imagens, desenhos, linhas ou formas, geramos a imagem em uma matriz quadrada, pixel por pixel (um número representando uma sombra cinza para cada pixel).

É assim que o resultado é 30 12:

poligrama

aditsu
fonte
1

Mathematica, 70 bytes

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

Bem ... esta é a minha implementação de referência que supera os dois envios até agora. Não tenho a intenção de vencer meu próprio desafio, então espero que alguém consiga vencer isso.

A saída é como as parcelas do próprio desafio, exceto que não estou removendo os eixos aqui:

insira a descrição da imagem aqui

Martin Ender
fonte