Escreva um programa ou função que receba as seguintes entradas em um formato razoável de sua escolha:
Dois números inteiros positivos W e H que definem a largura e a altura da imagem que você irá gerar.
Duas cores RGB C1 e C2 que serão usadas para colorir a imagem.
Uma lista de três tuplas do formulário
(r, x, y)
que definem círculos com raior
e centrox, y
no plano da imagem.r
É um número inteiro positivo ex
ey
são quaisquer inteiros. O pixel superior esquerdo da imagem é0, 0
e o eixo x aumenta para a direita e o eixo y aumenta para baixo.
Envie uma imagem com as dimensões W por H coloridas com C1 e C2, de modo que não haja duas regiões vizinhas definidas por todos os círculos sobrepostos da mesma cor.
Por exemplo: Se a entrada for
W = 300 H = 200 C1 = (255, 200, 0) C2 = (128, 0, 255) Circles = (25, 50, 80), (40, 80, 120), (300, -100, 6), (17, 253, 162)
então os limites do círculo ficam assim:
Existem seis regiões distintas e contíguas na imagem criada pelos círculos. Cada região deve ser colorida com C1 (amarelo) ou C2 (roxo), de modo que não haja duas regiões vizinhas da mesma cor.
Há duas maneiras de fazer isso, sua única diferença é que as cores são trocadas:
Assim, qualquer uma dessas duas imagens seria saída válida para a entrada de exemplo.
Algo parecido com isso seria saída inválida, pois duas regiões amarelas são vizinhas.
Suas imagens de saída devem seguir estas diretrizes:
Além de C1 e C2, uma terceira cor neutra, como preto ou branco, pode ser usada para os limites do círculo, desde que não tenham mais que 5 pixels de espessura. (Os limites pretos de 1 pixel de espessura estão presentes no exemplo acima.)
Os limites dos círculos não são necessários, no entanto. As regiões podem se vizinhos diretamente:
Ambos são outra saída válida para o exemplo acima.
Os círculos devem ser o mais precisos possível, usando algoritmos de desenho de círculo ou o que sua biblioteca de gráficos fornecer.
Em geral, a perfeição de pixels não é necessária, mas se os parâmetros de entrada forem redimensionados igualmente cada vez maiores, a imagem resultante deverá se tornar cada vez mais precisa.
Anti-aliasing é permitido, mas não obrigatório.
Linhas de grade ou rótulos de eixos etc. em segundo plano não são permitidos.
O código mais curto em bytes vence.
Mais exemplos
Todos usando essas entradas com diferentes conjuntos de círculos:
W = 100
H = 60
C1 = (255, 0, 0)
C2 = (0, 0, 255)
Em qualquer exemplo, as cores podem ser trocadas e permanecem válidas.
Circles =
A. empty list
B. (13, 16, 20)
C. (30, 16, 20)
D. (200, 16, 20)
E. (42, 50, 20)
F. (42, 50, 20), (17, 40, 30)
G. (42, 50, 20), (17, 20, 30)
H. (42, 50, 20), (17, 10, 30), (10, 50, 30)
I. (42, 50, 20), (17, 10, 30), (35, 50, 20)
J. (18, 36, 40), (18, 63, 40), (18, 50, 20)
K. (100, -10, -20), (60, 50, -10)
L. (18, 36, 40), (18, 63, 40), (18, 50, 20), (14, 50, 20), (5, 50, 18), (20, 0, 0), (70, 22, 0), (10000, -9970, 0), (135, 100, -80)
A.
B.
C.
D.
E.
F.
G.
H.
I.
J.
K.
L.
Verifique se sua saída se comporta de maneira semelhante a todos esses exemplos.
fonte
tikz
Respostas:
Mathematica, 165 bytes
Função pura usando quatro argumentos: a largura, a altura (ambos os números inteiros), um par ordenado de triplos de números entre 0 e 1 (representando as duas cores RGB) e uma lista de itens do formulário
{r, {x, y}}
para registrar os raios e centros de os círculos. Por exemplo, o primeiro exemplo no OP seria chamado com os argumentos[300, 200, {{1, 0.784, 0}, {0.5, 0, 1}}, {{25, {50, 80}}, {40, {80, 120}}, {300, {-100, 6}}, {17, {253, 162}}}]
. O eixo y positivo aponta para cima no Mathematica.Norm[{x,y}-#2]<#
detecta se um ponto está dentro de um determinado círculo;Boole[...]Pi
converte issoTrue
ouFalse
paraπ
ou0
. Após calcular esses πs / 0s em todos os círculos de entrada,Tr
some-os eCos
converta múltiplos pares de π em 1, múltiplos ímpares de π em –1.ContourPlot[...,Contours->{0}]
em seguida, pinte a região apropriada do plano em duas cores, dependendo se o valor for maior ou menor que0
.AspectRatio->Automatic
faz círculos parecerem círculos;PlotPoints->5!
fornece uma precisão decente (aumente-a9!
se você realmente quiser uma imagem incrível, no futuro!);Frame->False
se livra dos eixos; eContourShading->RGBColor@@@#3
usa as cores de entrada para os contornos.Exemplo de saída, com o primeiro par de cores (uma vez que são legais), mas o último conjunto de círculos:
fonte
JavaScript / SVG / HTML5, 219 bytes
fonte
BBC Basic,
120117 bytesFaça o download do intérprete em http://www.bbcbasic.co.uk/bbcwin/bbcwin.html
O BBC Basic possui uma variedade de modos de cores, permitindo plotar gráficos de varredura de acordo com operações lógicas básicas: OR, AND, XOR etc.
Ele também suporta reprogramação de paleta, o que significa que, por exemplo, aqui uma imagem de duas cores pode ter suas cores reprogramadas para qualquer uma das 4096 cores. A implementação usada aqui tem algumas diferenças (não documentadas) em relação à implementação original da BBC, na qual os operadores de EOR não seriam necessários.
Ungolfed
Tela de saída típica
Imagem de exemplo ampliada por um fator de 10 em unidades / fator de 5 em pixels (a BBC basic usa 1 pixel = 2 unidades).
fonte
MATL ,
302925 bytesFormato de entrada:
Experimente o MATL Online! Ou verifique o último caso de teste . (O intérprete ainda é experimental. Pode ser necessário atualizar a página e tentar novamente se não funcionar).
Explicação
O código usa números complexos para definir a grade de pontos e calcular distâncias e faz uso pesado de operações de matriz com transmissão .
fonte
Python usando pypng ,
140138 bytesExemplo de uso:
Obrigado ao xnor por salvar 2 bytes.
fonte
abs(x-X+1j*(y-Y))<r
.Matemática (não competitiva)
(idk como fazer LaTeX em PPCG, então eu usei uma ferramenta LaTeX para png)
Explicação
O produto de múltiplas equações circulares (
(x-a)^2+(y-b)^2-r^2
)> = 0 fará um gráfico necessário para esta pergunta. Na equação,n
é o tamanho da matriz e(x, y or r)_k
é o elementok
th(x, y, or r)
.Exemplo
(0,0,2),(2,2,2)
(Gráfico de desigualdade de WolframAlpha)
Obter / Executar equação para WolframAlpha
Mostrar snippet de código
Agora faça funcionar com o Mathematica ...
fonte
Python 2.x,
166158A função gera um arquivo PPM na saída padrão.
exemplo:
fonte
Lisp comum + Quicklisp + ZPNG 260 + 20 = 280 caracteres
Este é um dos códigos mais amplos que já escrevi no CL, e se não estivesse fazendo um código de golfe, teria reestruturado isso para facilitar a leitura ...
Prelúdio (20 caracteres)
Golfe (260 caracteres)
Ungolfed:
(Utiliza defun para permitir testes e nomes de variáveis mais longos para facilitar a leitura)
Exemplo de uso:
Explicação
Retorna true se o ponto (i, j) se encaixar dentro do circulo dado. A distância euclidiana é calculada tomando o valor absoluto do número complexo que representa o vetor de (i, j) até o centro do circ.
Mapeie essa função na lista de círculos e verifique se o ponto especificado (i, j) se enquadra em um número par de círculos.
Selecione a cor com base nesse teste.
Colete uma lista simples de todos os bytes rgb fazendo um loop sobre cada (i, j) na imagem e anexando as listas resultantes.
Converta essa lista de bytes em uma matriz adequada de bytes, para que o zpng possa ingeri-la corretamente.
Crie o objeto png.
Crie a função para obter a largura, altura, duas cores e lista de círculos e retornar o objeto png criado.
fonte
JavaScript (ES6), 224 bytes
Eu vi a solução JS + SVG, mas eu apenas tive que criar uma solução baseada em tela ;-) Esta é uma função que retorna um elemento de tela. Se um elemento de tela existente puder ser fornecido, remova 40 bytes.
Ligue como
f(width, height, [[r1, g1, b1], [r2, g2, b2]], [[r1, x1, y1], [r2, x2, y2], ...])
Exemplo de saída:
fonte
Löve2D , 353 bytes.
fonte