Вступление
Десятичная дробь заканчивается, если она имеет конечное число десятичных цифр. Например, 0,4 (2/5) заканчивается, потому что у него одна десятичная цифра.
Десятичная дробь является чисто периодической, если она имеет бесконечное число десятичных цифр и не имеет десятичных цифр перед повторением (часть повторяющейся десятичной дроби). Например, 0,142857142857142… (1/7) является чисто периодической, потому что она имеет повторяемую 142857, который начинает повторяться сразу после десятичной точки.
Десятичная дробь в конечном итоге является периодической, если она имеет бесконечное число десятичных цифр и имеет конечное число десятичных цифр перед повторением (часть повторяющейся десятичной дроби). Например, 0,166666666666666… (1/6) в конечном итоге является периодической, поскольку ее повторение 6 начинает повторяться после 1.
Твое задание
Напишите программу или функцию, которая при заданных числах p и q (целые числа, 0 <= p < q <= 100) будет определять, является ли десятичное представление p / q завершающим, чисто периодическим или, в конечном счете, периодическим.
Вы должны выход , a
если он , истекающий (т.е. 0,1), b
если это чисто периодическая (т.е. 0,333 ...), или , c
если это в конечном счете Периодическая (т.е. 0,166 ...), где a
, b
и c
какие -то отдельные, константные строки вашего выбора.
Контрольные примеры
0/1 => Terminating
0/2 => Terminating
1/2 => Terminating
0/3 => Terminating
1/3 => Purely Periodic
2/3 => Purely Periodic
0/4 => Terminating
1/4 => Terminating
2/4 => Terminating
3/4 => Terminating
0/5 => Terminating
1/5 => Terminating
2/5 => Terminating
3/5 => Terminating
4/5 => Terminating
0/6 => Terminating
1/6 => Eventually Periodic
2/6 => Purely Periodic
3/6 => Terminating
4/6 => Purely Periodic
5/6 => Eventually Periodic
0/7 => Terminating
1/7 => Purely Periodic
2/7 => Purely Periodic
3/7 => Purely Periodic
4/7 => Purely Periodic
5/7 => Purely Periodic
6/7 => Purely Periodic
0/8 => Terminating
1/8 => Terminating
2/8 => Terminating
3/8 => Terminating
4/8 => Terminating
5/8 => Terminating
6/8 => Terminating
7/8 => Terminating
0/9 => Terminating
1/9 => Purely Periodic
2/9 => Purely Periodic
3/9 => Purely Periodic
4/9 => Purely Periodic
5/9 => Purely Periodic
6/9 => Purely Periodic
7/9 => Purely Periodic
8/9 => Purely Periodic
0/10 => Terminating
1/10 => Terminating
2/10 => Terminating
3/10 => Terminating
4/10 => Terminating
5/10 => Terminating
6/10 => Terminating
7/10 => Terminating
8/10 => Terminating
9/10 => Terminating
0/11 => Terminating
1/11 => Purely Periodic
2/11 => Purely Periodic
3/11 => Purely Periodic
4/11 => Purely Periodic
5/11 => Purely Periodic
6/11 => Purely Periodic
7/11 => Purely Periodic
8/11 => Purely Periodic
9/11 => Purely Periodic
10/11 => Purely Periodic
0/12 => Terminating
1/12 => Eventually Periodic
2/12 => Eventually Periodic
3/12 => Terminating
4/12 => Purely Periodic
5/12 => Eventually Periodic
6/12 => Terminating
7/12 => Eventually Periodic
8/12 => Purely Periodic
9/12 => Terminating
10/12 => Eventually Periodic
11/12 => Eventually Periodic
0/13 => Terminating
1/13 => Purely Periodic
2/13 => Purely Periodic
3/13 => Purely Periodic
4/13 => Purely Periodic
5/13 => Purely Periodic
6/13 => Purely Periodic
7/13 => Purely Periodic
8/13 => Purely Periodic
9/13 => Purely Periodic
10/13 => Purely Periodic
11/13 => Purely Periodic
12/13 => Purely Periodic
0/14 => Terminating
1/14 => Eventually Periodic
2/14 => Purely Periodic
3/14 => Eventually Periodic
4/14 => Purely Periodic
5/14 => Eventually Periodic
6/14 => Purely Periodic
7/14 => Terminating
8/14 => Purely Periodic
9/14 => Eventually Periodic
10/14 => Purely Periodic
11/14 => Eventually Periodic
12/14 => Purely Periodic
13/14 => Eventually Periodic
0/15 => Terminating
1/15 => Eventually Periodic
2/15 => Eventually Periodic
3/15 => Terminating
4/15 => Eventually Periodic
5/15 => Purely Periodic
6/15 => Terminating
7/15 => Eventually Periodic
8/15 => Eventually Periodic
9/15 => Terminating
10/15 => Purely Periodic
11/15 => Eventually Periodic
12/15 => Terminating
13/15 => Eventually Periodic
14/15 => Eventually Periodic
Вы можете найти все тестовые примеры здесь .
Вам разрешено выбирать свои 3 значения для вывода, но должно быть ясно, какое из них это.
Помните, что это код-гольф , поэтому выигрывает код с наименьшим количеством байтов.
Советы
Нагрузочный:
Простая факторизация конечного десятичного знаменателя в простейшей форме состоит только из 2-х и 5-х.
Чисто периодический:
Простая факторизация чисто периодического десятичного знаменателя в простейшей форме не включает в себя любые 2 или 5.
В конце концов, периодические:
Простая факторизация знаменателя конечного периодического десятичного числа в простейшей форме включает в себя, по меньшей мере, одно 2 или 5, но также включает и другие числа.
Leaderboards
Вот фрагмент стека, который генерирует как регулярную таблицу лидеров, так и обзор победителей по языкам.
Чтобы убедиться, что ваш ответ обнаружен, начните его с заголовка, используя следующий шаблон уценки:
# Language Name, N bytes
где N
размер вашего представления. Если вы улучшите свой счет, вы можете сохранить старые результаты в заголовке, вычеркнув их. Например:
# Ruby, <s>104</s> <s>101</s> 96 bytes
Если вы хотите включить в заголовок несколько чисел (например, потому что ваш результат равен сумме двух файлов или вы хотите перечислить штрафы за флаг интерпретатора отдельно), убедитесь, что фактический результат является последним числом в заголовке:
# Perl, 43 + 2 (-p flag) = 45 bytes
Вы также можете сделать название языка ссылкой, которая затем будет отображаться во фрагменте списка лидеров:
# [><>](http://esolangs.org/wiki/Fish), 121 bytes
Ответы:
Желе , 10 байт
Принимает знаменатель и числитель (в таком порядке) в качестве аргументов. Возвращает 0 для завершения, 1 для чисто периодического и 2 для в конечном итоге периодического. Попробуйте онлайн! или проверьте все контрольные примеры .
Как это устроено
источник
JavaScript (ES6),
70..6853 байтаВозвращает 0 для завершения, правда для чисто периодических и false для в конечном итоге периодических.
Как это устроено
Здесь мы фактически симулируем деление вручную:
a?...:0
- Если числитель равен нулю, мы остановимся здесь и вернемся0
. Последовательность заканчивается .(s[a]^=a)?...:x==a
- Если мы уже встречались с этим числителем ранее, это означает, что последовательность является периодической и будет повторяться вечно. Мы останавливаемся здесь и возвращаем либо,true
еслиa
оно равно первому значениюx
последовательности ( чисто периодическому ), либо,false
если оно не равно (в конечном итоге периодическому) ).f(a*10%b,b,s,x||a)
- Иначе, мы умножаем числительa
на 10. Мы вычисляем остаток от деления по знаменателюb
. И мы повторяем процесс, используя этот остаток в качестве нового числителя. (Мы также передаемa
в качестве первого значения последовательности, если она еще не сохраненаx
.)пример
источник
Python,
626159 байтВыводит 1 для в конечном итоге периодического, 2 для чисто периодического и 4 для завершения.
Проверьте все случаи испытаний на repl.it .
источник
*r
?f(1, *(2, 3), 4)
эквивалентноf(1, 2, 3, 4)
.f=(n,d,...r)=>n in r?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
in
в JS это совсем не то, что в Python):f=(n,d,...r)=>~r.indexOf(r)?~(n>0?n==r[0]:2):f(10*n%d,d,...r,n)
f=(n,d,...r)=>~(i=r.indexOf(n))?n&&!i:f(10*n%d,d,...r,n)
будет работать так же.Perl,
494645 байтВключает +3 для
-p
Основанный на изящной идее Денниса, но реализованный в перлы
Дайте входные номера на STDIN
termninating.pl
:Печатает 2, если завершается. 1, если периодический и ничего, если в конечном итоге периодический
источник
Пакетный, 247 байтов
Использует мой быстрый трюк gcd10 от дроби до точного десятичного числа . Очевидно, я мог бы сохранить кучу байтов, используя собственный формат вывода.
источник
@if %d%==1 (echo T)else if %d%==%e% (echo P)else echo E
сохранить 42 байта?JavaScript (ES6),
91888579757478 байтВыходы
NaN
для завершения,1
для чисто периодического, иInfinity
для в конечном итоге периодического.Тестовый фрагмент
Показать фрагмент кода
объяснение
Сначала мы разделим n и d на gcd (d, n) , чтобы уменьшить дробь до ее простейшей формы. Это позволяет нам избегать ситуаций, подобных 2/6, где результат в противном случае был бы рассчитан как чисто периодический. Мы также определяем переменную t как gcd (d, 10) ; это будет использовано позже.
Первая проверка , является ли п является 0 или d является 1 . Если n * (d-1) равно 0, мы возвращаемся
+f
, или NaN : дробь заканчивается .Следующая проверка , является ли т является 1 . Если это так, мы возвращаем 1 : дробь является чисто периодической .
Если t не равен 1 , мы делим d на t , снова запускаем всю функцию и делим на 0. Если n / (d / t) завершается, возвращается NaN / 0 = NaN : дробь заканчивается . В противном случае возвращается 1/0 = бесконечность : дробь в конечном итоге периодическая .
источник
Infinity
для всех этих значений.n
... Спасибо за указание на это.Mathematica, 41 байт
Выводится,
{3,1,2}
если у входа есть завершающее десятичное расширение,{2,3,1}
если у входа чисто периодическое десятичное расширение, и{3,2,1}
если у входа есть в конечном итоге периодическое десятичное расширение.Основываясь на хитрой уловке: если
d
знаменатель дроби в младших сроках, то наибольший общий делительd
и10^d
равен,d
еслиd
имеет только 2 и 5 в своей первичной факторизации; равно,1
если неd
имеет ни 2s, ни 5s в своей первичной факторизации; и равно некоторому целому числу между, еслиd
имеет 2s / 5s и другие простые числа.Ordering
Функция только сообщает , где самые маленькие, рядом маленькие, и крупные элементы тройки являются, с связи сломанной влево-вправо.Ошибка: возвращает вариант вывода
{1,2,3}
вместо того,{3,1,2}
если ввод равен 0.Mathematica, 46 байтов, извращенный
Возвращает,
a[[1]]
если у входа есть завершающее десятичное расширение,b[[1]]
если у входа чисто периодическое десятичное расширение, иb[a]
если у входа есть в конечном счете периодическое десятичное расширение. Выдает ошибку во всех случаях!Как и выше, мы хотим знать, равен ли этот наибольший общий делитель 1, d или где-то посередине. Логарифм base-d этого gcd равен 0, 1 или что-то среднее.
Теперь мы начинаем пытать Mathematica.
b[a][[n]]
обозначаетn
часть выраженияb[a]
. Такb[a][[1]]
возвращаетсяa
;b[a][[0]]
возвращаетсяb
; иb[a][[x]]
, гдеx
число от 0 до 1, заставляет Mathematica выдавать ошибку «Part :: pkspec1: выражениеx
не может использоваться как спецификация детали». и возвращается безb[a][[x]]
оценки.Это уже надлежащим образом различает три случая, за исключением того, что выходные данные для в конечном итоге периодического случая есть
b[a][[x]]
, что является непостоянным, посколькуx
является действительным логарифмом чего-либо. Итак, мы применим[[1]]
к уже описанным результатам. Из-за того, как Mathematica внутренне представляетb[a][[x]]
, результатb[a][[x]][[1]]
простоb[a]
. С другой стороны, обращаясь[[1]]
кa
результатам приводит к другой ошибке: «Part :: partd: спецификация детали a [[1]] длиннее глубины объекта». и возвращает безa[[1]]
оценки (и аналогично дляb
).Ошибка: ложь о входе 0, возвращая
b[a]
вместоa[[1]]
.источник
C 173 байта
Принимает два целых числа из стандартного ввода, печатает 1 для чисто периодического, -1 для в конечном итоге периодического и 0 для завершения.
Ungolfed:
Half-golfed:
источник
На самом деле , 15 байтов
Это основано на ответе Желе Денниса . 0 завершается, 1 является чисто периодическим, а 2 в конечном итоге периодическим. Предложения по игре в гольф приветствуются. Попробуйте онлайн!
Ungolfing
источник
Mathematica, 44 байта
Возвращает
Null
для завершения,True
для чисто периодического иFalse
в конечном итоге периодического.объяснение
Найдите десятичное расширение числа N. (повторяющиеся цифры окружены дополнительной головой
List {}
).Проверьте, является ли последний элемент десятичного расширения a
List
.Если вышеприведенное условие выполнено
True
, проверьте, состоит ли все десятичное разложение из одной вещи. (АList
считается как один объект). (возвращаетTrue
илиFalse
)(Если условие выполнено
False
, тоNull
возвращается значение a, поскольку третьего аргумента для нетIf
)источник
Pyth ,
3127 байтвход
Вы можете попробовать это здесь . Выводит 1 для в конечном итоге периодического, 2 для чисто периодического и 0 для завершения. Я впервые отвечаю на Codegolf. Любые предложения приветствуются.
объяснение
Обратите внимание, что [2,3] фильтруется по [2,5] = [2], но [2,3,5] - [2,5] = [3].
источник
PARI / GP, 64 байта
Ничего не выводит для завершения, 0 для чисто и 1 для в конечном итоге периодического.
Не очень, я надеялся на что-то лучшее, когда начинал.
источник
05AB1E ,
1611 байтСохранено 5 байт благодаря @Adnan!
Печатает 0 для чисто периодического, 1 для завершения и 10 для конечного периодического.
Объяснение:
Ввод принимается как p перевод строки q .
Попробуйте онлайн!
источник
I
. Кроме того, константа предопределена10
какT
. То же самое2B
, что естьb
:).¿²r/fTrÖbÙJ
окончательный код :).PHP, 126 байт
Выводит 0 для прекращенной и 1 для чисто периодической 2 для в конечном итоге. Позвольте мне объяснить, если числитель дважды в массиве, здесь начинается периодическая сессия, если он завершается
echo end($a);
значение равно0
Если вы не доверяете мне, поставьте$t=count($a)>$d?2:0;
в циклЧтобы было понятнее, добавьте
print_r($a);
илиvar_dump($a);
илиjson_encode($a);
после циклавы можете увидеть один числитель дважды или ноль в конце массива, если числитель дважды посчитает элементы между двумя элементами, и вы можете получить длину периодического, и вы можете увидеть позицию по первому числителю, где начинается периодический
Таким образом, после этого мы можем найти положение и длину периодической последовательности с
if($t){echo $p=array_search(end($a),$a);echo $l=count($a)-$p-1;}
Визуализируйте периодическое
Выход визуализировать периодический член
Другой способ с 130 байтами
Расширенная версия
источник
[3,30,35,32,2,20,41,39,19,31,45,26,48,3]