Соревнование
Пластический номер представляет собой число , связанное золотое сечение, со многими интересными математическими свойствами. Таким образом, существует много подходов, которые можно использовать для расчета числа.
Чтобы точно указать номер для этой задачи, мы будем использовать следующее определение (хотя существует множество эквивалентных определений, и вы можете использовать любое определение, которое вы пожелаете, если речь идет об одном и том же номере):
Пластическое число является действительным числом ρ таким, что ρ ³ = ρ +1.
Ваша задача состоит в том, чтобы написать программу или функцию, которая принимает целое число x в качестве входных данных (с x > 1) и производит приближение к ρ в качестве выходного значения, так что чем больше значение x , тем ближе выходной сигнал к ρ ( с не более чем конечным числом исключений; для этой цели остается то же значение, которое считается «ближе», и для любого положительного числа δ в вашей программе есть некоторый вход x, который выдает выходной сигнал, который находится в пределах δ от ρ .
Разъяснения
- Если вы выводите с помощью метода, который по своей природе выводит строки (например, стандартный поток вывода), вы можете отформатировать вывод либо в десятичном виде (например
1.3247179572
), либо в виде отношения двух целых чисел с/
символом между ними. - Если вы выводите в качестве значения на вашем языке программирования (например, возвращая из функции), оно должно быть с фиксированной, плавающей или рациональной типами. (В частности, вы не можете использовать типы данных, которые хранят числа символически, если только они не используются для хранения отношения двух целых чисел. Поэтому, если вы используете Mathematica или подобный язык, вам нужно будет включить дополнительные код для генерации цифр на выходе.)
- Ваш ответ должен работать в гипотетическом варианте вашего языка, в котором целые числа могут быть произвольно большими, а память (включая стек) не ограничена. Вы не можете предполагать, что арифметика с плавающей запятой в вашем языке является произвольно точной, но вместо этого должна использовать ее фактическую точность (это означает, что вывод числа с плавающей запятой возможен только в языках, где точность чисел с плавающей запятой может быть контролируется во время выполнения).
- x может иметь любое значение, которое вы хотите (при увеличении оно дает более точные результаты). Я полагаю, что в большинстве представлений он контролирует количество выводимых цифр или количество итераций алгоритма, используемого вашей программой для схождения по пластиковому числу, но допустимы и другие значения.
Прецедент
Вот первые несколько цифр пластикового номера:
1.32471795724474602596090885
Больше цифр доступно на OEIS .
Состояние победы
Как обычно для code-golf , чем короче, тем лучше, измеряется в байтах. Однако не стесняйтесь публиковать ответы, даже если они не выигрывают, если они добавляют что-то (например, другой язык или другой алгоритм) к существующим ответам.
Ответы:
Python 2 , 49 байт
Попробуйте онлайн!
Идея состоит в том, чтобы выразить
ρ
сρ³=ρ+1
как дробьn/x
, знаменатель которойx
является параметром точности ввода. Мы берем(n/x)³=n/x+1
и очищаем знаменатели, чтобы получитьn³=x²(x+n)
.Поскольку LHS увеличивается
n
быстрее, чем RHS, мы можем приблизить точку равенстваn
как наименьшее сn³≥x²(x+n)
. Код считается доn
тех пор, пока это не так, начиная сx
которого меньше.Небольшое байтовое сохранение позволяет разделить обе стороны
x²
на записьn³/x²≥x+n
(отрицается вwhile
условии). Это разделение по полу в коде, но потеря дробной части незначительна.Альтернатива той же длины вместо
x
числителя ставит :Python 2 , 49 байт
Попробуйте онлайн!
источник
2**input()
а не простоinput()
; тогда каждое приближение будет настолько же точным, как и предыдущее.Mathematica, 20 байтов
Встроенная
Root
функция Mathematica дает решения полиномиального уравненияf[x] == 0
.объяснение
Образец ввода / вывода
источник
Root[x^3-x-1,1]~N~#&
отлично работает (несмотря на то, что не говорит, чтоx
это переменная) для того же количества байтов.Mathematica, 27 байт
-1 байт от Мартина
-2 байта от овса
вход
выход
источник
Solve[x^3==x+1>2,x]~N~#&
24 байт{{x -> 1.32...}}
все же. Возможно, вы захотите проверить с помощью ais, является ли это правильным форматом вывода.{1.32...}
самом деле, но этот формат, вероятно, менее спорный.sed ,
6760 (59 + 1) байтПопробуйте онлайн!
+1 за
-E
флаг (ERE вместо BRE). Вход и выход являются одинарными: вход 11111 для x = 5, например, Выход представляет собой дробную часть двух унарных чисел: вышеупомянутый вход 11111 дает выход 11111/1111 (5/4 в десятичном виде).Аппроксимирует пластическое число как дробь между последовательными элементами последовательности Падована .
источник
b
команды, но вы можете сделать его еще короче, используя пустую метку (:
иb
без аргументов). tio.run/#%23K05N@f@/…t
вместо этогоb
, так что это довольно хорошее сохранение. Спасибо :)Mathematica, 27 байт
Используется усеченное приближение вложенной кубической формы радикала ³√ (1 + ³√ (1 + ³√ (1 + ...))) . В то время как выходной сигнал всегда будет иметь X-1 знаки после запятой, результат на самом деле меньше , чем точный, поскольку выражение сходится медленнее , чем на одну цифры итерации ( х также используются как число вложенных радикалов , которые вычисляются). Например, х = 100 дает
где подчеркнутая часть верна.
источник
dc
, но потерпел неудачу, потому что оказалось, что у него нет операции корня куба, и возведение числа в степень также не работает :-( По крайней мере, вы всегда можете рассчитывать на У Mathematica есть соответствующие встроенные функции…CubeRoot
но никто не получил байтов за это.Октава , 50 байт
Попробуйте онлайн!
Определяет анонимную функцию с
n
желаемым количеством цифр вывода.Этот ответ злоупотребляет тем, что
digits
возвращает текущую настройку для количества цифр в арифметике с переменной точностью. Это означает, что мы можем просто использовать его в анонимной функции без ошибок о «слишком много выходных аргументов».Кроме этого, это действительно просто:
vpasolve
это сокращение от Variable-Precision Arithmetic Solve, с точностью, установленной последним вызовомdigits
. Такvpa
как это символический тип данных в Octave, который запрещен согласно спецификации, мы просто оборачиваем всю функцию,char(...)
чтобы получить вывод строки. Обратите внимание, что вsolve
иvpasolve
,f==0
подразумевается, поэтомуr^3==r+1
был заменен наr^3-r-1 (==0)
источник
MATL (
2728 байт)Мое первое решение (27 байт)
Попробуйте онлайн!
Это конечно не оптимально, я все еще привыкаю к MATL.
Объяснение:
Я создаю последовательность Падована до ввода + 3, а затем нахожу соотношение двух последних чисел.
Правильный вывод дроби
(35 байт)(28 байт, @Sanchises):Тем не менее, первое решение не удовлетворяет потребности в произвольной точности, являющейся пределом с плавающей запятой настроек по умолчанию MATL. Таким образом, вместо добавления нескольких байтов для повышения этой точности проще выбрать правильный дробный маршрут и записать дробь из двух последних целых чисел в (N-1) -й и N- й элементы усеченной последовательности Падована.
например, "114/86"
7BG: "т @) у @ 1 +) + Н] + tg3) V '/' YcyG2 +) VYcПредоставлено пользователем @Sanchises. :)
Попробуйте онлайн!
Не итерационная оценка:
Примечательно, что мой самый короткий код для «точной» версии (23 байта):
Попробуйте онлайн!
... но не дает произвольной точности. Интересно, может ли кто-нибудь изменить это, чтобы соответствовать правилам (использовать входные данные и т. Д.), И при этом добавить менее 5 байт? :П
источник
1+
можно сократить до.Q
Имея это в виду, вы можете заменить@)y@1+)+
просто@tQh)s
. Кроме того, вы можете использовать,J
чтобы указать конец массива; и наконец, MATL не различает обычные массивы и массивы символов, поэтому вы можете заменитьYc
наh
(вам не нужны дополнительные функцииYc
). Это дает только 28 байтов:7BG:"t@tQh)sh]tJ)V47hyJq)Vh&
(обратите внимание,&
чтобы предотвратить лишний вывод и замену'/'
на 47).7B
хотя, гораздо лучше, чем наивно толкатьlllv
J
по умолчанию содержит1j
, но буфер обменаL
также содержит много полезных функций индексации (обратите внимание, что1j
равноend
в MATL).М ,
1514 байтПопробуйте онлайн!
Алгоритм
Это использует рациональные и метод Ньютона. В частности, для ввода x применяются первые x итераций с начальным значением x .
Мы пытаемся найти конкретный корень многочлена p (t) = t³ - t - 1 . Метод Ньютона достигает этого, принимая начальное значение t 0 - достаточно близкое к ρ - и рекурсивно определяя последовательность по
t n + 1 = t n - p (t n ) / p '(t n ) .
Поскольку p '(t) = 3t² -1 , мы получаем
t n + 1 = t n - (t n ³ - t n - 1) / (3t n ² - 1) = (3t n ³ - t n - t n ³ + t n + 1) / (3t n ² - 1) = (2t n ³ + 1) / (3t n ² - 1) .
Обратите внимание, что начальное приближение x становится все хуже с увеличением x . Хотя выходные данные для x = 3 немного менее точны, чем выходные данные для x = 2 , поскольку метод Ньютона сходится квадратично к ρ , это не должно быть проблемой для больших значений x .
Как это работает
источник
µ¡
...Юлия 0,5 ,
4440 байтИспользует рациональные и метод Ньютона.
Попробуйте онлайн!
источник
05AB1E , 23 байта
Попробуйте онлайн!
Прямой порт /codegolf//a/126822/59376 от xnor.
источник
Древесный уголь , 28 байт
Попробуйте онлайн! Ссылка на подробный режим. Также я видимо напутал
Divide
иIntDivide
: |Использует тот же метод, что и ответы Python и JavaScript.
источник
NewStack , 14 байтов
Сломать:
Как это работает:
Формула (2x 3 +1) / (3x 2 -1) происходит от упрощения метода Ньютона для уравнения x 3 = x + 1. Вы можете найти это здесь . Повторяя этот процесс, бесконечное количество раз сходится к пластическому числу. Это скорость сходимости довольно быстро, около 2,6 десятичных знаков за итерацию.
Альтернатива последовательности Падована,
272517 байтСломать:
-2 байта, выбирая лучшую стратегию печати
-8 байт, выбирая лучший способ индексировать стек
Как это работает:
Поскольку последовательность Падована продолжается, отношение двух последних элементов сходится к пластиковому числу.
источник
Clojure, 46 байт
Использует повторную формулу кубического корня. Это немного интереснее, но дольше:
источник
Javascript, 36 байт
Работает так же, как верхний ответ Python. Нет
console.log
был включен, потому что если вы запуститеf(x)
в консоли, он будет зарегистрирован автоматически.источник
> <> , 38 + 3 = 41 байт
Предполагается, что входные данные будут присутствовать в стеке при запуске программы, поэтому +3 байта для
-v
флага.Попробуйте онлайн!
Эффективно выполняет двоичный поиск, чтобы сузить выходное значение. Увеличение
x
увеличивает количество итераций для выполнения.Редактировать: слегка изменен расчет для сохранения 1 байта, предыдущая версия:
источник
к, 27 байт
Попробуйте онлайн! Это предполагает бесконечные целые числа (что, увы, не соответствует действительности). Он использует последовательность Падована .
источник
TI-BASIC, 21 байт
Использует эту рекурсивную формулу .
Интересно, что жесткое кодирование числа и его округление дает одинаковое количество байтов:
TI-BASIC, 21 байт
Использует эту тригонометрическую формулу .
источник
Your answer must work in a hypothetical variant of your language in which integers can be arbitrarily large, and memory (including stack) is unlimited. You may not assume that floating-point arithmetic in your language is arbitrarily accurate, but must instead use its actual accuracy (meaning that outputting a floating-point number is only going to be possible in languages where the accuracy of floating-point numbers can be controlled at runtime).
C # , 317 байт
Возвращает результат в виде дроби.
объяснение
Он использует метод Ньютона с x итерациями для нахождения корня многочлена p ^ 3-p-1 = 0. Формула имеет вид x_n = 1- (f (x_ (n-1))) / (f '(x_ (n-1))), а x_0 является отправной точкой.
Производная полиномов равна 3p ^ 2-1, и скажем, x_ (n-1) = b / c. Затем, используя приведенную выше формулу, получаем, что x_n = (2 b ^ 3 + c ^ 3) / (3 b ^ 2 cc ^ 3). Скажем также, что мы начинаем с 1, это произойдет, когда x = 2, потому что x> 1, и является целым числом. Идентифицированный и прокомментированный код:
источник
PHP, 86 байт
PHP Sandbox Online
Создает спираль Падована и печатает соотношение двух последних чисел.
источник
Аксиома, 96 байт
полученные результаты
как вы можете видеть, h (2) должно быть 1,32, а не 1,33, поэтому есть некоторые ошибки в последних цифрах
Тогда будет этот один из 110 байтов
Используется формула для уравнения разрешения III степени типа x ^ 3-3 * p * x-2 * q = 0 в случае q ^ 2-p ^ 3> = 0, то есть m = sqrt (q ^ 2- p ^ 3) и x = (q + m) ^ (1/3) + (qm) ^ (1/3)
В нашем случае r ^ 3-r-1 = 0 это можно записать как r ^ 3-3 * (1/3) r-2 * (1/2) = 0, так что p = 1/3 q = 1/2 m = 1 / 4-1 / 27 = 23/108 x = (0,5 + m) ^ (1/3) + (0,5-m) ^ (1/3)
этот, который использует итерацию Ньютона с начальной точкой r = 1
это изменение в функции, значение цифры для получения одного объекта из n + 1 цифр после точки с плавающей запятой. В конце значение digits () возвращается к значению предварительной точности.
источник
Рубин , 35 байт
Попробуйте онлайн!
источник