Вступление
Сегодня я пошел на рыбалку наедине со своим каноэ, к сожалению, я уснул, и ручей унес меня прочь, я потерял весла, теперь ночь, и я потерялся в океане! Я не вижу побережья, поэтому я должен быть далеко!
У меня есть мобильный телефон, но он неисправен, потому что он намок от соленой воды, я не могу ничего говорить или слышать, потому что микрофон и динамик телефона сломаны, но я могу отправить SMS своему другу, который находится на берегу моря!
У моего друга очень мощный факел, и он поднял его на бамбуковые трости, чтобы показать мне правильное направление, но я не могу грести, потому что у меня нет весла, поэтому я должен сказать ему, как далеко я нахожусь, чтобы он мог кого-то отправить Поймай меня!
Мой друг сказал мне, что он держит факел на уровне 11,50 метров над уровнем моря, и я вижу свет прямо за горизонтом. Теперь я помню только из школы, что радиус Земли должен быть 6371 км на уровне моря, и я сижу в своем каноэ, поэтому вы можете предположить, что мои глаза тоже на уровне моря.
задача
Поскольку токи меняют момент за мгновением, мой друг время от времени поднимает факел (теперь он на 12.30 метра), пожалуйста, напишите полную программу или функцию, которая поможет мне рассчитать расстояние от позиции моего друга!
Вот диаграмма (не в масштабе):
Оранжевая точка с надписью M
- это я, красная точка с надписью T
- это факел. Зеленая линия линейное расстояние между M
иT
вход
Возьмите из стандартного ввода высоту факела h
в метрах на уровне моря, которую я вижу прямо на вершине горизонта, в виде числа с плавающей запятой с точностью до двух десятичных знаков (с точностью до 1 сантиметра или 0,01 метра) в диапазон от 0 до 100 включен.
Выход
Вы должны вернуть евклидову длину зеленой линии с точностью до 1 см. Например, если вы выводите в метрах, должно быть с двумя десятичными знаками (как минимум). Выход может быть либо в метрах, либо в километрах, но с учетом точности.
Тестовые случаи:
Все значения в метрах.
11.5 > 12105.08
13.8 > 13260.45
правила
Самый короткий код выигрывает.
Ответы:
05AB1E ,
131210 байтСохранено 2 байта благодаря Emigna.
Поскольку не существует тригонометрических функций, которые можно вызывать с использованием предположения OP о том, что Земля локально является плоскостью, становится возможным решение 05AB1E.
Попробуйте онлайн!
источник
12742000
можно записать как•1#oC•
•1#oC•+*t
в 2sable•
..., основание 214? 05AB1E иногда испытывает недостаток документации по таким специальным функциям. Хороший ответ 2sable также. Я узнал об этом несколько дней назад, но я не думал об использовании этого для этого вопроса.Python,
3426 байт:( -8 байт благодаря Osable! )
Анонимная лямбда-функция. Принимает ввод в километрах и выводит в километрах. Вызывать как
print(<Function Name>(<Input>))
.источник
lambda i:(i*(i+12742))**.5
будет еще короче.i
12742, выражение может быть сокращено так:(i*12742)**.5
PHP, 34 байта
сломать
до сих пор это идентично старому ответу Mathematica
теперь все, что осталось сделать, это добавить ввод
=$argv[1]
и вывод<?=
- готовоисточник
dc,
1611 байтов:Запрашивает ввод через командную строку в километрах, а затем выводит расстояние в километрах.
объяснение
Это использует следующие преимущества:
источник
JQ, 18 символов
Еще одна копия той же формулы.
Образец прогона:
Он-лайн тест
источник
Haskell, 22 байта
Использование:
Pointfree: (23 байта)
источник
R, 29 байт
Принимает ввод от стандартного ввода
источник
(h=scan())*(1+12742e3/h)^.5
.Mathematica, 16 байт
Любая из этих работ работает как для ввода и вывода в километрах:
Это простое приложение Пифагора к проблеме:
источник
Желе, 9 байт в кодовой странице желе
Я решил попробовать написать программу на языке игры в гольф. Я на самом деле нашел более эффективный алгоритм, чем тот, который используют другие люди (по крайней мере, на коротких расстояниях, подобных тому, который указан в вопросе), но он требует буквальных чисел с плавающей точкой, которые, по-видимому, Джелли не может сжать, поэтому Пифагор это.
Объяснение:
Необходимость в
µ
сепараторе раздражает меня, но я думаю, что это неизбежно; Jelly уже сохранил байт над 05AB1E, поскольку он может угадать, какие аргументы нужны многим командам, но в этом случае он не может правильно угадать до конца, поэтому мне нужно было дать ему подсказку.Желе, 7 байт в кодовой странице желе
Как я объяснил в моем другом ответе , приближение рядов к приближению Пифагора фактически дает лучшие результаты по длинам, включенным в вопрос (по крайней мере, они ближе к выходным данным примера), а также имеет более короткую формулу. Когда я писал его, я понял, что вместо того, чтобы заранее вычислять квадратный корень из 12742000, я мог бы сначала умножить число на 12742000, а затем и квадратный корень одновременно. Это в основном эквивалентно другой формуле без добавления, и, как таковое, ее можно получить из предыдущей программы, удалив дополнение из нее. Это экономит два байта, так как теперь он анализирует однозначно, и поэтому нам больше не нужен
µ
.источник
Руби, 23
23 байта, в км
25 байт, м
источник
Tcl, 49 байт:
Ну, я новичок в Tcl, так что любые советы по игре в гольф это высоко ценится. Как и другие мои ответы, запрашивает ввод командной строки в километрах и вывод в километрах. По сути Tcl адаптация моего существующего
dc
иpython
ответы.источник
x86_64 + машинный код SSE, 16 байт
Байты программы находятся слева (в шестнадцатеричном формате), справа есть разборка, чтобы ее было легче читать. Это функция, которая следует обычному соглашению x86_64 для функций, принимающих и возвращающих число с плавающей запятой одинарной точности (она принимает аргумент в% xmm0 и возвращает свой ответ в том же регистре, и использует% xmm1 и% eax в качестве временных значений; являются теми же соглашениями о вызовах, которые будут использовать программы на C, и, как таковые, вы можете вызывать функцию непосредственно из программы на C, как я ее тестировал).
Даже с разборкой, однако, это все еще нуждается в объяснении. Во-первых, стоит обсудить формулу. Большинство людей игнорируют кривизну земли и используют формулу Пифагора для измерения расстояния. Я тоже это делаю, но я использую приближение расширения серии; Я использую только термин, относящийся к первой степени входного сигнала, и игнорирую третью, пятую, седьмую и т. Д., Которые все имеют очень небольшое влияние на этом коротком расстоянии. (Кроме того, приближение Пифагора дает низкое значение, в то время как более поздние члены в разложении рядов служат для уменьшения значения; поэтому, игнорируя незначительный фактор, который послужит толчком к приближению в неправильном направлении, я на самом деле получаю более точный результат с использованием менее точной формулы.) Формула оказывается √12742000 × √h;
0x455f1980
,Следующее, что может смутить людей, - это то, почему я использую векторные инструкции для квадратного корня и умножения;
%xmm0
и%xmm1
может содержать четыре числа с плавающей запятой одинарной точности каждое, и я оперирую всеми четырьмя. Рассуждения здесь очень просты: их кодировка на один байт короче, чем у соответствующих скалярных инструкций. Таким образом, я могу заставить FPU выполнять кучу дополнительных операций с квадратным корнем и умножением нулей, чтобы сэкономить себе два байта, в методе, который очень напоминает типичный алгоритм языка игры в гольф. (Я называл x86 ассемблер языком игры ассемблеров в чате некоторое время назад, и я до сих пор не передумал.)Отсюда алгоритм очень прост: загрузка
%xmm1
с помощью √12742000 через%eax
(что короче в байтах, чем будет загрузка его из памяти), квадратный корень аргумента (и три нуля), умножение соответствующих элементов на%xmm1
и%xmm0
(нас интересует только о первом элементе), затем вернитесь.источник
Минколанг v0.15, 22 байта
Попробуйте онлайн!
источник
JavaScript (ES6),
3125 байтОтображает значение в метрах
источник