Целые числа в Base Pi

11

Фон:

Pi ( π) - трансцендентное число , и поэтому оно имеет не заканчивающееся десятичное представление. Аналогично, представление не завершается, если записано в любой другой целочисленной базе. Но что, если мы написали это в базе π?

Цифры в десятичном виде представляют степени 10, поэтому:

π = 3.14… = (3 * 10^0) + (1 * 10^-1) + (4 * 10^-2) + …

Таким образом, в основе πцифры будут представлять полномочия π:

π = 10 = (1 * π^1) + (0 * π^0)

В этой новой базе целые числа теперь имеют не заканчивающиеся представления. Таким образом, 10 в десятичном виде теперь становится следующим:

10 => 100.01022… = (1 * π^2) + (0 * π^1) + (0 * π^0) + (0 * π^-1) + (1 * π^-2) + …

Обратите внимание, что в основе πиспользуются цифры 0,1,2,3, потому что это цифры меньше, чем π.

Вызов:

Учитывая неотрицательное целое число x, либо:

  1. Выведите (без остановки) его представление в базу π. Если число имеет конечное представление (0, 1, 2, 3), то программа может остановиться вместо вывода бесконечных нулей.

  2. Возьмите произвольно большое целое число nи выведите первые nцифры xв базу π.

Правила:

  • Поскольку число имеет несколько возможных представлений, вы должны вывести то, которое кажется наибольшим (нормализованным). Как и 1.0 = 0.9999…в десятичной системе, эта проблема существует и в этой базе. В базе π, один все еще 1.0, но также может быть написано как 0.3011…, например. Точно так же десять есть 100.01022…, но также может быть записано как 30.121…или 23.202….
  • Это код-гольф, поэтому побеждает меньше байтов. Программа или функция.
  • Нет встроенных модулей ( я смотрю на тебя , Mathematica )

Полученные результаты:

0       = 0
1       = 1
2       = 2
3       = 3
4       = 10.220122021121110301000010110010010230011111021101…
5       = 11.220122021121110301000010110010010230011111021101…
6       = 12.220122021121110301000010110010010230011111021101…
7       = 20.202112002100000030020121222100030110023011000212…
8       = 21.202112002100000030020121222100030110023011000212…
9       = 22.202112002100000030020121222100030110023011000212…
10      = 100.01022122221121122001111210201201022120211001112…
42      = 1101.0102020121020101001210220211111200202102010100…
1337    = 1102021.0222210102022212121030030010230102200221212…
9999    = 100120030.02001010222211020202010210021200221221010…

Первые 10 000 цифр из десяти в базе Пи

Проверка:

Вы можете проверить любой вывод, используя код Mathematica здесь . Первый параметр x, третий n. Если время истекло, выберите маленький nи запустите его. Затем нажмите «Открыть в коде», чтобы открыть новый рабочий лист Mathematica с программой. Там нет ограничения по времени там.

Преобразуйте полученный результат в число здесь .

Связанные с:

mbomb007
источник
4
«Нет встроенных модулей» включает в себя никаких встроенных модулей для получения Пи?
Нить
3
@ Нет Нет, это означает, что нет встроенного, который завершает или упрощает всю задачу. Или, если такая встроенная функция существует (как в Mathematica, которую я показал), обязательно включите решение без встроенной функции, которое будет использоваться для фактической оценки ответа. Таким образом, вы все еще можете показать людям, что встроенное существует.
mbomb007
Можем ли мы использовать π-литерал с ограниченной точностью?
Эрик Outgolfer
@EriktheOutgolfer Нет. Этого будет недостаточно для получения правильного результата. Хотя я не уверен, сколько цифр требуется для ввода n, я предполагаю, что Пи должен иметь хотя бы nточность точности.
mbomb007
8
IMO: Запрет встроенных базовых конверсий просто добавляет ненужную сложность. Если вы чувствуете, что это упрощает задачу, ну, может, проблема в следующем: тривиально
Конор О'Брайен,

Ответы:

1

Юлия 0,6 , 81 байт

