Escriba un programa o función que tome la siguiente entrada en un formato razonable de su elección:
Dos enteros positivos W y H que definen el ancho y la altura de la imagen que generará.
Dos colores RGB C1 y C2 que se usarán para colorear la imagen.
Una lista de 3 tuplas de la forma
(r, x, y)
que definen círculos con radior
y centrox, y
en el plano de la imagen.r
es un número entero positivox
yy
es cualquier número entero . El píxel superior izquierdo de la imagen es0, 0
y el eje x aumenta a la derecha y el eje y aumenta hacia abajo.
Imprima una imagen con dimensiones W por H que esté coloreada con C1 y C2 de modo que no haya dos regiones vecinas definidas por todos los círculos superpuestos que sean del mismo color.
Por ejemplo: si la entrada es
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)
entonces los límites del círculo se ven así:
Hay seis regiones distintas y contiguas en la imagen creada por los círculos. Cada región debe estar coloreada con C1 (amarillo) o C2 (púrpura) de modo que no haya dos regiones vecinas del mismo color.
Hay dos formas de hacer esto, la única diferencia es que los colores se intercambian:
Por lo tanto, cualquiera de estas dos imágenes sería una salida válida para la entrada de ejemplo.
Algo como esto sería una salida no válida ya que dos regiones amarillas se unen entre sí.
Sus imágenes de salida deben seguir estas pautas:
Además de C1 y C2, se puede usar un tercer color neutro, como el negro o el blanco, para los límites de los círculos, siempre que no tengan más de 5 píxeles de grosor. (Los límites negros de 1 píxel de grosor están presentes en el ejemplo anterior).
Sin embargo, no se requieren límites de círculos. Las regiones pueden ser vecinas entre sí directamente:
Ambos son otro resultado válido para el ejemplo anterior.
Los círculos deben ser tan precisos como sea razonablemente posible, utilizando algoritmos de dibujo de círculos o lo que proporcione su biblioteca de gráficos.
En general, no se requiere la perfección de píxeles, pero si los parámetros de entrada se escalan cada vez más, la imagen resultante debería ser más y más precisa.
El suavizado está permitido pero no es obligatorio.
Las cuadrículas o etiquetas de eje, etc. en el fondo no están permitidas.
El código más corto en bytes gana.
Más ejemplos
Todos usan estas entradas con diferentes conjuntos de círculos:
W = 100
H = 60
C1 = (255, 0, 0)
C2 = (0, 0, 255)
En cualquier ejemplo, los colores se pueden intercambiar y seguir siendo válidos.
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.
Asegúrese de que su salida se comporte de manera similar a todos estos ejemplos.
fuente
tikz
Respuestas:
Mathematica, 165 bytes
Función pura que toma cuatro argumentos: el ancho, la altura (ambos enteros), un par ordenado de triples números entre 0 y 1 (que representan los dos colores RGB) y una lista de elementos de la forma
{r, {x, y}}
para registrar los radios y centros de los círculos Por ejemplo, el primer ejemplo en el OP se llamaría con los argumentos[300, 200, {{1, 0.784, 0}, {0.5, 0, 1}}, {{25, {50, 80}}, {40, {80, 120}}, {300, {-100, 6}}, {17, {253, 162}}}]
. El eje y positivo apunta hacia arriba en Mathematica.Norm[{x,y}-#2]<#
detecta si un punto está dentro de un círculo dado;Boole[...]Pi
convierte esoTrue
oFalse
toπ
or0
. Después de calcular esos πs / 0s en todos los círculos de entrada, losTr
suma yCos
convierte los múltiplos pares de π a 1, los múltiplos impares de π a –1.ContourPlot[...,Contours->{0}]
luego colorea la región apropiada del plano en dos colores dependiendo de si el valor es mayor o menor que0
.AspectRatio->Automatic
hace que los círculos parezcan círculos;PlotPoints->5!
le da una precisión decente (¡aumente9!
si realmente desea una imagen increíble, lejos en el futuro!);Frame->False
se deshace de los ejes; yContourShading->RGBColor@@@#3
usa los colores de entrada para los contornos.Salida de muestra, con el primer par de colores (ya que son agradables) pero el último conjunto de círculos:
fuente
JavaScript / SVG / HTML5, 219 bytes
fuente
BBC básicos,
120117 bytesDescargue el intérprete en http://www.bbcbasic.co.uk/bbcwin/bbcwin.html
BBC Basic tiene una gama de modos de color que le permite trazar gráficos ráster de acuerdo con operaciones lógicas básicas: OR, AND, XOR, etc.
También admite la reprogramación de paletas, lo que significa que, por ejemplo, aquí una imagen de 2 colores puede reprogramar sus colores a cualquiera de los 4096 colores. La implementación utilizada aquí tiene algunas diferencias (no documentadas) de la implementación original de la BBC, en la cual los operadores EOR no serían necesarios.
Sin golf
Pantalla de salida típica
Imagen de ejemplo ampliada por un factor de 10 en unidades / factor de 5 en píxeles (BBC basic utiliza 1 píxel = 2 unidades).
fuente
MATL ,
302925 bytesFormato de entrada:
¡Pruébelo en MATL Online! O verificar el último caso de prueba . (El intérprete aún es experimental. Es posible que deba actualizar la página e intentar nuevamente si no funciona).
Explicación
El código usa números complejos para definir la cuadrícula de puntos y calcular distancias, y hace un uso intensivo de las operaciones de matriz con la transmisión .
fuente
Python usando pypng ,
140138 bytesEjemplo de uso:
Gracias a xnor por guardar 2 bytes.
fuente
abs(x-X+1j*(y-Y))<r
.Matemáticas (no competidoras)
(No sé cómo hacer LaTeX en PPCG, así que utilicé una herramienta LaTeX to png)
Explicación
El producto de ecuaciones de círculo múltiple (
(x-a)^2+(y-b)^2-r^2
)> = 0 hará un gráfico que esta pregunta necesita. En la ecuación,n
es el tamaño de la matriz y(x, y or r)_k
es el elementok
th(x, y, or r)
.Ejemplo
(0,0,2),(2,2,2)
(Gráfico de desigualdad de WolframAlpha)
Obtener / Ejecutar ecuación para WolframAlpha
Mostrar fragmento de código
Ahora haz que funcione con Mathematica ...
fuente
Python 2.x,
166158La función genera un archivo PPM en la salida estándar.
ejemplo:
fuente
Common Lisp + Quicklisp + ZPNG 260 + 20 = 280 caracteres
Este es uno de los códigos más amplios que he escrito en CL, y si no estuviera haciendo un código de golf, lo habría reestructurado para que sea mucho más fácil de leer ...
Preludio (20 caracteres)
Golfizado (260 caracteres)
Sin golf:
(Utiliza defun para permitir pruebas y nombres de variables más largos para facilitar la lectura)
Ejemplo de uso:
Explicación
Devuelve verdadero si el punto (i, j) cae dentro del círculo del círculo dado. La distancia euclidiana se calcula tomando el valor absoluto del número complejo que representa el vector desde (i, j) hasta el centro del círculo.
Asigne esa función en la lista de círculos y verifique si el punto dado (i, j) se encuentra dentro de un número par de círculos.
Seleccione el color basado en esa prueba.
Reúna una lista plana de todos los bytes rgb haciendo un bucle sobre cada (i, j) en la imagen y agregando las listas resultantes.
Convierta esa lista de bytes en una matriz adecuada de bytes, para que zpng pueda ingerirla correctamente.
Crea el objeto png.
Cree la función para tomar el ancho, la altura, dos colores y la lista de círculos y devolver el objeto png creado.
fuente
JavaScript (ES6), 224 bytes
Vi la solución JS + SVG, pero solo tuve que crear una solución basada en lienzo ;-) Esta es una función que devuelve un elemento de lienzo. Si se puede proporcionar un elemento de lienzo existente, elimine 40 bytes.
Llamar como
f(width, height, [[r1, g1, b1], [r2, g2, b2]], [[r1, x1, y1], [r2, x2, y2], ...])
Salida de ejemplo:
fuente
Löve2D , 353 Bytes.
fuente