Краткое объяснение проблемы
Напишите программу, чтобы найти минимальное расстояние между двумя точками, проходящими только на лучах, исходящих от источника, и окружностях с центром в начале координат.
Объяснение Помещения
Теперь давайте представим, что мы находимся в самолете, и на этом самолете нам разрешено путешествовать только особыми способами. Нам разрешено путешествовать на любом луче, исходящем из источника.
Мы также можем путешествовать по любому кругу с центром в кругу
Теперь наша цель - путешествовать из одной точки этого самолета в другую. Однако мы не можем просто путешествовать по простому евклидову пути, мы можем сделать это только в том случае, если точки попадают на луч, исходящий из центра.
Мы можем путешествовать на этом, потому что он падает на один из наших лучей.
Мы также можем путешествовать по кругу с центром в начале координат.
Примеры
Теперь вот проблема:
Мы должны добраться из одной точки в другую по кратчайшему пути; часто это сочетание путешествий по кругу и лучам.
Это, однако, может также путешествовать на двух лучах.
Иногда существуют два пути, которые проходят минимальное расстояние.
проблема
Ваша задача - написать программу, которая при наличии двух точек даст нам минимальное расстояние между ними, если мы будем следовать этим правилам. Входные данные могут быть заданы либо в прямоугольной, либо в полярной форме, а выходной должен быть одним числом, расстояние между ними.
Тестовые случаи
(с прямоугольным входом)
(1,1) (1,-1) -> ~ 2.22144
(0,0) (1, 1) -> ~ 1.41421
(1,0) (-0.4161 , 0.90929) -> ~ 2
(1,1) (1, 0) -> ~ 1.19961
(1,2) (3, 4) -> ~ 3.16609
источник
Ответы:
Haskell,
4948 байтовИспользование:
Спасибо @Zgarb за сохранение байта
источник
(a!q)c r
вместоd a q c r
.JavaScript (ES6), 65 байт
Принимает полярные координаты. Использует трюк @Angs для уменьшения угла между 0 и π. Для прямоугольных координат что-то вроде этого работает:
источник
MATL , 22 байта
Ввод представляет собой массив из двух комплексных чисел.
Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
Рубин, 64 байта
Во-первых, мое представление. Лямбда-функция с аргументами
distance 1, angle 1, distance 2, angle2
.Теперь вот два разных решения по 66 байтов (без присваивания
f=
), за которым следует моё фактическое представление снова с 64 байтами.Представление основано на решении 2, но использует идентификатор
(s-r).abs
=s+r-[s,r].min*2
для сокращения кода на 2 байта, следовательно,-2
внутри скобок.Другой примечательной особенностью является выражение
?i.to_c.arg*4
= 2 * PI без использованияinclude Math
. Если более низкая точность приемлема, это может быть заменено литералом.Решение 2 прокомментировано в тестовой программе
Выход
источник
Mathematica 66 байт
Это принимает прямоугольные координаты и может вывести точное символическое решение
Использование:
выходы:
N @% выходов:
{2.221441469, 1.414213562, 1.999934259, 1.199611726, 3.166096674}
источник
Python 2,
164,126,125,132 байта:В настоящее время я больше интересуюсь игрой в гольф. Принимает полярные координаты. Должен быть назван в формате
A(r1,θ1,r2,θ2)
. Выводит значение с плавающей запятой с точностью до12
значащих цифр.Попробуйте онлайн! (Ideone)
Простая, простая реализация, которая вычисляет и выводит в STDOUT минимальное значение из массива не более 3 значений, содержащего:
r1+r2
) или длины дуги, соединяющей две точки iffr1==r2
;abs(r1-r2)
) тогда и только тогдаθ1==θ2
(т.е. две точки лежат на одной прямой);''
), как, очевидно, в Python, строка больше любого целого числа;источник
math.pi
?Wolfram Language (Mathematica) , 47 байтов
Попробуйте онлайн!
(бьет текущий 66-байтовый ответ)
Примите входные данные как 2 комплексных числа.
Могут возникнуть некоторые проблемы, если ввод является символическим. (например,
Cos@2 + I Sin@2
)источник