f(x,i=log(π,x1)=(y=big(π)^i;d::Int=x÷y;print(i==0?"$d.":"$d");f(x-d*y,i-1))

Печатает цифры (и т. Д., Которые стоят мне 14 байт) до тех пор, пока в TIO не переполнится стек около 22 тыс. Цифр. Если мне разрешено передавать входные данные как BigFloatя, я могу сократить 5 байтов. Использует встроенную произвольную постоянную точности π. Но это немного круче, чем это, на самом деле это адаптивная константа точности, π*1.0это 64-битное число с плавающей запятой π*big(1.0)(или умноженное на более высокое число точности), которое выдает πпри любой вашей точности.

Попробуйте онлайн!

GGGG
источник
3

Python 3 , 471 317 310 байт

7 байт благодаря caird.

Конечно, есть гольф, который я пропустил. Не стесняйтесь указывать их в комментариях.

def h(Q):
	a=0;C=b=4;c=d=s=1;P=o=3
	while P^C:
		a,b,c,d,s,o,P,A,B=b,s*a+o*b,d,s*c+o*d,s+o,o+2,C,0,1
		for I in Q:B*=c;A=A*a+I*B
		C=A>0
	return P
def f(n,p):
	Q=[-n];R=""
	while h([1]+Q)<1:Q=[0]+Q
	Q+=[0]*p
	for I in range(len(Q)):
		i=3;Q[I]+=3
		while h(Q):Q[I]-=1;i-=1
		R+=str(i)
	return R[:-p]+"."+R[-p:]

Попробуйте онлайн!

Безголовая версия:

def poly_eval_pi_pos(poly,a=0,b=4,c=1,d=1,o=3,s=1,prev=9,curr=6):
	while prev != curr:
		a,b,c,d,s,o=b,s*a+o*b,d,s*c+o*d,s+o,o+2
		prev = curr
		res_n, res_d = 0,1
		for I in poly:
			res_d *= c
			res_n = res_n*a + I * res_d
		curr = res_n > 0
	return prev
def to_base_pi(n,precision):
	poly = [-n]
	res = ""
	while not poly_eval_pi_pos([1]+poly):
		poly = [0]+poly
	poly += [0]*precision
	for index in range(len(poly)):
		i = 3
		poly[index] += 3
		while poly_eval_pi_pos(poly):
			poly[index] -= 1
			i -= 1
		res += str(i)
	return res[:-precision]+"."+res[-precision:]

Попробуйте онлайн!

Дрянная Монахиня
источник
Вам нужен Python 3? Если можно использовать 2, вы можете использовать смешанные пробелы и табуляции.
mbomb007
@ mbomb007 «Гольфы, которые я пропустил», не включают переход на более старую версию только для игры в гольф: P
Leaky Nun
Тогда вы могли бы также использовать `i`.
mbomb007
3

Рубин -rbigdecimal/math , 111 103 97 байт

->x,n{q=BigMath::PI n;r=q**m=Math.log(x,q).to_i;n.times{$><<"#{?.if-2==m-=1}%i"%d=x/r;x%=r;r/=q}}

Попробуйте онлайн!

Принимает входной номер как xи желаемую точность как n. Выходы на печать. Использует встроенную библиотеку BigDecimal для произвольного значения PI pecision.

Кирилл Л.
источник
встроенный явно запрещен
Leaky Nun
1
См. Комментарии к задаче: «- В« нет встроенных модулей »нет встроенных модулей для получения Pi?» «- Нет, это означает, что нет встроенного, который завершает или упрощает всю задачу».
Кирилл Л.
@LeakyNun Кирилл прав. Встроенные модули для Pi допускаются, если полученный ответ правильный.
mbomb007
Не нужно ли считать байты параметров командной строки? Я не уверен, как это работает
mbomb007
Я бы сказал, больше не в соответствии с этой мета . Что-то в строках «считаю это неким языком, отличным от простого Ruby».
Кирилл Л.
1

Python 3 + sympy, 144 байта

from sympy import*
def f(n,p):
	R="";O=n and int(log(n,pi));r=pi**O
	for _ in range(O+p):R+=str(int(n/r));n%=r;r/=pi
	return R[:O+1]+"."+R[O+1:]

Попробуйте онлайн!

На самом деле довольно медленно.

Дрянная Монахиня
источник