Все мы знаем, что всякий раз, когда рациональное число записывается в десятичном виде, результат либо завершается, либо (в конечном итоге) периодический. Например, когда 41/42 записано в десятичном виде, результат
0.9 761904 761904 761904 761904 761904 761904 761904 ...
с начальной последовательностью цифр, 0.9
за которой следует последовательность, 761904
повторяемая снова и снова. (Удобное обозначение для этого - то, 0.9(761904)
где круглые скобки окружают блок повторяющихся цифр.)
Ваша задача в этой задаче - взять положительное рациональное число, удалить первую цифру, являющуюся частью повторяющейся последовательности, и вернуть полученное рациональное число. Например, если мы сделаем это до 41/42, мы получим
0.9 61904 761904 761904 761904 761904 761904 761904 ...
или 0.9(619047)
для краткости 101/105.
Если рациональное число имеет конечное десятичное разложение, как у 1/4 = 0.25
, ничего не должно происходить. Вы можете думать о 1/4 либо как, 0.250000000...
либо как, 0.249999999...
но в любом случае удаление первой цифры повторяющейся части оставляет число без изменений.
Детали
- Входные данные представляют собой положительное рациональное число, либо в виде пары натуральных чисел, представляющих числитель и знаменатель, либо (если ваш язык выбора позволяет это сделать, и вы хотите) в качестве объекта рационального числа.
- Выход также является рациональным числом, также в любой форме. Если результатом является целое число, вы можете вернуть целое число вместо рационального числа.
- Если в качестве входных данных взять пару чисел, вы можете предположить, что они относительно простые; если вы выводите пару чисел в качестве выходных данных, вы должны сделать их относительно простыми.
- Будьте осторожны, чтобы найти первую цифру, которая начинает повторяющийся блок. Например, можно написать 41/42 как,
0.97(619047)
но это не делает 2041/2100 (с десятичным расширением0.97(190476)
) действительным ответом. - Можно предположить , что на входе вы получаете, то первый периодический цифра после десятичной точки, что делает
120/11
=10.909090909...
неверный ввод: (его первый периодический разряд можно считать0
в10
). Вы можете делать все, что вам нравится на таком входе. - Это код-гольф : выигрывает самое короткое решение.
Контрольные примеры
41/42 => 101/105
101/105 => 193/210
193/210 => 104/105
104/105 => 19/21
1/3 => 1/3
1/4 => 1/4
2017/1 => 2017/1
1/7 => 3/7
1/26 => 11/130
1234/9999 => 2341/9999
источник
2017
вместо2017/1
?(2017,1)
.)2/4
случиться на входе?120/11
правильным ответом111/11
или210/11
?111/11
за исключением того, что возвращается наиболее высоко голосованный ответ210/11
, поэтому я позволю вам выбрать, чтобы избежать аннулирования существующих ответов.Ответы:
Wolfram Language (Mathematica) , 59 байт
Попробуйте онлайн!
объяснение
Найти десятичные цифры ввода.
Если есть повторяющиеся цифры,
RotateLeft
их. (List@@#
препятствует тому, чтобы код попытался повернуть последнюю десятичную цифру, если рациональное число заканчивается).Преобразовать в рациональное.
источник
Желе ,
36323130 байт-1 байт благодаря Эрику Аутгольферу !
Попробуйте онлайн!
Должно быть правильно. Неточность с плавающей точкой добавить 3 байта для
+.Ḟ
.Полагается на то, что ввод является неприводимым.
объяснение
Это зависит от:
n/d
в самом простом виде. Затем ссылка,ọ2,5Ṁ
к которойd
будет применяться , даст число непериодических цифр после точки радиуса.источник
Python 2 ,
237235214 байт-21 байт благодаря мистеру Xcoder
Попробуйте онлайн!
Ввод выполняется в виде кортежа
(numerator, denominator)
; вывод являетсяfractions.Fraction
объектом.При этом используется метод в стиле длинного деления для получения начальных и повторяющихся цифр ответа, затем перемещение первой повторяющейся цифры в конец и использование манипуляции со строками и
fraction.Fraction
для преобразования ее обратно в отношение.Безголовая версия:
источник
Python 3 ,
177173169 байтПопробуйте онлайн!
источник
Wolfram Language (Mathematica) ,
7067 байтБлагодаря этому совету (теперь удален) за -3 байта!
Попробуйте онлайн!
Порт моего желе ответа . Дольше, чем существующий ответ Mathematica на 8 байт ...
Функция принимает 2 входа
[denominator, numerator]
, так чтоGCD[denominator, numerator] == 1
.источник
Perl 6 , 102 байта
Попытайся
Принимает Rational number и возвращает Rational или Int .
Expanded:
Примечание будет обрабатывать знаменатели вплоть
uint64.Range.max
до обработки больших знаменателей использоватьFatRat(9 x$1.chars)
Попробуйте .источник