Pi - иррациональное число , что означает, что его десятичное представление никогда не заканчивается и не повторяется.
Пи усекается до 41 десятичного знака (40 знаков) 3.1415926535897932384626433832795028841971
.
Если мы игнорируем десятичную точку и перечисляем цифры как последовательность натуральных чисел, избегая дубликатов , мы получим 3 1 4 15 9 2 6 5 35 8 97 93 23 84 62 64 33 83 27 950 28 841 971
( OEIS A064809 ).
(Обратите внимание, что 15
появляется в последовательности вместо того, 1 5
потому 1
что уже произошло.
Также обратите внимание, что 0
не происходит, потому что это не является положительным; 950
содержит первый ноль.)
Чтобы построить первое число pirrational, мы используем эту последовательность для индексации цифр числа Pi (первая цифра - 3, вторая - 1 и т. Д.).
Таким образом, первая цифра первого пиративного числа - это третья цифра числа Пи,
вторая цифра - первая цифра числа Пи,
третья цифра - это четвертая цифра числа Пи,
четвертая цифра - пятая цифра числа Пи
и т. Д.
Десятичная точка добавляется после первой цифры, чтобы имитировать Pi.
Таким образом, первое число до 41 цифры 4.3195195867462520687356193644029372991880
.
(Обратите внимание, что для 30-й цифры мне пришлось пройти весь путь до 974-й цифры Пи.)
Чтобы построить второе число pirrational, процесс повторяют, используя первое число piral вместо Pi. (Сам пи можно назвать нулевым пиратральным числом.) Таким образом, новая последовательность - это 4 3 1 9 5 19 58 ...
и первое индексное число индексируется для получения второго, который начинается 9.14858...
.
Дальнейшие пирральные числа создаются таким же образом, каждое генерируется из предыдущего.
Вызов
Ваша задача состоит в том, чтобы написать самую короткую возможную программу, которая принимает два целых числа N
и D
, и выводит N
пиральное число, усеченное до D
десятичных цифр.
D
всегда положительно, но N
неотрицательно, и D
цифры Pi должны выводиться, когда N
равно 0.
Когда D
равно 1, не имеет значения, присутствует ли десятичная точка или нет.
Входные данные должны поступать из stdin или командной строки, а выходные данные - из stdout (или ближайших альтернатив вашего языка).
Ваша программа должна работать для всех входных значений N
и D
ниже 2 16 , но она не должна быть своевременной или эффективной.
Самый короткий код в байтах побеждает.
(Обратите внимание, что в других базах существуют пиральные числа, но все в этом задании сделано в базе 10.)
N=1
,D=13393
например, вам нужна 31 - миллионной цифры PIОтветы:
Python 292 байта
Совершенно неэффективно, я смог получить только несколько цифр с N = 3 и ни с одним из N = 4.
Пример ввода:
источник
=="0"
на<"1"
. Сделайте внутренний цикл while одну строку. Удалить пробелы вокругx += 1
.if l not in h
->if(l in h)<1:
N==0
->N<1
if(l in h)<1
это тоже довольно умно.s
как параметрP
(def P(N,D,s=''):
).str(...)
вероятно, может быть написано с помощью обратных кавычек.while'1'>...
экономит место. Сделайтеh
набор и инициализируйте с помощьюh=l,={''}
, затем напишитеl in h
как{l}<h
.h
было заказывать. Тем не менее, это ловкий трюк, который я постараюсь вспомнить.while j+1:
можно сократить доwhile-~j
, кстати.Хаскелл,
431400369Должен любить бесконечные списки! Учитывая достаточное количество времени и памяти, эта программа в конечном итоге рассчитает правильный ответ для любых N и D (я полагаю).
Я генерирую цифры числа пи с
g
помощью алгоритма spigot (бессовестно украденного у парня по имени Стэнли Рабинович), группирую цифры / создаю последовательность, используя их,v
и генерирую число из них, используя ихm
.Вот оно в действии:
источник