Base Pi içindeki tamsayılar


11

Arka fon:

Pi ( π) aşkın bir sayıdır ve bu nedenle sonlandırılmamış bir ondalık gösterime sahiptir. Benzer şekilde, temsil başka bir tamsayı tabanına yazılırsa sona ermez. Peki ya üs olarak yazarsak π?

Ondalık basamaklar 10'un gücünü temsil eder, bu nedenle:

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

Yani temelde π, rakamlar şu güçleri temsil eder π:

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

Bu yeni temelde, tamsayılar artık sonlandırıcı olmayan temsillere sahiptir. Yani ondalık sayı 10 şimdi şöyle olur:

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

πTemelde kullanılan basamakların 0,1,2,3 olduğunu unutmayın, çünkü bunlar daha küçük basamaklardır π.

Meydan okuma:

Negatif olmayan bir tam sayı verildiğinde x:

  1. Tabandaki temsilini çıktılar (durmadan) π. Sayının sınırlı bir temsili varsa (0, 1, 2, 3), program sonsuz sıfır yazdırmak yerine durabilir.

  2. Rastgele büyük bir tamsayı alın nve üssünün ilk nhanelerini xçıktılayın π.

Kurallar:

  • Bir sayının birden fazla olası temsili olduğundan, en büyük (normalleştirilmiş) görünen sayıyı çıkarmanız gerekir . Gibi sadece 1.0 = 0.9999…onlu, bu sorunun da bu baz bulunmaktadır. Temelde π, biri hala 1.0, ancak 0.3011…örneğin olarak da yazılabilir . Benzer şekilde, on 100.01022…, ancak 30.121…veya olarak da yazılabilir 23.202….
  • Bu kod golf, çok az bayt kazanır. Program veya işlev.
  • Hiçbir yerleşik ins ( Benim baktığım size , Mathematica'yı )

Sonuçlar:

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…

Pi tabanındaki ilk 10.000 rakam

Doğrulama:

Sen Mathematica kodu kullanarak istediğiniz herhangi bir çıktı doğrulayabilir burada . İlk parametre, xüçüncü parametre n. Zaman aşımına uğrarsa, bir küçük seçin nve çalıştırın. Ardından, programla yeni bir Mathematica çalışma sayfası açmak için "Kodda Aç" ı tıklayın. Orada zaman sınırı yok.

Elde edilen çıktıyı burada bir sayıya dönüştürün .

İlişkili:


4
"Yerleşik yok", Pi almak için yerleşik yok mu?
Nit

3
@Nit Hayır, tüm görevi tamamlayan veya önemsiz hale getiren yerleşik bir şey olmadığı anlamına gelir. Ya da böyle bir yerleşik varsa (gösterdiğim Mathematica gibi), dahili olmayan ve cevaplayıcının gerçek puanı için kullanılacak bir çözüm eklediğinizden emin olun. Bu şekilde, insanlara yerleşik olanın var olduğunu göstermeye devam edersiniz.
mbomb007

Sınırlı hassaslık π değişmezi kullanabilir miyiz?
Outgolfer Erik

@EriktheOutgolfer Hayır. Bu, doğru çıktıya ulaşmak için yeterli olmayacaktır. Bir girdi için kaç basamak gerektiğinden emin nolmasam da, Pi'nin en azından nhassas basamaklara sahip olması gerektiğini tahmin ediyorum .
mbomb007

8
IMO: Bants base dönüşüm yerleşikleri sadece gereksiz karmaşıklık katıyor. Eğer meydan okumayı önemsizleştiriyor gibi hissediyorsanız, belki de meydan okuma sadece şudur: önemsiz
Conor O'Brien

Yanıtlar:


1

Julia 0.6 , 81 bayt

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

Rakamları (ve bana 14 bayta mal olan.) Ona kadar TIO'da yaklaşık 22 bin basamaktan taşar. Eğer girdiyi BigFloatI olarak geçirirsem 5 bayt kesebilirim. Yerleşik keyfi hassaslığı sabit olarak kullanır π. Ancak bundan biraz daha serin, aslında bir uyarlanabilir hassasiyet sabiti, π*1.064 bit kayan nokta sayısıdır π*big(1.0)(daha yüksek hassasiyetli bir sayı ile çarpılır) π, hassasiyetinizin ayarlandığı her şeyi verir .

Çevrimiçi deneyin!


3

Piton 3 , 471 317 310 bayt

Caird Coinheringaahing sayesinde 7 bayt.

Kesinlikle kaçırdığım golfler var. Yorumlarda belirtmekten çekinmeyin.

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

Çevrimiçi deneyin!

Ungolfed sürümü:

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

Çevrimiçi deneyin!


Python 3'e ihtiyacınız var mı? 2 kullanılabilirse, karışık boşluklar ve sekmeler kullanabilirsiniz.
mbomb007

@ mbomb007 "kaçırdığım golfler" sadece golf uğruna eski bir sürüme geçmeyi içermez: P
Leaky Nun

Sonra da kullanabilirsiniz `i`.
mbomb007

3

Yakut -rbigdecimal/math , 111 103 97 bayt

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

Çevrimiçi deneyin!

Giriş numarasını olduğu gibi xve istenen hassasiyeti alır n. Baskı çıktıları. Yerleşik BigDecimal kütüphanesini keyfi pecision PI değeri için kullanır.


inşa açıkça yasaktır
Leaky Nun

1
Görevin yorumlarına bakın: "-" Yerleşik yok "Pi almak için yerleşik yok mu?" "- Hayır, tüm görevi tamamlayan veya önemsiz kılan yerleşik bir bilgi yok."
Kirill L.

@LeakyNun Kirill haklı. Ortaya çıkan cevap doğru olduğu sürece Pi için yerleşiklere izin verilir.
mbomb007

Komut satırı seçeneklerinin baytlarını saymanıza gerek yok mu? Nasıl çalıştığından emin değilim
mbomb007

Ben söyleyebilirim, artık bu metaya göre değil . "Bunu düz Ruby'den farklı bir dil olarak düşün" satırlarında bir şey.
Kirill L.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.