Integer di Base Pi

11

Latar Belakang:

Pi ( π) adalah bilangan transendental , dan oleh karena itu ia memiliki representasi desimal yang tidak berakhir. Serupa, representasi tidak berakhir jika ditulis dalam basis integer lainnya. Tetapi bagaimana jika kita menulisnya di markas π?

Digit dalam desimal mewakili kekuatan 10, jadi:

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

Jadi pada dasarnya π, angka akan mewakili kekuatan π:

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

Di basis baru ini, bilangan bulat sekarang memiliki representasi non-terminating. Jadi 10 dalam desimal sekarang menjadi sebagai berikut:

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

Perhatikan bahwa dalam basis πangka yang digunakan adalah 0,1,2,3 karena ini adalah angka yang kurang dari π.

Tantangan:

Diberikan bilangan bulat non-negatif x, baik:

  1. Output (tanpa menghentikan) perwakilannya di basis π. Jika angka memiliki representasi terbatas (0, 1, 2, 3), maka program dapat berhenti alih-alih mencetak nol tanpa batas.

  2. Ambil bilangan bulat besar yang sewenang-wenang n, dan hasilkan ndigit pertama xbasis π.

Aturan:

  • Karena angka memiliki beberapa kemungkinan representasi, Anda harus menampilkan yang tampak terbesar (dinormalisasi). Sama seperti 1.0 = 0.9999…dalam desimal, masalah ini juga ada di pangkalan ini. Pada dasarnya π, seseorang masih 1.0, tetapi bisa juga ditulis sebagai 0.3011…, misalnya. Demikian pula, sepuluh adalah 100.01022…, tetapi juga dapat ditulis sebagai 30.121…atau 23.202….
  • Ini adalah kode-golf, byte paling sedikit menang. Program atau fungsi.
  • Tidak ada bawaan ( Saya melihat Anda , Mathematica )

Hasil:

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 digit pertama dari sepuluh di basis Pi

Verifikasi:

Anda dapat memverifikasi output apa pun yang Anda inginkan menggunakan kode Mathematica di sini . Parameter pertama adalah x, yang ketiga adalah n. Jika waktu habis, pilih yang kecil ndan jalankan. Kemudian klik "Open in Code" untuk membuka lembar kerja Mathematica baru dengan program. Tidak ada batasan waktu di sana.

Ubah output yang dihasilkan ke angka di sini .

Terkait:

mbomb007
sumber
4
Apakah "tidak ada built-in" tidak termasuk built-in untuk mendapatkan Pi?
Nit
3
@ Tidak, itu berarti tidak ada built-in yang menyelesaikan atau meremehkan seluruh tugas. Atau jika built-in tersebut ada (seperti Mathematica yang saya tunjukkan), pastikan untuk memasukkan solusi tanpa built-in yang akan digunakan untuk skor aktual jawaban. Dengan begitu, Anda masih bisa menunjukkan kepada orang-orang bahwa built-in itu ada.
mbomb007
Bisakah kita menggunakan π literal presisi terbatas?
Erik the Outgolfer
@EriktheOutgolfer No. Itu tidak akan cukup untuk sampai pada output yang benar. Meskipun saya tidak yakin berapa banyak digit yang diperlukan untuk input n, saya kira Pi harus memiliki setidaknya npresisi digit.
mbomb007
8
IMO: Larangan builtin konversi basis hanya menambah kompleksitas yang tidak perlu. Jika Anda merasa hal itu meremehkan tantangan, yah, mungkin tantangannya hanya itu: sepele
Conor O'Brien

Jawaban:

1

Julia 0,6 , 81 byte

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

Mencetak digit (dan. Yang menghabiskan 14 byte) sampai Tumpukan meluap sekitar 22k digit pada TIO. Jika saya diizinkan untuk melewatkan input sebagai BigFloatsaya dapat memotong 5 byte. Memanfaatkan konstanta presisi arbitrer bawaan π. Tapi ini sedikit lebih dingin dari itu, itu sebenarnya konstanta presisi adaptif, π*1.0adalah angka floating point 64 bit, π*big(1.0)(alias dikalikan dengan angka presisi lebih tinggi) memberikan πapa pun yang diatur ke presisi Anda.

Cobalah online!

gggg
sumber
3

Python 3 , 471 317 310 byte

7 byte berkat caird coinheringaahing.

Tentunya ada golf yang saya lewatkan. Jangan ragu untuk menunjukkannya di komentar.

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:]

Cobalah online!

Versi tidak disatukan:

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:]

Cobalah online!

Biarawati Bocor
sumber
Apakah Anda memerlukan Python 3? Jika 2 dapat digunakan, Anda dapat menggunakan spasi dan tab campuran.
mbomb007
@ mbomb007 "golf yang saya lewatkan" tidak termasuk beralih ke versi yang lebih lama hanya untuk bermain golf: P
Leaky Nun
Maka Anda juga bisa menggunakan `i`.
mbomb007
3

Ruby -rbigdecimal/math , 111 103 97 byte

->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}}

Cobalah online!

Mengambil nomor input sebagai xdan presisi yang diinginkan sebagai n. Output dengan mencetak. Memanfaatkan pustaka BigDecimal bawaan untuk nilai PI pecision sewenang-wenang.

Kirill L.
sumber
built in secara eksplisit dilarang
Leaky Nun
1
Lihat komentar pada tugas: "- Apakah" tidak ada built-in "tidak termasuk built-in untuk mendapatkan Pi?" "- Tidak, itu berarti tidak ada built-in yang menyelesaikan atau meremehkan seluruh tugas."
Kirill L.
@LeakyNun Kirill benar. Built-in untuk Pi diizinkan selama jawaban yang dihasilkan benar.
mbomb007
Tidakkah Anda harus menghitung byte dari opsi baris perintah? Saya tidak yakin bagaimana cara kerjanya
mbomb007
Saya akan mengatakan, tidak lagi sesuai meta ini . Sesuatu di baris "anggap ini semacam bahasa yang berbeda dari Ruby biasa".
Kirill L.
1

Python 3 + sympy, 144 byte

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:]

Cobalah online!

Cukup lambat, sebenarnya.

Biarawati Bocor
sumber