Вдохновленный этим видео от tecmath .
Аппроксимацию квадратного корня любого числа x
можно найти, взяв целочисленный квадратный корень s
(то есть наибольшее целое число такое, что s * s ≤ x
), а затем вычислив s + (x - s^2) / (2 * s)
. Назовем это приближение S(x)
. (Примечание: это эквивалентно применению одного шага метода Ньютона-Рафсона).
Хотя это имеет причуду, где S (n ^ 2 - 1) всегда будет √ (n ^ 2), но в целом это будет очень точно. В некоторых более крупных случаях это может иметь точность> 99,99%.
Вход и выход
Вы возьмете одно число в любом удобном формате.
Примеры
Формат: ввод -> вывод
2 -> 1.50
5 -> 2.25
15 -> 4.00
19 -> 4.37 // actually 4.37 + 1/200
27 -> 5.20
39 -> 6.25
47 -> 6.91 // actually 6.91 + 1/300
57 -> 7.57 // actually 7.57 + 1/700
2612 -> 51.10 // actually 51.10 + 2/255
643545345 -> 25368.19 // actually 25,368.19 + 250,000,000/45,113,102,859
35235234236 -> 187710.50 // actually 187,710.50 + 500,000,000/77,374,278,481
Характеристики
Ваш вывод должен быть округлен по крайней мере до ближайшей сотой (т.е. если ответ 47.2851, вы можете вывести 47.29)
Ваши выходные данные не обязательно должны иметь следующие нули и десятичную точку, если ответом является целое число (т. Е. 125,00 можно вывести как 125 и 125,0 тоже)
Вам не нужно поддерживать какие-либо числа ниже 1.
Вам не нужно поддерживать нецелые входные данные. (т.е. 1,52 и т. д.)
правила
Стандартные лазейки запрещены.
Это код-гольф , поэтому выигрывает самый короткий ответ в байтах.
источник
s + (x - s^2) / (2 * s) == (x + s^2) / (2 * s)
Ответы:
Желе ,
87 байт-1 байт благодаря упрощенной математической формуле Оливье Грегуара - см. Ответ на Java .
Попробуйте онлайн!
Как?
источник
÷ƽ+ƽH
впервые пытаюсь использовать желе, поэтому я могу ошибаться. Хотел бы я знать, как хранитьƽ
, но не повторять это. Это может сохранить еще один байт.ƽɓ÷⁹+H
не будет пересчитывать целочисленный корень, но он также 7.ɓ
запускает новую двоичную цепочку с замененными аргументами и затем⁹
ссылается на правильный аргумент этой цепочки (то есть на результатƽ
).ƽɓ÷+⁹H
будет работать здесь тоже.Haskell , 34 байта
Попробуйте онлайн!
Объяснение в императивном псевдокоде:
источник
Java (OpenJDK 8) , 32 байта
Попробуйте онлайн!
Пояснения
Код эквивалентен этому:
Математика позади:
источник
Python 2 ,
47... 36 байт-3 байта благодаря @JungHwanMin
-1 байт благодаря @HyperNeutrino
-2 байта благодаря @JonathanFrech
-3 байта благодаря @ OlivierGrégoire
Попробуйте онлайн!
источник
s+(x-s*s)/s/2
до(x+s*s)/s/2
+.0
и заменить/s/2
на/2./s
, сохраняя два байта?MATL ,
129 байтПопробуйте онлайн!
источник
R,
43 байта29 байтовСпасибо @Giuseppe за новое уравнение и помощь в игре в 12 байт с помощью решения с целочисленным делением. Поменяв вызов функции на сканирование, я набрал еще пару байтов.
Попробуйте онлайн!
источник
f <-
для назначения функции. Но все же, хорошее решение, обязательно прочитайте Советы по игре в гольф в R, когда у вас есть шанс!APL (Dyalog) ,
2016 байтовПопробуйте онлайн!
источник
JavaScript (ES7), 22 байта
Нам действительно не нужна промежуточная переменная, поэтому ее можно переписать так:
Контрольные примеры
Показать фрагмент кода
источник
C, 34 байта
Благодаря @ Оливье Грегуар!
Работает только с
float
входами.Попробуйте онлайн!
C
413937 байтПопробуйте онлайн!
C,
49474543 байтаПопробуйте онлайн!
Спасибо @JungHwan Min за сохранение двух байтов!
источник
Haskell , 40 байт
Еще один байт пыли благодаря H.PWiz.
Попробуйте онлайн!
источник
AWK ,
47 4438 байтПопробуйте онлайн!
ПРИМЕЧАНИЕ: TIO как есть 2 дополнительных байта для
\n
чтобы сделать вывод более красивым. :)Такое чувство, что немного обманывает, чтобы использовать sqrt для нахождения квадратного корня, так что вот версия с несколькими байтами, которая этого не делает.
Попробуйте онлайн!
источник
sqrt($1)
тебя можно использовать$1^.5
\n
получать выходные данные, printf в awk не нуждается в круглых скобках и формула может быть сокращена доs/2+$1/s/2
, что приводит к{s=int($1^.5);printf"%.2f",s/2+$1/s/2}
. Извините, если этот комментарий кажется грубым.рэкет , 92 байта
Спасибо @JungHwan Min за подсказку в разделе комментариев
Попробуйте онлайн!
Ungolfed
источник
PowerShell , 54 байта
Попробуйте онлайн! или проверить несколько тестов
Принимает ввод,
$x
а затем делает именно то, что запрашивается.|?
Часть находит максимальное целое , что, когда в квадрате, это-l
ESS чем-или-e
каче на вход$x
, то мы выполняем необходимые вычисления. Вывод неявный.источник
Шелуха , 9 байт
Попробуйте онлайн!
В этом ответе все еще есть что-то уродливое, но я не могу найти более короткое решение.
объяснение
Я реализую один шаг алгоритма Ньютона (который действительно эквивалентен предложенному в этом вопросе)
источник
÷
Пыть ,
1110 байтобъяснение
источник
Млечный Путь ,
1714 байт-3 байта с использованием формулы Оливье Грегуара
Попробуйте онлайн!
объяснение
источник
C # (.NET Core) , 39 байт
Попробуйте онлайн!
AC # версия Java-ответа Оливье Грегуара .
источник