El pequeño Chandler está triste. Dibujale una nube para animarlo.
Nota: Dibujar una nube en realidad no lo animará.
Un círculo se puede definir como una tupla de 3 (x,y,r)
donde x
está la posición x del círculo en un plano cartesiano, y
es la posición y del círculo en un plano cartesiano y r
es el radio del círculo. x
y y
puede ser negativo r
Siempre es positivo. La entrada es una lista de círculos en forma de 3-tuplas separadas por espacios. Por ejemplo:
3,1,1 3,2,1.5 1,2,0.7 0.9,1.2,1.2 1,0,0.8
El 3,1,1
significa "Un círculo con punto central en 3,1
con 1 radio. 3,2,1.5
Significa" Un círculo con punto central en 3,2
con 1,5 radios.
Si dibujamos todos estos círculos de la entrada en un gráfico, se ve así (he incluido líneas de cuadrícula y etiquetas solo para mayor claridad; no son necesarias):
Observe cómo todos los círculos son cohesivos . Es decir, todos se superponen de manera tal que forma un grupo grande sin ningún grupo pequeño de círculos separados del resto. La entrada está garantizada para ser cohesiva.
Supongamos ahora que dibujamos una línea que viaja alrededor del "borde" formado por estos círculos, sin ninguna de las otras líneas. Sería como dibujar el borde de la silueta formada por todos los círculos. La nube resultante se vería así:
Entonces, esta nube se formó dibujando solo los arcos de los círculos en la entrada que forman un borde, dando como resultado una sola forma. En otras palabras, la nube se forma dibujando solo los arcos que no están dentro de otro círculo. Su programa tomará datos en el formulario explicado anteriormente y generará una imagen que muestra la nube resultante. La forma general de la nube debe ser correcta, pero la escala, el color, el grosor de la línea y el aspecto de los vértices depende de usted. Tenga en cuenta que la nube debe ser visible, por lo que no puede extraer algo como "Este programa dibuja una nube blanca sobre un fondo blanco", "Este programa dibuja una nube a una escala infinitamente pequeña", "Este programa dibuja una nube con 0 grosor de línea ", etc. Tenga también en cuenta que el color del borde debe ser diferente del color del relleno o del fondo.
Otro ejemplo. Entrada:
1,4,2 5,2,1 3,1,1 3.5,2,1.2 3,3,0.7 1,2,0.7
Salida:
Si hay un "agujero" en la nube, también debe dibujar el agujero. Entrada:
0,5,4 3,4,4 4,3,4 5,0,4 4,-3,4 3,-4,4 0,-5,4 -3,-4,4 -4,-3,4 -5,0,4 -4,3,4 -3,4,4
Salida:
Aquí hay una regla importante: su programa debe dibujar solo las líneas que forman el borde. Esto significa que NO PUEDE dibujar los círculos completamente, y luego dibujar los círculos un poco más pequeños con un relleno blanco, porque ese método todavía dibuja líneas que no forman un borde, simplemente las cubre después. El propósito de la regla era evitar las implementaciones de "dibujar los círculos, luego dibujar los círculos nuevamente con un relleno blanco", o algo similar a eso. Se espera que la respuesta realmente calcule dónde dibujar cosas antes de dibujarla.
Este es el código de golf, por lo que gana el recuento de caracteres más corto.
fuente
Respuestas:
Mathematica
177 126 121119Resolver por regiones de disco: el enfoque del matemático
La lógica es
Este es precisamente el enfoque adoptado a continuación. Produjo las 3 figuras de arriba.
La región implícita # 1 es la unión de los círculos. La región implícita # 2 es la unión de los discos que se encuentran dentro de los círculos. Su diferencia es la frontera.
Resolver por regiones de disco: el enfoque del ingeniero (119 caracteres)
Lo siguiente toma la unión de las regiones del disco, discretiza esa región y encuentra su límite. Los puntos en el diagrama delimitan los intervalos de la malla de Delaunay. Mostramos la región discretizada a continuación para resaltar el objeto que proporciona el límite de interés (el contorno de la nube).
"3,1,1 3,2,1.5 1,2,0.7 0.9,1.2,1.2 1,0,0.8"
El límite de la región está discretizado.
Resolviendo mediante la detección de bordes: el enfoque del fotógrafo - 121 caracteres
Dibuja los discos en negro, rasteriza la imagen, detecta los bordes e invierte en blanco y negro.
fuente
RegionBoundary@DiscretizeRegion@RegionUnion[{#,#2}~Disk~#3&@@@ToExpression[#~s~","]&@s@InputString[s=StringSplit]]
s=StringSplit
dentro del aviso? Intenta moverlo al frente nuevamente, aún debe ser más corto que tu versión actual.T-SQL
23523422921217173 bytesEsto hace uso de la funcionalidad espacial en SQL Server 2012+. Cuando se ejecuta en SSMS (SQL Server Management Studio) se produce un panel de resultados espaciales.
La entrada es de la variable @i. Podría reducirlo aún más si la entrada pudiera tomarse de una tabla.Dado que la entrada de la tabla ahora está permitida.
He dejado la solución anterior a continuación.
Editar : Retire el espacio callejero, el superávit en y subconsulta
171: Se reemplazó la creación de tablas con CTE y @s con @.
Desglose del SQL dinámico
fuente
'A' has fewer columns than were specified in the column list
DECLARE @i VARCHAR(100) = '1,4,2 5,2,1 3,1,1 3.5,2,1.2 3,3,0.7 1,2,0.7'
. Desafortunadamente, no puedo probar en este momento y SQLfiddle no está jugando bien para 2012.Mathematica,
175158149 bytesRecuerdo por la discusión en el sandbox que se suponía que este enfoque era válido, pero no estoy completamente seguro de cómo se ajusta a la nueva redacción de las reglas, así que @Lilac, avíseme si cree que esto viola las reglas.
Básicamente, estoy creando una condición lógica que es verdadera para todos los puntos dentro de la nube y falsa para todos los puntos fuera de ella. Estoy alimentando aquello
RegionPlot
que luego representa la región de todos los puntos donde está la expresiónTrue
, así como un contorno a su alrededor.Sin golf:
fuente
ImplicitRegion
encuentra automáticamente los valores adecuados de x e y para el trazado. 122 caracteres:s = StringSplit; RegionPlot@ ImplicitRegion[ Or @@ (((x - #)^2 + (y - #2)^2 < #3^2) & @@@ (ToExpression[#~s~","] &@(s@InputString[]))), {x, y}]
RegionPlot
hasta ahora.),AspectRatio-> 1
el código vuelve a 149 bytes, exactamente donde está ahora.Python 3.3 (
183177164160 bytes)Requiere una consola de 80 caracteres de ancho, que sé que es la predeterminada en Windows. Funciona mejor si su consola tiene una fuente cuadrada. Aquí hay algunos extractos de algunas de las entradas de prueba.
Original:
Otro:
Agujero:
fuente
Python -
253249215199Este es un anuncio de la impresionante biblioteca de formas , cuyas operaciones de geometría hicieron que escribir la solución sea sencillo al dibujar los contornos de la unión de círculos superpuestos (= puntos almacenados):
Salida:
Editar (s):
sys.argv[1:]
porraw_input().split()
, guardando unimport sys
k={'color':'k'}
lujo eliminado , reemplazadosavefig
porshow
map(float,s.split(','))
poreval(s)
fuente
Python - 535
fuente
from math import*
eliminando espacios innecesarios, utilizando solo nombres de variables de una letra, utilizando la comprensión de la lista (por ejemplo,cc=[z for z in a if z!=a2 and (z[0]…)]
). También eche un vistazo a los consejos para jugar golf en Python .a2
.Python -
296249231223212El crédito va a @ richard-green (se le dio permiso) para la solución original, lo he reducido un poco.
fuente
pylab
lugar dematplotlib.pyplot
.from pylab import *
podría seguir llamandoshow()
yscatter()
sin referencias?[eval(i)for i in raw_input().split()]
como los pitones seeval
convierten1,2,3
en una tupla. Por supuesto, también tendrá que cambiar el[x,y,r]
a a(x,y,r)
.JavaScript (E6) + HTML 322
JSFiddle
Cada círculo se subdivide en aproximadamente 100 arcos pequeños, y cada arco se dibuja si su punto medio no está dentro de ninguno de los otros círculos.
fuente
Python 274 bytes
Esto toma la entrada de stdin y verifica cada punto de la pantalla, dibujando los píxeles uno por uno a medida que avanza. No es exactamente eficiente pero sigue todas las reglas.
Tenga en cuenta que la pantalla de pygame finalizará tan pronto como se complete el dibujo, no estaba seguro de si debería incluirlo como parte de mi respuesta, pero para verlo puede
raw_input
agregar un final al final o agregar un pequeño bucle si desea que el sistema operativo deje de quejarse de que no responde y tal:Imágenes de ejemplo:
1,4,2 5,2,1 3,1,1 3.5,2,1.2 3,3,0.7, 1,2,0.7
0,5,4 3,4,4 4,3,4 5,0,4 4,-3,4 3,-4,4 0,-5,4 -3,-4,4 -4,-3,4 -5,0,4 -4,3,4 -3,4,4
fuente
Perl - 430
Escribe un archivo pbm en stdout.
Imagen de prueba (convertida a png):
fuente