Вы владелец ресторана. Вы открываете в новой области в Cartesia, где есть только одна главная дорога, известная как ось Y. Вы хотите разместить свой ресторан таким образом, чтобы минимизировать общее расстояние от вашего ресторана и каждого из домов в этом районе.
Вход :
Вход будет
n, the number of houses
house1
house2
house3
...
houseN
где каждый дом является координатой в форме x y
. Каждая единица представляет один километр.
Вы можете принять входные данные как строку или предоставить функцию, которая принимает входные данные в любом формате в качестве аргументов.
Вывод : Y-координата вашего ресторана (помните, он будет расположен на оси Y). На самом деле, он будет расположен на обочине дороги, но разница незначительна.
По сути, если n-й дом есть h_n
и D
есть функция расстояния, то вы хотите найти k
такую, которая D(h_0, (0, k)) + D(h_1, (0, k)) + D(h_2, (0, k)) + ... + D(h_n, (0, k))
сведена к минимуму.
Обратите внимание, что расстояние рассчитывается так, как если бы клиент путешествовал по прямой линии от дома до ресторана. Это расстояние от (x, y)
вашего ресторана sqrt(x^2 + (y - k)^2)
.
Вывод должен быть точным, по крайней мере, до 2 десятичных знаков.
Вывод может быть напечатан в виде строки или может быть возвращен из функции.
Пример ввода / вывода:
Input:
2
5.7 3.2
8.9 8.1
Output:
5.113013698630137
Общее расстояние в этом примере составляет около 15.4003
километров.
Это код гольф - самый короткий код выигрывает.
PS Меня также интересует математическое решение, которое не просто грубая сила. Он не выиграет гольф-код, но получит несколько голосов. Вот как я сделал пример задачи:
Пусть точка A находится в точке A (5.7, 3.2), а точка B в точке B (8.9, 8.1). Пусть точка решения в точке (0, k) равна C. Отразите A по оси y, чтобы получить A 'в точке (-5.7, 3.2). Расстояние от A 'до C равно расстоянию от A до C. Следовательно, проблема может быть сведена к точке C, так что A'C + CB минимизируется. Очевидно, это будет точка C, лежащая на прямой A'B.
Я не знаю, будет ли это обобщать до 3 или более баллов.
источник
D
? Евклидовой?sqrt(diffX^2 + diffY^2)
? Тогда евклидов. Я знаю, что это не совсем подходит для сценария, но предположим, что клиент как-то едет по прямой из своего дома.Ответы:
C
315302 байтаЭто далеко не красиво, и это не короткий. Я рассчитывал, так как я не собираюсь выигрывать соревнования по длине, я могу попытаться выиграть (теоретический) конкурс на точность! Код, вероятно, на порядок или два быстрее, чем брутфорс-решение, и опирается на немного математического дурачества.
Мы определяем функцию,
g(N,S)
которая принимает в качестве входных данных количество домовN
и массив домовS[][2]
.Вот она, с тестовым примером:
Какие выводы:
Предупреждение: знание полного исчисления может потребоваться для полного понимания!
Итак, давайте поговорим о математике.
Мы знаем расстояние от желаемой точки
(0, k)
и домаi
:И, таким образом, общее расстояние
D
отn
домов можно определить следующим образом:Мы хотели бы минимизировать эту функцию, взяв производную по отношению к ней
k
и установив ее равной0
. Давай попробуем. Мы знаем, что производныеD
могут быть описаны следующим образом:Но первая частная производная каждого
Di
довольно плохая ...К сожалению, даже если
n == 2
установка этих производных0
и их решениеk
становятся катастрофическими очень быстро. Нам нужен более надежный метод, даже если он требует некоторого приближения.Введите полиномы Тейлора.
Если мы знаем значение,
D(k0)
а также всеD
производные вk0
, мы можем переписатьD
как ряд Тейлора:Теперь, в этой формуле есть куча вещей, и ее производные могут быть довольно громоздкими, но теперь у нас есть полиномиальное приближение
D
!Проделав небольшое исчисление, мы найдем следующие две производные
D
, оценивая производныеDi
, как и раньше:Усечением и вычислением производных мы можем теперь приблизиться
D
как полином 3-й степени вида:Где
A, B, C, D
просто реальные цифры.Теперь это мы можем минимизировать. Когда мы возьмем производную и установим ее равной 0, мы получим уравнение вида:
Делая исчисление и подстановки, мы придумываем эти формулы для
a, b, and c
:Теперь наша задача дает нам 2 решения, задаваемые квадратичной формулой:
Вся формула
k
будет огромным бременем для записи, поэтому мы делаем это по частям здесь и в коде.Поскольку мы знаем, что более высокое значение
k
всегда будет приводить к минимальному расстоянию от нашего приблизительного значенияD
(у меня есть поистине изумительное доказательство этого, которого недостаточно для описания этой статьи ...), нам даже не нужно рассматривать меньшее из решения.Последняя проблема остается. В целях точности необходимо, чтобы мы начали с a
k0
, которое, по крайней мере, находится в той точке, где мы ожидаем, что ответ будет. Для этого мой код выбирает среднее геометрическое значений y каждого дома.В отказоустойчивый, мы повторяем всю проблему еще раз в 9 раз, заменяя
k0
сk
на каждой итерации, чтобы обеспечить точность.Я не подсчитал, сколько итераций и сколько производных действительно необходимо, но я решил ошибиться из-за осторожности, пока не смог подтвердить точность.
Если ты справился со мной, спасибо тебе большое! Я надеюсь, что вы поняли, и если вы заметите какие-либо ошибки (которых, вероятно, много, я очень устал), пожалуйста, дайте мне знать!
источник
TI-BASIC, 20
Вводит данные на домашний экран вашего калькулятора серии TI-83 или 84 в этой форме (вы можете ввести
2:
первое, что будет игнорироваться):Если дома всегда находятся на расстоянии менее миллиарда километров от источника, E99 можно заменить на E9 для размера 18 байт.
Если бы существовал язык игры в гольф, основанный на Mathematica, он мог бы выиграть этот вызов в 10-14 байтах.
источник
Mathematica, 42 байта
Это анонимная функция, принимающая список пар в качестве координат дома и возвращающая желаемую координату y.
Это довольно простая реализация. Мы отображаем
Norm[#-{0,k}]&
на каждую координату дома (которая вычисляет расстояние до неопределенной точки{0,k}
на оси Y) и суммируем их все сTr[...]
(для трассы, которая эквивалентнаTotal
для 1-го списка). Тогда мы используем удобный,Minimize
чтобы найти минимум этой суммы вk
. Это дает результат формы{distance, {k -> position}
, поэтому нам нужноk/.Last@
извлечьposition
искомое.источник
Pyth, 33 байта
Это решение грубой силы: оно упорядочивает все возможные местоположения ресторана с разрешением 0,001 км по их общему расстоянию от домов, а затем выбирает место с наименьшим общим расстоянием. Это берет местоположения дома как список 2 списков входа плаваний на STDIN.
Демонстрация.
Разрешение может быть установлено в любом месте от 1e-2 км до 1e-10 км при той же длине кода, но с экспоненциальным замедлением во время выполнения.
Я чувствую, что это может быть в гольфе еще немного, я посмотрю на это позже.
источник
^T3
особенно впечатляет.Python 2, 312
источник
R
145143126Я подозреваю, что на этом осталось много комнаты для игры в гольф. Практически метод грубой силы. Я хотел бы найти более хороший способ сделать это. Я, хотя геометрические средства могут помочь, но увы нет.
Тестовый забег
Интересно, что если есть только два дома для рассмотрения, следующий вернет приемлемый результат. Однако это падает на три. Я не могу продолжать дальше, но я подумал, что некоторые мозги здесь могут что-то с этим сделать.
источник
МАТЛАБ, 42
Если это нормально, чтобы принять ввод как
тогда это утверждение
возвращается
5.113014445748538
.Бесстыдно воровав метод Томаса Ква, вы можете снизить его до 30 как минимум:
источник
n
номером дома? Так как это то, о чем вопрос.I
.