Это вторая из двух задач о «подтягивании функций». Вот несколько проще Часть 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}}
Спасибо Элл за предоставленный пример.
источник
Ответы:
Python + matplotlib, 688
Читает два списка точек из STDIN.
пример
Как это устроено
Ключ к решению состоит в том, чтобы работать небольшими, постепенными шагами. Вместо того, чтобы пытаться понять, что происходит, когда мы удаляем все ногти одновременно, мы концентрируемся на непосредственных эффектах удаления всего одного ногтя. Затем мы можем удалить гвозди один за другим в произвольном порядке.
Работа постепенно означает, что мы должны следить за промежуточным состоянием резиновой ленты. Вот сложная часть: недостаточно просто отслеживать, через какие гвозди проходит группа. В процессе удаления ногтей полоса может наматываться, а затем разматываться вокруг ногтя. Поэтому, когда группа взаимодействует с гвоздем, мы должны отслеживать, сколько раз и в каком направлении она оборачивается вокруг него. Мы делаем это, присваивая значение каждому гвоздю вдоль полосы следующим образом:
Обратите внимание, что:
Мы начинаем считать, как только полоса касается ногтя, хотя гвоздь строго не влияет на его форму. Напомним, что, в отличие от иллюстрации, наши ногти безразмерны. Поэтому, если группа становится касательная к гвоздю мы не можем сказать , какая сторона полосы гвоздь на своей позиции в одиночку --- мы должны отслеживать, где она используется , чтобы быть по отношению к группе.
Мы держим вокруг гвоздей с нулевым значением, то есть гвоздей, которые раньше, но больше не держали ленту, вместо того, чтобы сразу их удалять. Если мы это сделаем, это может вызвать нежелательную цепную реакцию, в то время как мы пытаемся сохранить эффекты каждого шага локализованными. Вместо этого гвозди с нулевым значением считаются пригодными для удаления как часть более крупного процесса.
Теперь мы можем описать, что происходит на каждом этапе:
Мы выбираем гвоздь, чтобы удалить из текущего пути группы. Гвоздь может быть удален, если он входит в первый набор гвоздей (за исключением конечных точек) или если его значение равно нулю.
Делая вид, что два соседних гвоздя зафиксированы, мы выясняем, какие гвозди из второго набора или пару конечных точек, через которые будет проходить полоса, после удаления выбранного гвоздя (мы не беспокоимся по поводу остальных гвоздей из первый набор, так как они в конечном счете быть удалены.) Мы делаем это таким же образом , чтобы решения первой части . Все эти ногти находятся на одной стороне полосы, поэтому мы присваиваем всем им значение 1 или -1 , в зависимости от стороны.
Мы обновляем значение двух соседних гвоздей, чтобы отразить изменения в пути группы (легко самая хитрая часть!)
Этот процесс повторяется до тех пор, пока не останется больше гвоздей для удаления:
А вот более сложный пример, иллюстрирующий, как группа несколько раз оборачивается вокруг гвоздя:
источник
Java - 1262 байта
Я знаю, что это, вероятно, не так много в гольфе, как могло бы быть.
Однако, похоже, никто больше не подходит к тарелке и не отвечает на этот вопрос, поэтому я буду.
Во-первых, класс "T" - точечный класс - 57 байт
А основной класс - 1205 байт
Пример:
Чтобы запустить, вызовите функцию "d" со списком точек и массивом гвоздей (да, я знаю, странно). Что оно делает:
Я не уверен, что оси в пикселях в порядке. Он всегда будет занимать более 75% пространства, он может быть очень, очень маленьким.
Вот хорошая анимация, чтобы продемонстрировать, что я здесь делаю:
В конце концов, это становится таким, в котором точки едва двигаются. Это когда я вижу, какие ногти это касается:
Вот код без анимации:
источник