จำนวนเต็มใน 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…
  • นี่คือโค้ดกอล์ฟซึ่งมีจำนวนน้อยที่สุดที่จะชนะ โปรแกรมหรือฟังก์ชั่น
  • ไม่มีบิวด์อิน ( ฉันมองมาที่คุณมาเธมาติกา )

ผล:

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 ใหม่พร้อมโปรแกรม ไม่มีการ จำกัด เวลา

แปลงการส่งออกผลเป็นตัวเลขที่นี่

ที่เกี่ยวข้อง:


4
"ไม่มีบิลด์อิน" รวมถึงบิลด์อินเพื่อรับ Pi หรือไม่?
นิตย์

3
@ ไม่ไม่มันหมายถึงไม่มีการติดตั้งในตัวที่ทำให้งานทั้งหมดสมบูรณ์หรือเป็นเรื่องเล็กน้อย หรือถ้ามีบิวด์อิน (เช่น Mathematica ที่ฉันแสดง) ตรวจสอบให้แน่ใจว่าได้รวมโซลูชันที่ไม่มีบิวด์อินซึ่งจะใช้สำหรับคะแนนจริงของคำตอบ ด้วยวิธีนี้คุณยังคงสามารถแสดงให้คนอื่นเห็นว่ามีในตัว
mbomb007

เราสามารถใช้ตัวอักษร precision ที่มีความแม่นยำ จำกัด ได้หรือไม่?
Erik the Outgolfer

@EriktheOutgolfer ไม่ว่าจะไม่เพียงพอสำหรับการส่งออกที่ถูกต้อง แม้ว่าฉันไม่แน่ใจว่าจำเป็นต้องป้อนตัวเลขกี่หลักnแต่ฉันเดาว่า Pi ต้องมีnความแม่นยำอย่างน้อยที่สุด
mbomb007

8
IMO: การแปลงบิวด์อินแบบแบน ๆ นั้นเพิ่มความซับซ้อนที่ไม่จำเป็น หากคุณรู้สึกว่ามันเป็นเรื่องท้าทายเล็กน้อยอาจเป็นความท้าทาย: เรื่องเล็กน้อย
Conor O'Brien

คำตอบ:


1

Julia 0.6 , 81 bytes

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

พิมพ์ตัวเลข (และ. ซึ่งมีค่าฉัน 14 ไบต์) จนกระทั่งสแต็คล้นที่ประมาณ 22k หลักใน 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 "golfs ที่ฉันพลาด" ไม่รวมถึงการสลับไปใช้เวอร์ชั่นเก่าเพื่อการเล่นกอล์ฟ: P
Leaky Nun

`i`แล้วคุณยังสามารถใช้
mbomb007

3

Ruby -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 ในตัวสำหรับค่า pecision PI โดยพลการ


สร้างขึ้นในเป็นสิ่งต้องห้ามอย่างชัดเจน
แม่ชีที่รั่ว

1
ดูความเห็นต่องาน: "-" ไม่มีตัวใน "รวมถึงไม่มีตัวในการรับ Pi?" "- ไม่หมายถึงไม่มีการติดตั้งในตัวที่ทำให้งานทั้งหมดหรือเล็ก ๆ น้อย ๆ สำเร็จ"
คิริลล์ลิตร

@LeakyNun Kirill พูดถูก บิวด์อินสำหรับ Pi ได้รับอนุญาตตราบใดที่คำตอบนั้นถูกต้อง
mbomb007

คุณไม่ต้องนับไบต์ของตัวเลือกบรรทัดคำสั่ง? ฉันไม่แน่ใจว่าวิธีการทำงาน
mbomb007

ฉันจะบอกว่าไม่อีกต่อไปตามเมตานี้ บางสิ่งในบรรทัดของ "ลองพิจารณาภาษาที่แตกต่างจากทับทิมธรรมดา"
คิริลล์ลิตร

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.