Цілі числа в Базі Пі


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 цифр десяти в базовій частині Pi

Підтвердження:

Ви можете перевірити будь-який висновок , який ви хочете з допомогою коду Mathematica тут . Перший параметр - xтретій n. Якщо час вичерпається, виберіть маленьку nі запустіть її. Потім натисніть «Відкрити в коді», щоб відкрити новий робочий аркуш Mathematica з програмою. Там немає обмеження часу.

Перетворіть отриманий результат у число тут .

Пов'язані:


4
Чи "Вбудовані модулі" не містять вбудованих програм для отримання Pi?
Ніт

3
@Nit Ні, це означає, що немає вбудованого, який би завершив або тривілізував усе завдання. Або якщо такий вбудований існує (як Mathematica, який я показав), переконайтеся, що включіть рішення без вбудованого, яке буде використано для фактичної оцінки відповіді. Таким чином, ви все одно можете показати людям, що вбудований існує.
mbomb007

Чи можемо ми використовувати обмежену точку π буквально?
Ерік Аутгольфер

@EriktheOutgolfer Ні. Це буде недостатньо для досягнення правильного результату. Хоча я не впевнений, скільки цифр потрібно для введення n, я думаю, що Pi повинен мати принаймні nцифри точності.
mbomb007

8
IMO: Заборона базової конверсії вбудованих просто додає зайвих складностей. Якщо ви відчуваєте, що це перешкоджає виклику, ну, можливо, виклик є саме цим: тривіальний
Conor O'Brien

Відповіді:


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 байт), поки стек переповнюється приблизно на 22 К цифри на TIO. Якщо мені дозволено передавати введення як а, BigFloatя можу вирізати 5 байт. Використовує вбудовану в довільній точності постійну π. Але це трохи прохолодніше, ніж його фактична константа пристосувальної точності π*1.0- це 64-бітове число з плаваючою точкою π*big(1.0)(ака, помножене на більш високе число точності), дає πбудь-яку точну установку.

Спробуйте в Інтернеті!


3

Python 3 , 471 317 310 байт

7 байт завдяки співпраці у співтоваристві.

Звичайно, є гольфи, які я пропустив. Сміливо вказуйте їх у коментарях.

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 точності.


вбудовано явно заборонено
Leaky Nun

1
Див. Коментарі до завдання: "- Чи" Вбудовані модулі "не містять вбудованих програм для отримання Pi?" "- Ні, це означає, що немає вбудованого, що завершує або тривілізує все завдання".
Кирило Л.

@LeakyNun Кирилл має рацію. Вбудовані для Pi дозволені до тих пір, поки отримана відповідь буде правильною.
mbomb007

Чи не потрібно рахувати байти параметрів командного рядка? Я не впевнений, як це працює
mbomb007

Я б сказав, вже не відповідно до цієї мета . Щось у рядках «вважайте це якось іншою мовою від звичайної Рубі».
Кирило Л.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.