Это вторая из двух задач о «подтягивании функций». Вот несколько проще Часть I .
Вбиваем m гвоздей в доску в положениях (x 1 , y 1 ) - (x m , y m ) . Свяжите резиновую ленту с первым и последним из них и растяните вокруг других гвоздей так, чтобы полоса пересекала все гвозди по порядку. Обратите внимание, что резиновая полоса теперь описывает кусочно-линейную параметризованную функцию (x (t), y (t)) в 2D-пространстве.
Теперь проехать еще п гвозди в доску, в положениях (х 1 , у 1 ) к (х п , у п ) . Если мы теперь удалить все оригинальные м ногтей , за исключением первого и последней (что концы резины привязанных к), резинка будет сократить до тех пор, пока врет Тугую вокруг новых гвоздей, получая другое кусочно - линейную функцию.
В качестве примера возьмем m = 12 начальных гвоздей в положениях (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) и n = 10 дополнительных гвоздей в положениях (1, 1), (3, 1), (4, 4), (1, 3), (2, 2), (5, -1), (5, 0 ), (6, 2), (7, 1), (6, 0) . Следующие три графика показывают процесс, описанный выше:
Для большей версии: щелкните правой кнопкой мыши -> Открыть в новой вкладке
А вот анимация затягивания резинкой, если у вас возникли трудности с ее визуализацией:
Соревнование
Учитывая два списка «гвоздей», нарисуйте тугую резиновую полосу вокруг второго списка, если она начинается с формы, пересекающей все гвозди в первом списке.
Вы можете написать программу или функцию и получить ввод через STDIN, ARGV или аргумент функции. Вы можете либо отобразить результат на экране, либо сохранить изображение в файл.
Если результат растеризован, он должен быть не менее 300 пикселей с каждой стороны. Конечная резинка и гвозди должны покрывать не менее 75% горизонтального и вертикального размера изображения. Шкалы длин х и у должны быть одинаковыми. Вам нужно показать гвозди во втором наборе (используя не менее 3х3 пикселей) и строку (не менее 1 пикселя в ширину). Вы можете включать или не включать оси.
Цвета - ваш выбор, но вам нужно как минимум два различимых цвета: один для фона, другой для ногтей и нитки (хотя они могут иметь разные цвета).
Вы можете предположить, что все гвозди из второго списка находятся на расстоянии не менее 10 -5 единиц от первоначальной формы резиновой ленты (так что вам не нужно беспокоиться о неточности с плавающей точкой).
Это код гольф, поэтому самый короткий ответ (в байтах) выигрывает.
Больше примеров
Вот еще два примера:
{{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}}
И вот один пример, который показывает значение двух оставшихся начальных гвоздей. Результат должен быть b, а не a :
{{0, 0}, {0, 1}, {-1, 1}, {-1, -1}, {1, -1}, {1, 0}}
{{-0.5, 0.5}}
Спасибо Элл за предоставленный пример.