Ваша задача, учитывая x
, вывод 2*x
. Легко, правда !? Но есть одна загвоздка: x
будет задана как (возможно, бесконечная) непрерывная дробь , а результат должен быть продолженной дробью. Входные данные гарантированно являются действительным алгебраическим числом, степень которого не больше 2.
Входные данные : продолжение доли x
. Это разделено на 3 части: целочисленная часть, префикс и повторяющаяся часть. Целая часть состоит из одного целого числа. Префикс и повторяющаяся часть являются (возможно, пустыми) массивами натуральных чисел, которые описывают префикс и повторяющуюся часть непрерывной дроби. Например, ввод (3, [1], [2, 4])
представляет собой непрерывную дробь [3; 1, 2, 4, 2, 4, ...]
.
Если повторяющаяся часть пуста, это означает рациональное число. Например, (3, [1, 2], [])
представляет [3; 1, 2] = 11/3
. Вы должны принять обе формы рационального числа (то есть (3, [1, 1, 1], [])
, которое [3; 1, 1, 1] = 11/3
также должно быть допустимым вводом).
Вывод : Выведите продолженную дробь, вдвое превышающую ввод, в том же формате, что и ввод. Если вывод является рациональным, вы можете вывести любую форму продолжения дроби. Пока ответ эквивалентен правильному ответу, это нормально; нет необходимости в «сжатии», поэтому бесконечная часть может быть немного «развернута» (например, [1; 4, 2, 3, 2, 3...]
может быть написана (1, [4], [2, 3])
или (1, [4, 2, 3], [2, 3])
). Все ответы должны быть точными.
Контрольные примеры : точный столбец формы приведен для удобства.
Input Exact Form Output
(0, [] []) 0 (0, [] []) or (-1, [1], [])
(-5, [1, 1], []) -4.5 (-9, [], []) or (-10, [1], [])
(3, [1, 2], []) 11/3 (7, [3], []) or (7, [2, 1], [])
(1, [], [2]) sqrt(2) (2, [], [1, 4])
(-1, [2], [2, 1]) -1/sqrt(3) (-2, [1, 5], [2, 6])
И , наконец, немного больше , тест , чтобы обеспечить точность: (0, [1], [6, 1, 3, 1, 42, 1, 3, 1, 6, 2]) --> (1, [], [1, 2, 1, 8, 1, 20, 1, 8, 1, 2, 1, 2])
.
Самый короткий код выигрывает!
Подсказка : Вы можете выполнять арифметику довольно простым способом для непрерывных дробей, как описано здесь . Удвоение непрерывной дроби является лишь частным случаем этого алгоритма (хотя сложная часть заключается в том, чтобы найти повторение продолжения дробной части).
источник
Sqrt[2]
.[3; 1, 1, 1]
будет(3, [1, 1, 1], [])
в формате ввода, который мы используем - поэтому вопрос, вероятно, должен упомянуть его в этом формате (в третьем абзаце), просто для обеспечения ясности.(-2, [1, 5, 2], [6, 2])
ли приемлемый вывод для ввода(-1, [2], [2, 1])
? Как насчет(-2, [1, 5, 2, 6, 2, 6], [2, 6])
?Ответы:
Wolfram Language (Mathematica) , 44 байта
Попробуйте онлайн!
Mathematica имеет встроенный! Ура! Встроенная Mathematica очень длинная. Оо.
Непрерывные дроби Mathematica выглядят как
{integer, ...prefix, {...repeating}}
-1 благодаря JungHwan Мин
источник
*
потому что разделитель Mathematica по умолчанию, если его нет, естьTimes
.JavaScript (ES6), 267 байт
Принимает 3 аргумента (n = целая часть, f = префикс, r = повторяющаяся часть). Выводит три части в массив. Попробуйте онлайн!
объяснение
Это довольно прямая реализация алгоритма для вычисления арифметики непрерывной дроби, связанной с задачей здесь . Повторяющиеся термины обрабатываются путем хранения промежуточных матриц в таблице поиска, ожидания дубликата и вывода терминов до следующего появления этого дубликата. Это не элегантно и почти удваивает количество байтов, необходимых для обработки непрерывных дробей, но я не мог придумать лучшей альтернативы.
Первый член вычисляется отдельно, чтобы гарантировать, что отрицательные непрерывные дроби сохраняют положительные значения для всех терминов, кроме первого.
Во избежание ложных срабатываний при ожидании повторного цикла, таблицы поиска сохраняет данные следующим образом :
<index of input repeating part><delimiter><matrix values>
.Обратите внимание, что версия
eval
для гольфа использует для сохранения 1 байта.источник