Estoy mirando por la ventana de mi ático hacia el patio de mi vecino. Tienen un perro encadenado a un poste en el centro del patio. El perro corre por el patio pero siempre está al final de su cadena, por lo que termina dejando una huella en la tierra. Normalmente, esta pista sería perfectamente circular, pero mis vecinos tienen otros postes en su patio donde la cadena del perro queda atrapada. Cada vez que la cadena del perro golpea un poste, el perro comienza a girar alrededor del nuevo poste con cualquier longitud de cadena que quede como su radio. Dado que los polos, el perro y la cadena tienen un ancho cero (mis vecinos son matemáticos), la cadena puede enrollarse indefinidamente alrededor de un poste sin que el radio del círculo se acorte. El perro también puede pasar a través de la cadena (simplemente no su collar) si la cadena está en su camino. Después de observar esta rareza por un tiempo, decido escribir un código para simular el perro de mi vecino. El código tomará las ubicaciones de un poste central, al que está encadenado el perro, las ubicaciones de los otros postes en el patio de mis vecinos, la longitud de la cadena y la ubicación inicial del perro, y mostrará un diagrama que indica el camino donde el perro ha desgastado la hierba. Puede suponer que cualquier combinación de lo siguiente es constante (y por lo tanto no los toma como entrada):
Ubicación del poste al que está encadenado el perro.
Longitud de la cadena
Lugar de inicio del perro
El sol está saliendo, por lo que el espacio en el piso de mi ático iluminado por la ventana se está reduciendo, lo que me da cada vez menos espacio para escribir mi código. Intente minimizar el recuento de bytes de su código para que tenga espacio para redactarlo en mi piso del ático.
Casos de prueba
Aquí supongo que el perro comienza 3 unidades al sur desde el polo al que está encadenado (el punto rojo), ubicado en 0,0
. He indicado dónde están los polos con puntos para mayor claridad, no necesita incluirlos en su salida.
Poles at 1,2 -1,2
Poles at 0,.5
Poles at 0,1 1,1 -2,1 -1,-.5
Poles at 0,1 1,1
fuente
{0,-.5}
?{0,.5}
volteado verticalmente sin el círculo más grande. El perro esencialmente comienza atrapado en el segundo poste.Respuestas:
Python 3 usando matplotlib, 457 bytes
Como sus vecinos son matemáticos, he asumido que el jardín de su vecino ocupa el dominio complejo y, por lo tanto, cualquier coordenada de objetos en el jardín son números complejos. Para utilizar esta función, debe pasarle una lista de números complejos que indiquen la ubicación de los postes en el jardín de su vecino. Se ha elegido la representación predeterminada del sistema de coordenadas, donde a la derecha hay números reales positivos y hacia arriba son números imaginarios positivos. Esto significa que los ejemplos se convierten en:
Además, el programa asume lo siguiente: la correa está atada al punto 0, la correa tiene 3 unidades de largo y el área de trazado es 10 por 10 centrada alrededor de 0. Para estos parámetros, los resultados coinciden exactamente con los ejemplos, y así es como se ve el resultado (para el ejemplo final):
El algoritmo es bastante simple, solo requiere uno condicional para diferenciar la búsqueda en sentido horario y en sentido antihorario. El estado del algoritmo está definido por el punto de rotación actual y la orientación / longitud restante de la correa cuando llega al punto de rotación actual. Funciona de la siguiente manera:
Este algoritmo se realiza primero en el sentido de las agujas del reloj, después de lo cual se restablece el estado y se ejecuta en el sentido contrario a las agujas del reloj. La simplicidad del algoritmo significa que aproximadamente la mitad del bytecount del programa se gasta en las funciones de dibujo. Si las rutinas de dibujo se eliminaran, eliminaría 218 bytes del tamaño del programa.
La siguiente es una versión no protegida que también contiene código de depuración, que también muestra puntos y colisiones de correa:
La salida que produce se ve así:
fuente
Procesamiento 3, 815
833835876879bytesAhorró dos bytes gracias a @ZacharyT al eliminar paréntesis innecesarios
Ejecute este programa así:
(la función
s
toma unfloat[][]
). Esto es esencialmente el caso de prueba # 3, pero multiplicado por 100 para ajustarse a la ventana.Varias cosas a tener en cuenta:
pushMatrix()
y lapopMatrix()
operación solo pueden contener 32 matrices.Salida de muestra para el caso de prueba anterior.
Si desea ver la salida prettificada, agregue esta línea justo después de la
translate(w,w);
función ins
.Y esto nos da este resultado:
Sin golfos
f()
y explicación(contiene código de depuración también)
En pocas palabras, el programa envía dos "buscadores", uno va en sentido antihorario y el otro en sentido horario. Cada uno de estos buscadores encuentra el poste más cercano y dibuja un arco si la cadena es lo suficientemente larga, de lo contrario dibuja un círculo. Una vez que dibuja un arco, envía a otro buscador a ese polo y el proceso continúa.
f()
contiene el proceso de cada buscador. Una explicación más detallada vendrá tan pronto como juegue más.fuente
L-d
?LOGOTIPO,
305298297293 bytesPrueba el código en FMSLogo.
Definir una función
draw
(golfizada comod
) que, dada la entrada como una lista de coordenadas de polo (por ejemplodraw [[0 100] [100 100] [-200 100] [-100 -50][0 0]]
, dibujará en la pantalla el resultado).Requisitos:
[0 0]
debe incluirse en la lista de postes. Si el código de depuración (dibujar polos) está activado, entonces[0 0]
debe ser el último elemento.x=0, y=-300
(como en la descripción del problema)Posibles optimizaciones:
>=
por>
Código de golf:
Código no oculto (
;
comienza un comentario en línea (utilizado para la explicación) e:
inicia un nombre de variable):fuente
Python 2 + PIL, 310 bytes
El script lee la lista de puntos de stdin como una lista de números complejos.
fuente