Escriba un programa o función que tome un número entero positivo N y recrea este patrón de círculos escalados para ajustarse a una imagen de píxeles N × N:
Esta imagen es un ejemplo de salida válido para N = 946.
En caso de que no esté claro, todos los círculos pequeños de color azul claro tienen el mismo radio y se colocan en los cuatro círculos de color azul oscuro de la misma manera. Los círculos azul oscuro tienen el doble de ese radio y están colocados de manera similar en el gran círculo azul claro.
Se pueden usar dos colores visualmente distintos en lugar de los dos tonos de azul.
El cuadrado de fondo necesita ser coloreado.
El suavizado es opcional.
Guarde la imagen en un archivo, muéstrela o canalice los datos de la imagen sin procesar a stdout.
Se permite cualquier formato de archivo de imagen común.
El código más corto en bytes gana.
Brownie señala si extiende los aspectos recursivos de este patrón de círculo a niveles adicionales. (Mantenga esto distinto de su entrada de desafío).
fuente
Respuestas:
CJam, 83 bytes
Pruébalo en línea
CJam no tiene una funcionalidad de salida de imagen dedicada. Mi código genera una imagen en PBM ASCII. Para publicar, convertí esa imagen a PNG usando GIMP.
Tenga en cuenta que no se utilizó ninguna funcionalidad de dibujo circular, ni nada de eso. La imagen se calcula píxel por píxel.
Los grados más altos de la subdivisión se pueden crear fácilmente al aumentar la constante
3
alrededor de la mitad del código.Las imágenes de grado 4 y 5 se ven así:
La secuencia general del código es:
Explicación:
fuente
Python 2 + PIL, 262 bytes
Este enfoque determina el color de cada coordenada de píxel individual utilizando la función recursiva
c
.c(x,y,0)
hace un círculo;c(x,y,1)
hace un círculo con cuatro círculos cortados;c(x,y,2)
renderiza la imagen en el OP. Cualquier cosa mayor que 2 me gana puntos de brownie.Versión sin golf:
Imagen extra recursiva extra:
fuente
.save("p.png")
solo usar.show()
PostScript, 335 bytes.
PostScript no es solo un formato de archivo de gráficos con capacidades vectoriales y de mapa de bits, en realidad es un lenguaje de programación completo de Turing basado en objetos. El código anterior es una implementación de función recursiva bastante sencilla. Todos los operadores PostScript son funciones, y es común redefinirlos para condensar código. Tenga en cuenta que PostScript utiliza la notación polaca inversa (también conocida como notación postfix).
Los intérpretes PostScript generalmente leen metadatos (como el tamaño de la página y el título) de comentarios especiales al comienzo del archivo; obviamente, he eliminado todos los comentarios esenciales de la firma PostScript
%!
, excepto el básico, de mi entrada, pero aún debería aparecer bien en cualquier intérprete PostScript estándar, por ejemplo, GhostScript u Okular. También se puede ver usando la utilidad de visualización que viene con ImageMagick / GraphicsMagick.Tenga en cuenta que el archivo debe terminar en una nueva línea (que he incluido en mi recuento de bytes), o el intérprete puede molestarse.
El parámetro de tamaño
N
para este código es 512; se divide por 2 y se duplica dos veces para crear los parámetros para la llamada inicial de la función recursivaf
. La profundidad de recursión es 2, que se da justo antes de laf
en512 2 div dup dup 2 f
. Para mantener el tamaño pequeño, la salida es en blanco y negro. Aunque puede establecer cualquier profundidad de recursión entera no negativa razonable, esta versión solo se ve bien con profundidades pares.Esta imagen es un gráfico vectorial, por lo que se puede mostrar en cualquier resolución sin pixelización, dependiendo de la calidad y la configuración del intérprete / impresora PostScript utilizado. (FWIW, PostScript utiliza curvas cúbicas de Bézier para dibujar arcos circulares, con suficientes splines para garantizar que el error siempre sea inferior a un píxel en el espacio del dispositivo). Para verlo usando la pantalla de ImageMagick con una calidad razonablemente alta, puede hacer lo siguiente:
los mismos parámetros también son buenos si desea usar ImageMagick's
convert
para convertirlo a otro formato. Por ejemplo, aquí hay una versión de 640x640 del código PostScript anterior convertido a PNG:Aquí hay una versión un poco más grande que maneja el color RGB y las profundidades de recursión extrañas:
También le permite establecer el parámetro de tamaño
N
y la profundidad de recursiónd
cerca de la parte superior del script.Finalmente, aquí está la forma más legible del código. (Desafortunadamente, el resaltado de sintaxis utilizado aquí para PostScript deja mucho que desear, pero supongo que es mejor que nada ...). Los intérpretes inteligentes de PostScript leerán la geometría de la página del
%%BoundingBox:
comentario especial.Y aquí está la salida de profundidad == 4 en formato PNG, una vez más creado usando convertir (y optimizado con optipng ):
fuente
Python 2 + PIL, 361 bytes
Guarda la imagen en blanco y negro en el archivo
c.png
:Básicamente genero uno de los círculos de tamaño medio en la imagen
J
. Luego me uso como una máscara para pintar la forma en la imagenI
, que tiene el círculo principal.Podría acortarse usando
I.show()
al final en lugar deI.save("c.png")
, pero no lo hice funcionar en Python 2. Si alguien puede confirmar que funciona en Python 2, cambiaré a eso.El siguiente programa genera la imagen como en la pregunta (419 bytes):
fuente
save
.SVG (1249 caracteres)
Sí, muchos personajes. Pero es estático y se presenta en cualquier tamaño, por lo que le da algo de bonificación.
Fragmento visible:
fuente
0
en constantes de coma flotante? Por ejemplo, reemplazar0.4
por.4
? En la mayoría de los idiomas, eso es válido. Y un vistazo muy rápido de las especificaciones SVG sugiere que probablemente también debería funcionar.Mathematica
336359 bytesLos principales objetos gráficos son regiones definidas a través de combinaciones lógicas de ecuaciones.
fuente
Java, 550
Mayormente solo experimentando con JavaFX.
Captura de pantalla:
Para los puntos de brownie, cambie el
2
código (d(n,2,0,0)
) a un número diferente.Versión anterior, 810
Deja algunos bordes no deseados como puede ver en esta captura de pantalla .
fuente
JavaScript (ES6), 279
Cree recursivamente lienzos y agregue el lienzo secundario cuatro veces a su lienzo principal. En la capa inferior, el lienzo es un círculo único; ese lienzo se estampó cuatro veces en un lienzo de los padres, y después de que la lona se estampa cuatro veces en el lienzo final de máster.
Demo ejecutable:
Mostrar fragmento de código
Con espacios en blanco, comentarios y un poco descuidados:
Esto puede producir fácilmente capas más profundas de recursión cambiando el valor inicial
o-2
o cualquiero-z
valor mayor .Tenga en cuenta que este envío solo se ejecutará en Firefox, debido al uso de las características de ES6 y la inconsistencia en la API del lienzo
fill
y losclip
argumentos.fuente