В десятичном представлении каждого рационального числа у p/q
вас есть периодический хвост, непериодическая головка и раздел перед десятичной точкой в следующем формате:
(before decimal point).(non-periodic)(periodic)
Вот некоторые примеры:
1/70 = 0.0142857... = (0).(0)(142857)
10/7 = 1.428571... = (1).()(428571) ## no non-periodic part
1/13 = 0.076923... = (0).()(076923)
3/40 = 0.075 = (0).(075)() ## no periodic part
-2/15 = -0.13... = -(0).(1)(3) ## negative
75/38 = 1.9736842105263157894... = (1).(9)(736842105263157894)
## periodic part longer than float can handle
25/168 = 0.148809523... = (0).(148)(809523)
120/99 = 40/33 = 1.212121... = (1).()(21)
2/1 = 2 = (2).()() ## no periodic, no non-periodic
0/1 = 0 = (0).()()
0/2 = 0 = (0).()()
299/792 = 0.37752... = (0).(377)(52)
95/-14 = -6.7857142... = -(6).(7)(857142)
-95/-14 = 6.7857142... = (6).(7)(857142)
Задача состоит в том, чтобы поменять местами периодические и непериодические части, оставив before decimal point
одни, чтобы создать новое число. Например:
25/168 = 0.148809523... = (0).(148)(809523)
=> (0).(809523)(148) = 0.809523148148... = 870397/1080000
Если число не имеет периодической части, как, например, 0.25
превратить это число в новое периодическое число, и наоборот.
1/4 = 0.25 = (0).(25)() => (0).()(25) = 0.252525... = 25/99
4/9 = 0.444444... = (0).()(4) => (0).(4)() = 0.4 = 2/5
5/1 = 5 = (5).()() => (5).()() = 5 = 5/1
Соревнование
- Возьмите дробь в
x
качестве ввода, в виде строки, двух входных данных, рационального числа или любого другого метода, который подходит вашему языку. - Поменяйте местами периодические и непериодические части десятичного представления,
x
чтобы создать новое число, оставив часть перед одним десятичным знаком. Периодическая часть всегда начинается как можно скорее, поэтому непериодическая часть должна быть как можно короче. Примеры ниже. - Вернуть поменяемый номер как новую дробь. Ввод не обязательно уменьшается, хотя выход должен быть. Входной формат может отличаться от выходного формата.
- Числитель
p
изx
будет целым с абсолютным значением одного миллиона или меньше , и знаменателемq
вx
будет отличен от нуля целого числа с абсолютным значением одного миллиона или меньше. - Числитель
r
и знаменательs
результата не гарантированно будут меньше одного миллиона. Учитывая длину периодических частей этих чисел, рекомендуется избегать прямого преобразования в числа с плавающей точкой. - Это код гольф. Кратчайший ответ в байтах побеждает.
Примеры
1/70 = (0).(0)(142857) => (0).(142857)(0) = (0).(142857)() = 0.142857 = 142857/1000000
10/7 = (1).()(428571) => (1).(428571)() = 1.428571 = 1428571/1000000
1/13 = (0).()(076923) => (0).(076923)() = 0.076293 = 76923/1000000
3/40 = (0).(075)() => (0).()(075) = 0.075075... = 75/999 = 25/333
-2/15 = -(0).(1)(3) => -(0).(3)(1) = -0.311111... = -28/90 = -14/45
75/38 = (1).(9)(736842105263157894)
=> (1).(736842105263157894)(9) = (1).(736842105263157895)() ## since 0.999... = 1
= 1.736842105263157895 = 1736842105263157895/1000000000000000000
= 347368421052631579/200000000000000000
25/168 = (0).(148)(809523) => (0).(809523)(148) = 0.809523148148... = 870397/1080000
120/99 = (1).()(21) => (1).(21)() = 1.21 = 121/100
2/1 = (2).()() => (2).()() = 2 = 2/1
0/1 = (0).()() => (0).()() = 0 = 0/1
0/2 = (0).()() => (0).()() = 0 = 0/1
299/792 = (0).(377)(52) => (0).(52)(377) = 0.52377377... = 2093/3996
95/-14 = -(6).(7)(857142) => -(6).(857142)(7) = -6.857142777... = -12342857/1800000
-95/-14 = (6).(7)(857142) => (6).(857142)(7) = 6.857142777... = 12342857/1800000
code-golf
math
number
rational-numbers
Sherlock9
источник
источник
0
в конце теста 2 (10/7
):1428571/100000
должно быть1428571/1000000
.1/7
может быть представлена в виде ,(0).()(142857)
или(0).(1)(428571)
,1
может быть представлена в виде(1).()()
,(0).()(9)
,(0).()(99)
,(0).(9)(9)
и т.д.Ответы:
Python 2, 292 байта
Ungolfed версия, работает как в Python 2 и 3. Также печатает десятичное представление.
источник
d=10**len(p+a)
if n==0: p=''
, использование``
в любом месте вы используетеstr
, например,`n/d`
вместо тогоstr(n/d)
, переименовыватьlen
кL
сL=len;
в начале функции.n=int(b+p+a);d=10**L(p+a)
иimport fractions as f;g=f.gcd(n,d);return(n/g*s,d/g)
. Кроме того, я получаю 295 байт для вашего текущего редактирования. Есть ли дополнительный символ новой строки, который вы забыли пропустить?Желе ,
1021018987838179787774 байтаЭто заняло много времени, чтобы написать, слишком долго для отладки, и определенно нужно много играть в гольф (
восемь семь шестьпятьчетыре ссылки, святая корова), но, насколько я знаю, это правильно. Огромное спасибо Деннису за помощь, особенно с первыми двумя ссылками. Большое спасибо и Райнеру П., так как в итоге я позаимствовал много алгоритма в их ответе на Python.Редактирование гольфа: -1 байт благодаря Ксандерхоллу. Исправлена ошибка, из-за которой не использовалась правильная логическая НЕ встроенная функция. -13 байтов от связи с нумератором. +1 байт от исправления ошибки за минус
d
с Деннисом. Перестроил ссылки так, чтобы генерация числителя была в одной ссылке. -2 байта от объединения второй и третьей ссылок. -4 байта от перемещения некоторых общих элементов третьей и четвертой ссылок на вторую ссылку и основную ссылку. -2 байта от удаления некоторых лишних операторов цепочки. -2 байта от перестановки ссылки нумератора. -1 байт от переходаḢ€
к концу второй ссылки. Исправлена ошибка в основной ссылке. -1 байт от измененияṪ ... ,Ḣ
доḢ ... ṭ
. -3 байта от перемещения ссылки нумератора в основную ссылку.Предложения по игре в гольф приветствуются! Попробуйте онлайн!
объяснение
Сначала я объясню основную ссылку , которая называет другие ссылки.
Затем первая ссылка, которая получает цифры.
Теперь вторая ссылка, которая получает периодические и непериодические части
n/d
, и много других тяжелых работ.Третье звено , которое дает наш новый знаменатель.
источник