Este es el segundo de dos desafíos sobre "tensar las funciones de tracción". Aquí está la Parte I, un poco más simple .
Pongamos m clavos en una tabla en las posiciones (x 1 , y 1 ) a (x m , y m ) . Ate una banda de goma al primero y al último de ellos y estírese alrededor de las otras uñas, de modo que la banda atraviese todas las uñas en orden. Tenga en cuenta que la banda elástica ahora describe una función parametrizada lineal por partes (x (t), y (t)) en el espacio 2D.
Ahora inserte otros n clavos en el tablero, en las posiciones (x 1 , y 1 ) a (x n , y n ) . Si ahora eliminamos todos los clavos m originales, excepto el primero y el último (al que están unidos los extremos de la goma), la banda elástica se acortará hasta que quede tensa alrededor de las nuevas uñas, produciendo otra función lineal por partes.
Como ejemplo, tome m = 12 clavos iniciales en las posiciones (0, 0), (2, -1), (3/2, 4/3), (7/2, 1/3), (11/2, 16/3), (1, 16/3), (0, 1), (7, -2), (3, 4), (8, 1), (3, -1), (11, 0) , yn = 10 clavos adicionales en las posiciones (1, 1), (3, 1), (4, 4), (1, 3), (2, 2), (5, -1), (5, 0 ), (6, 2), (7, 1), (6, 0) . Los siguientes tres gráficos muestran el proceso descrito anteriormente:
Para una versión más grande: haga clic con el botón derecho -> Abrir en una pestaña nueva
Y aquí hay una animación del ajuste de la banda elástica si tiene alguna dificultad para visualizarla:
El reto
Dadas dos listas de "clavos", trace la banda elástica tensa alrededor de la segunda lista si comienza desde la forma que atraviesa todas las uñas en la primera lista.
Puede escribir un programa o función y recibir información a través de STDIN, ARGV o argumento de función. Puede mostrar el resultado en la pantalla o guardar una imagen en un archivo.
Si el resultado está rasterizado, debe tener al menos 300 píxeles en cada lado. La banda elástica final y los clavos deben cubrir al menos el 75% de la extensión horizontal y vertical de la imagen. Las escalas de longitud de x y y tienen que ser las mismas. Debe mostrar las uñas en el segundo conjunto (usando al menos 3x3 píxeles) y la cadena (al menos 1 píxel de ancho). Puede incluir o no los ejes.
Los colores son su elección, pero necesita al menos dos colores distinguibles: uno para el fondo y otro para las uñas y la cuerda (aunque pueden tener colores diferentes).
Puede suponer que todas las uñas en la segunda lista son al menos 10-5 unidades de distancia de la forma inicial de la banda elástica (para que no tenga que preocuparse por la inexactitud de punto flotante).
Este es el código de golf, por lo que gana la respuesta más corta (en bytes).
Más ejemplos
Aquí hay dos ejemplos más:
{{1, 1}, {3, 3}, {2, 4}, {1, 3}, {4, 0}, {3, -1}, {2, 0}, {4, 2}}
{{2, 1}, {3, 2}, {1, 2}, {4, 1}}
{{1, 1}, {3, 1}, {3, 3}, {1, 3}, {1, 5}, {3, 5}, {-1, 3}, {-1, 0}, {3, 4}, {5, 1}, {5, -1}, {7, -1}, {3, 7}, {7, 5}}
{{0, 0}, {0, 2}, {0, 4}, {0, 6}, {2, 0}, {2, 2}, {2, 4}, {2, 6}, {4, 0}, {4, 2}, {4, 4}, {4, 6}, {6, 0}, {6, 2}, {6, 4}, {6, 6}}
Y aquí hay un ejemplo que muestra la importancia de dos de las uñas iniciales restantes. El resultado debe ser b y no a :
{{0, 0}, {0, 1}, {-1, 1}, {-1, -1}, {1, -1}, {1, 0}}
{{-0.5, 0.5}}
Gracias a Ell por proporcionar este ejemplo.