Escreva um programa ou função que receba um número inteiro positivo N e recrie esse padrão de círculos dimensionados para ajustar uma imagem de pixel N × N:
Esta imagem é um exemplo de saída válido para N = 946.
Caso não esteja claro, todos os pequenos círculos azul claro têm o mesmo raio e são posicionados nos quatro círculos azul escuro da mesma maneira. Os círculos azul escuro têm o dobro desse raio e estão posicionados de maneira semelhante no grande círculo azul claro.
Quaisquer duas cores visualmente distintas podem ser usadas no lugar dos dois tons de azul.
O quadrado do plano de fundo precisa ser colorido.
Anti-aliasing é opcional.
Salve a imagem em um arquivo, exiba-o ou envie os dados brutos da imagem para o stdout.
Qualquer formato de arquivo de imagem comum é permitido.
O código mais curto em bytes vence.
Brownie aponta se você estender os aspectos recursivos desse padrão de círculo para outros níveis. (Mantenha isso diferente da entrada do seu desafio.)
fonte
Respostas:
CJam, 83 bytes
Experimente online
O CJam não possui funcionalidade de saída de imagem dedicada. Meu código gera uma imagem no PBM ASCII. Para postar, converti essa imagem em PNG usando o GIMP.
Observe que nenhuma funcionalidade de desenho de círculo, ou qualquer coisa assim, era usada. A imagem é calculada pixel por pixel.
Graus mais altos da subdivisão podem ser criados facilmente, aumentando a constante
3
no meio do código.As imagens dos graus 4 e 5 são assim:
A sequência geral do código é:
Explicação:
fonte
Python 2 + PIL, 262 bytes
Essa abordagem determina a cor de cada coordenada de pixel individual usando a função recursiva
c
.c(x,y,0)
renderiza um círculo;c(x,y,1)
renderiza um círculo com quatro círculos recortados;c(x,y,2)
renderiza a imagem no OP. Qualquer coisa maior que 2 me ganha pontos de brownie.Versão sem golfe:
Imagem extra-recursiva de bônus:
fonte
.save("p.png")
apenas usar.show()
PostScript, 335 bytes.
O PostScript não é apenas um formato de arquivo gráfico com recursos de vetor e bitmap; na verdade, é uma linguagem de programação completa de Turing baseada em objetos. O código acima é uma implementação de função recursiva bastante direta. Todos os operadores PostScript são funções, e é comum redefini-los para condensar o código. Observe que o PostScript usa notação polonesa reversa (também conhecida como notação postfix).
Os intérpretes PostScript geralmente leem metadados (como tamanho e título da página) de comentários especiais no início do arquivo; Obviamente, removi tudo, exceto o comentário essencial da assinatura PostScript
%!
da minha entrada, mas ele ainda deve ser exibido em qualquer interpretador PostScript padrão, por exemplo, GhostScript ou Okular. Também pode ser visualizado usando o utilitário de exibição que acompanha o ImageMagick / GraphicsMagick.Observe que o arquivo deve terminar em uma nova linha (que eu incluí na minha contagem de bytes) ou o intérprete pode ficar chateado.
O parâmetro de tamanho
N
para esse código é 512; é dividido por 2 e duplicado duas vezes para criar os parâmetros para a chamada inicial da função recursivaf
. A profundidade de recursão é 2, que é dado imediatamente antes dof
no512 2 div dup dup 2 f
. Para manter o tamanho pequeno, a saída é em preto e branco. Embora você possa definir uma profundidade razoável de recursão de número inteiro não negativo razoável, esta versão parece boa apenas com profundidades uniformes.Esta imagem é um gráfico vetorial, portanto pode ser exibida em qualquer resolução sem pixelização, dependendo da qualidade e das configurações do interpretador / impressora PostScript usado. (FWIW, o PostScript usa curvas cúbicas de Bézier para desenhar arcos circulares, com splines suficientes usados para garantir que o erro seja sempre menor que um pixel no espaço do dispositivo). Para visualizá-lo usando a tela do ImageMagick com qualidade razoavelmente alta, você pode:
os mesmos parâmetros também são bons se você deseja usar o ImageMagick
convert
para convertê-lo em outro formato. Por exemplo, aqui está uma versão de 640x640 do código PostScript acima convertida em PNG:Aqui está uma versão um pouco maior que lida com cores RGB e profundidades de recursão ímpares:
Também permite definir o parâmetro de tamanho
N
e a profundidade da recursãod
próximo à parte superior do script.Finalmente, aqui está a forma mais legível do código. (Infelizmente, o destaque da sintaxe usado aqui para PostScript deixa muito a desejar, mas acho que é melhor que nada ...). Intérpretes PostScript inteligentes lerão a geometria da página a partir do
%%BoundingBox:
comentário especial.E aqui está a profundidade == 4 saída no formato PNG, mais uma vez criada usando convert (e otimizada com optipng ):
fonte
Python 2 + PIL, 361 bytes
Salva a imagem em preto e branco no arquivo
c.png
:Basicamente, giro um dos círculos de tamanho médio na imagem
J
. Depois, uso-me como uma máscara para pintar a forma na imagemI
, que tem o círculo principal.Pode ser reduzido usando
I.show()
no finalI.save("c.png")
, mas não o fiz funcionar no Python 2. Se alguém puder confirmar que funciona no Python 2, vou mudar para isso.O programa a seguir gera a imagem como na pergunta (419 bytes):
fonte
save
.SVG (1249 caracteres)
Sim, muitos personagens. Mas é estático e é processado em qualquer tamanho, o que lhe dá algum bônus.
Snippet visível:
fonte
0
em constantes de ponto flutuante? Por exemplo, substitua0.4
por.4
? Na maioria dos idiomas, isso é válido. E uma análise muito rápida da especificação SVG sugere que ela provavelmente deve funcionar também.Mathematica
336359 bytesOs principais objetos gráficos são regiões definidas através de combinações lógicas de equações.
fonte
Java, 550
Principalmente apenas experimentando o JavaFX.
Captura de tela:
Para pontos brownie, altere
2
o código (d(n,2,0,0)
) para um número diferente.Versão antiga, 810
Deixa algumas arestas indesejadas, como você pode ver nesta captura de tela .
fonte
JavaScript (ES6), 279
Crie recursivamente telas e adicione a tela filho quatro vezes à tela pai. Na camada inferior, a tela é um único círculo; essa tela é carimbada quatro vezes em uma tela pai e, em seguida, essa tela é carimbada quatro vezes na tela principal final.
Demonstração executável:
Mostrar snippet de código
Com espaço em branco, comentários e levemente sem armas:
Isso pode facilmente produzir camadas mais profundas de recursão, alterando o valor inicial
o-2
ou qualquero-z
valor maior .Observe que esse envio será executado apenas no Firefox, devido ao uso dos recursos e da inconsistência do ES6 na API de tela para argumentos
fill
eclip
.fonte