Целью этого кода является создание программы или функции, которая вычисляет и выводит корень куба числа, которое задается в качестве входных данных.
Правила:
- Нет внешних ресурсов
- Нет использования встроенных функций корня куба.
- Не использовать методы / операторы, которые могут возвести число в степень (включая квадратный корень, 4-й корень и т. Д.).
- Ваша функция / программа должна быть в состоянии принимать числа с плавающей запятой и отрицательные числа в качестве входных данных.
- Если корень куба является числом с плавающей точкой, то округлите его до 4 чисел после десятичной точки.
- Это код гольфа, выигрывает самый короткий код в байтах.
Тестовые случаи:
27 --> 3
64 --> 4
1 --> 1
18.609625 --> 2.65
3652264 --> 154
0.001 --> 0.1
7 --> 1.9129
Вы можете использовать все тестовые примеры выше для проверки отрицательных чисел ( -27 --> -3
, -64 --> -4
...)
Ответы:
J: 16 символов
Свободный перевод ответа на Haskell:
Тестовые случаи:
Это работает так:
В словах:
Не один из лучших многословных переводов, так как есть диадическая вилка и
~
право в конце.источник
Haskell - 35
Пример работы:
Более того, если вы импортируете
Data.Complex
, он даже работает с комплексными числами, он возвращает один из корней числа (их 3)::+
Оператор должен читаться как «плюс I раз»источник
x=(2*x+n/x/x)/3
, вы можете объяснить, почему вы можете использоватьx=(x+n/x/x)/2
? Оно сходится медленнее, но я не могу объяснить, почему оно сходится ...x=cbrt(n)
, тоx=(x+n/x/x)/2
это правда. Так ли это верно для вашего выраженияSageMath, (69) 62 байта
Однако, никогда не верьте, что это даст вам результат, очень трудно случайным образом пройтись по всем числам:
если вы не настаивали на усечении:
SageMath, 12 байт, если
exp
разрешеноРаботает на все вещи: положительный, отрицательный, ноль, сложный, ...
источник
exp
это разрешено, мне меньше 12, и я совсем не тупой :)exp
это сокращение от «экспоненциальной функции», то есть «функции, значение которой является константой, возведенной в степень аргумента, особенно функции, где константа равна e.», И «нет использования методов / операторов, которые может поднять число до степени ",exp
не допускается.Python - 62 байта
Оценивает с полной точностью с плавающей запятой. Используемый метод является методом Галлея . Поскольку каждая итерация выдает в 3 раза больше правильных цифр, чем в предыдущей, 99 итераций немного излишни.
Ввод, вывод:
источник
0
-2
, извините за это.v**(1/.3)
это был бы верный победитель.Javascript (55)
function f(n){for(i=x=99;i--;)x=(2*x+n/x/x)/3;return x}
БОНУС, Общая формулировка для всех корней
function f(n,p){for(i=x=99;i--;)x=x-(x-n/Math.pow(x,p-1))/p;return x}
Для кубического корня просто используйте
f(n,3)
квадратный кореньf(n,2)
и т. Д. Пример:f(1024,10)
возвращает2
.Пояснение на
основе метода Ньютона:
Найти:
f(x) = x^3 - n = 0
Решение:n = x^3
Вывод:
f'(x) = 3*x^2
Итерация:
x(i+1) = x(i) - f(x(i))/f'(x(i)) = x(i) + (2/3)*x + (1/3)*n/x^2
тесты
источник
function f(n){for(i=x=99;i--;)x-=(x-n/x/x)/3;return x}
f=(n)=>eval('for(i=x=99;i--;)x=(2*x+n/x/x)/3')
PHP - 81 байт
Итеративное решение:
источник
0.0001
можно заменить1e-4
и0.00001
на1e.5
.0/0
даетNAN
в PHP 7). не требуется$i=0;
(-5 байт. Если бы это было не так,for
сэкономил бы один байт.) Пробел послеprint
не требуется (-1 байт).-R
может сохранить 3 байта с$argn
.while(1e-4+$i*$i*$i<$y=abs($x=$argn))
(-2 байта).Perl, 92 байта
a
возвращает строку с номером без ненужной дробной части или незначительных нулей в правом конце.Результат:
Создан
Расчет основан на методе Ньютона :
источник
APL - 31
Использует тот факт, что
cbrt(x)=e^(ln(x)/3)
, но вместо наивного⋆
возведения в степень, он вычисляет,e^x
используя ряды Тейлора / Маклорина.Образцы прогонов:
Видя, что есть ответ J в 16 символов, я, должно быть, ужасно в APL ...
источник
Ява,
207182181Иногда, когда я играю в гольф, у меня много пива, и я играю очень плохо
Итеративный метод аппроксимации Ньютона, запускает 99 итераций.
Вот не-Голфед:
источник
args
переменную в нечто вродеz
, уменьшив 6 символов. Вы можете удалить пробел и фигурные скобки в теле цикла for, уменьшив 3 символа. Вы можете заменить10000.0
на1e4
, уменьшая 6 символов. Класс не должен быть общедоступным, поэтому вы можете уменьшить еще на 7 символов. Таким образом, он будет уменьшен до 185 символов.TI-Basic,
2624 байтаисточник
^
оператор, не так ли? Это запрещено правиламиe^
ли один оператор на серии TI-83? Я не помню В любом случае, это нарушает дух правил.exp(ln(x)/3)
илиe^(ln(x/3))
если вы позволили любой из этих двух. Но как-то я понимаю,exp(ln(x)/a)
что это слишком много для того,x^(1/a)
чтобы быть разрешенным правилами: - /57 байт
f=(x)=>eval('for(w=0;w**3<1e12*x;w++);x<0?-f(-x):w/1e4')
источник
Javascript: 73/72 символа
Этот алгоритм неэффективен и использует тот факт, что этот вопрос ограничен 4 цифрами после десятичной точки. Это модифицированная версия алгоритма, который я предложил в песочнице для доработки вопроса. Он отсчитывает от нуля до бесконечности
h*h*h<a
, просто с помощью трюка умножения и деления для обработки 4 десятичных цифр.Редактирование, 4 года спустя: по предложению Луиса Филипе Де Иисуса Муньоса, использование
**
кода короче, но эта функция была недоступна еще в 2014 году, когда я писал этот ответ. В любом случае, используя его, мы сбриваем лишнего персонажа:источник
h*h*h
вы можете сделатьh**3
и сохранить 1 байт**
Оператор был предложен в 2015 году и был принят как часть ECMAScript 7 в 2016 году. Итак, в то время, когда я писал это,**
языка не было.Javascript - 157 символов
Эта функция:
Ungolfed объяснил версию:
источник
PHP, 61
На основе метода Ньютона. Слегка измененная версия ответа Михаила :
Он работает с отрицательными числами, может обрабатывать числа с плавающей запятой и округляет результат до 4 чисел после десятичной точки, если результатом является число с плавающей запятой.
Рабочая демонстрация
источник
for($x=1;++$i<100;)...
. Но использование предопределенных переменных в качестве входных данных обычно не одобряется . Лучше использовать$argv[1]
или$argn
.Befunge 98 - работа в процессе
Этот язык не поддерживает числа с плавающей запятой; это пытается подражать им. В настоящее время он работает для положительных чисел, которые не начинаются с
0
десятичной запятой (в основном). Тем не менее, он выводит только до 2 десятичных знаков.Он работает путем ввода части перед десятичной запятой, умножения ее на
100000
, затем ввода части после запятой и сложения двух чисел. Вторая строка делает счетчик, пока куб не станет больше введенного числа. Затем третья строка извлекает десятичное число из целого числа.Если кто-то может сказать мне, почему третья строка делится только
100
для получения правильных значений, пожалуйста, сообщите мне.ИО:
источник
Smalltalk, 37
кредит идет на mniip для алгоритма; Версия Smalltalk его кода:
ввод в п; вывод в х:
или, как блок
источник
Язык GameMaker, 51 байт
источник
Haskell: 99C
Не могу победить @mniip в ум. Я просто пошел с бинарным поиском.
Ungolfed:
источник
d
(как(l#h)x
), чтобы сохранить байт для каждого вызова.c
тогда становитсяid>>=(0#)
.c < x
.1>0
вместоTrue
.J 28
Используя метод Ньютонов, находим корень
x^3 - X
шага обновленияx - (x^3 - C)/(3*x^2)
, где х - текущее предположение, а С - вход. Математика на этом дает нелепо простое выражение(2*x+C/x^2) /3
. Необходимо соблюдать осторожность для отрицательных чисел.Реализуется в J, справа налево:
|
Возьмите абс обоих аргументов, передайте их^:_
Сделать до сближения(%*~@])
являетсяC / x^2
(*~ y
эквивалентноy * y
)+:@]
является2 x
3%~
разделить на три. Это дает положительный корень*@[ * positive_root
умножает положительный корень на знак C.Тестовый забег:
источник
AWK, 53 байта
Пример использования:
Спасибо @Mig за
JavaScript
решение, из которого это получено. Он работает на удивление быстро, учитывая, чтоfor
цикл требует, чтобы итерация перестала изменяться.источник
C 69 байтов
Просто еще одна реализация метода Ньютона. Попробуйте онлайн!
источник
Stax , 10 байтов CP437
Запускать и отлаживать онлайн!
объяснение
Использует распакованную версию для объяснения.
источник
Решение JAVA
public BigDecimal cubeRoot (BigDecimal number) {
источник
Python Solution
источник