Pi'nin onuncu değerini bulun


33

Orada zaten pi adanmış 30 zorluklar ancak tek bir nedenle, n'inci ondalık bulmak ister ...

Meydan okuma

0 <= n <= 10000Ekran aralığındaki herhangi bir tamsayı için , pi'nin ondalık işareti.

kurallar

  • Ondalık sayılar her sayı 3.
  • Programınız bir işlev veya tam bir program olabilir
  • Sonucu 10 bazında almalısınız.
  • Sen alabilirsiniz n, ancak kodlanmış herhangi uygun giriş yöntemi (fonksiyon parametreleri, ... stdin, giriş (),) den
  • Seçtiğiniz dilde yerelse , 1 tabanlı dizinlemeyi kullanabilirsiniz
  • Geçersiz girdiyle uğraşmanıza gerek yok ( n == -1, n == 'a'veya n == 1.5)
  • Yerleşiklere izin verilir, en az 10 bin dekara kadar destek veriyorlarsa
  • Çalışma zamanı önemli değil, çünkü bu en kısa kod değil, en hızlı kodla ilgili
  • Bu , bayt cinsinden en kısa kod kazanır.

Test durumları

f(0)     == 1
f(1)     == 4 // for 1-indexed languages f(1) == 1
f(2)     == 1 // for 1-indexed languages f(2) == 4
f(3)     == 5
f(10)    == 8
f(100)   == 8
f(599)   == 2
f(760)   == 4
f(1000)  == 3
f(10000) == 5

Referans için, işte ilk 100k pi sayısı.


Dahili ins? egstr(pi())[n+2]
primo

6
En yakın dupe hedefleri IMO'dur, Computing kesik basamaklı pi toplamlarının toplamıdır (parametreyi aşırı yükler veya bu zorluğa uygulanan sonlu bir fark olur), Pi'yi kesin olarak iletin (bir dizin ekler ve bazı baskıları bastırır) ve Pi pencere şifrelemesi .
Peter Taylor

3
@ Tabii ki! Bu kural sadece programın kullanabilmesi için en az 10k olduğunu belirtmektir
Bassdrop Cumberwubwubwub

4
Test vakalarına f (599) eklemeyi öneriyorum, çünkü yanlış yapmak kolaylaştırabilir (yaklaşık 3 dekara ekstra hassasiyet gerekir).
aditsu

2
Ayrıca, 4 999999 8 dizisini başlatan f (760) = 4, yanlış yuvarlanması kolaydır.
Anders Kaseorg

Yanıtlar:


22

05AB1E, 3 bayt

žs¤

Açıklaması

žs   # push pi to N digits
  ¤  # get last digit

Çevrimiçi deneyin

1 tabanlı indeksleme kullanır.
100 bin haneye kadar destekler.


Pi - n hane yuvarlak değil mi?
busukxuan

7
@ busukxuan No. Önceden tanımlanmış bir pi ila 100k basamak sabiti kullandı ve N sayısını aldı.
Emigna

4
@Emigna Bu çok kullanışlıdır. Güzel çözüm.
Suever

2
Kısa ve Keskin, en iyi şekilde PCG
Xylius

16

Python 2, 66 bayt

n=input()+9
x=p=5L**7
while~-p:x=p/2*x/p+10**n;p-=2
print`x/5`[-9]

Giriş stdin'den alınmıştır.


Örnek Kullanım

$ echo 10 | python pi-nth.py
8

$ echo 100 | python pi-nth.py
8

$ echo 1000 | python pi-nth.py
3

$ echo 10000 | python pi-nth.py
5

Algoritmada n kullanma konusunda dikkatli olun ... 599 için çıkış değil 1. Ayrıca size piton 2. kullandığınızı belirtmek isteyebilir, 2 olmalıdır
aditsu

@aditsu güncellendi. Tüm n ≤ 1000 için onaylandı .
primo

1
Eğer alırsanız ngiriş artı 9 olma, sen parens önleyebilirsiniz.
xnor

@ xnor d'oh. Thanks;)
primo

2
Bu algoritma tarafından üretilen ilk birkaç rakam 5. ve 6. yerler arasında '2' eksik olan '3.141596535897932…' şeklindedir. Neden? Çünkü Python 2'nin `` operatörü Ldizeye bir a eklemeye başlar .
Anders Kaseorg

11

Bash + coreutils, 60 49 bayt

echo "scale=10100;4*a(1)"|bc -l|tr -d '\\\n'|cut -c$(($1+2))

bc -l<<<"scale=$1+9;4*a(1)-3"|tr -dc 0-9|cut -c$1

Tarafından geliştirildi Dennis . Teşekkürler!

Endeks bir tabanlıdır.


11

Python 2, 73 71 73 bayt

Puanımı 2 bayt artırdığım için @aditsu sayesinde

Sonunda 2 saniyenin altında tamamlanabilen bir algoritma.

n=10**10010
a=p=2*n
i=1
while a:a=a*i/(2*i+1);p+=a;i+=1
lambda n:`p`[n+1]

Ideone!

Taylor serisini kullanarak pi = 4*arctan(1)hesaplanırken formülü kullanır arctan(1).


Oldukça hızlı. 1-indexing, ancak python için yerel değildir. Son hatırladım (kuşkusuz bir süredir aktif değildim), konsensüs, örneğin fonksiyonların tanımlanması gerektiği idi f=lambda n:....
primo

2
Neredeyse her lambda anonimdir (bu sitede Python'da cevapları arayabilirsiniz)
Leaky Nun

İlgili meta gönderisi . Kodunuzu çalıştırdıktan sonra Kural 1 ve 3 (ihlal gibi görünüyor, fonksiyon referansı yakalamak için bir yolu yoktur; işlev tanımı her giriş (dışarı yazılması gerekir (lambda n:`p`[n+1])(1), (lambda n:`p`[n+1])(2), ...).
primo

1
Kodu doğrudan çalıştıramazsınız. importÖnceden ifadeleri koymak gibi , sadece bu bazı genel değişkenleri önceden yapar.
Leaky Nun

i=3 while a:a=i/2*a/i;p+=a;i+=24 için
primo

7

Matl, 11 10 bayt

@Luis sayesinde 1 bayt kurtarıldı

YPiEY$GH+)

Bu çözüm 1 tabanlı endekslemeyi kullanır

Çevrimiçi Deneyin

Tüm test durumları

açıklama

YP  % Pre-defined literal for pi
iE  % Grab the input and multiply by 2 (to ensure we have enough digits to work with)
Y$  % Compute the first (iE) digits of pi and return as a string
G   % Grab the input again
H+  % Add 2 (to account for '3.') in the string
)   % And get the digit at that location
    % Implicitly display the result

@LuisMendo Oh evet, çıktı zaten bir dizedir sanırım. Doh!
Suever,

@ LouisMendo Oh Asla bunu hiç düşünmedim. Ben her zaman YPsembolik araç kutusunu test ederken kullanırım
Suever

YP'ye gerçekten izin var mı? Soru, eğer <= 10k haneyi destekliyorsa izin verildiğini söylüyor
busukxuan

@Sever OP, "en azından" yerine "e kadar" olarak belirtti. Anladığım kadarıyla bu> 10k destek demek yasaktır.
busukxuan

@Suever Evet, sanırım olabileceğimi düşünüyorum. Bu yüzden Sage cevabımı sildim.
busukxuan

6

Mathematica 30 bayt

RealDigits[Pi,10,1,-#][[1,1]]&

f=%

f@0
f@1
f@2
f@3
f@10
f@100
f@599
f@760
f@1000
f@10000

1
4
1
5
8
8
2
4
3
5


5

Adaçayı, 32 25 bayt

lambda d:`n(pi,9^5)`[d+2]

Bu tür bir dilde ilk cevabım.

npi17775 hane yuvarlar .


1
printAramaya ihtiyacınız var, yoksa bu yalnızca REPL'de çalışan bir snippet.
Mego

Bu (teorik olarak) herhangi bir girdi için çalışır:lambda d:`n(pi,digits=d+5)`[-4]
Mego

2
@Mego "99999" koşusu yok mu?
busukxuan

1
@Mego ama sonra daha uzun "9" çalışır. O dolayı Sonsuz Maymun Teoremi için, bunu yapabilir Ben uzunluğunu iki katına evrensel yapabilir emin değilim ama ben bile değil düşünüyorum: en.wikipedia.org/wiki/Infinite_monkey_theorem
busukxuan

1
@busukxuan Eğer random 'nın hesaplanmamış rakamlarını rastgele olarak modelliyorsanız, 9 saniyenin keyfi bir şekilde uzun bir süre sürmesini beklersiniz (ve bunu kanıtlamamıza rağmen, gerçek π' nin farklı olmasını beklememiz için hiçbir nedenimiz yoktur), kaybolan küçük bir olasılıkla olduğu sürece 9s koşusu (yine de, gerçek un beklenmedik bir şekilde davranmadığını ispatlayamadık). [-8]Teklifi kırmak için yeterli olduğunu düşündüğüm en az dokuz 9 çalışmayı bulduk .
Anders Kaseorg


4

Mathematica, 23 21 bayt

⌊10^# Pi⌋~Mod~10&

SageMath, 24 bayt

lambda n:int(10^n*pi)%10

@LLlAMnYP Denedim ama Mathematica arasında boşluk gerektirecek şekilde görünüyor Pive (arasında ya #ve , çarpma çevrilmiş ise) tasarruf kaybolana yüzden.
Anders Kaseorg

Aslında, Mathematica Online'da çalışıyor (konsol versiyonunu kullanıyordum), o yüzden alıyorum sanırım.
Anders Kaseorg

4
Bunlar ayrı cevaplar olmalıdır. Aynı stratejiyi kullandıkları halde, hiçbir yerde aynı dilin yanında değiller.
Mego

@Mego Bulduğum politika , farklı dillerde cevapların pek benzer sayılmayacağını söylüyor. (Bunu öneren cevap kabul edilmedi.) Başka bir politikaya mı yoksa sadece bir tercihe mi bakıyorsunuz?
Anders Kaseorg

3

J , 19 15 bayt

10([|<.@o.@^)>:

Bir tam sayıyı alır , n ve çıkışlar N inci pi rakam. Sıfır tabanlı endeksleme kullanır. Almak için olan N inci rakam, hesaplamak pi çarpı 10 n 1 , o değerin kürsüye ve sonra 10 modulo alır.

kullanım

Giriş, genişletilmiş bir tamsayıdır.

   f =: 10([|<.@o.@^)>:
   (,.f"0) x: 0 1 2 3 10 100 599 760 1000
   0 1
   1 4
   2 1
   3 5
  10 8
 100 8
 599 2
 760 4
1000 3
   timex 'r =: f 10000x'
1100.73
   r
5

Makinemde 10000. haneyi hesaplamak yaklaşık 18 dakika sürüyor .

açıklama

10([|<.@o.@^)>:  Input: n
             >:  Increment n
10               The constant n
           ^     Compute 10^(n+1)
        o.@      Multiply by pi
     <.@         Floor it
   [             Get 10
    |            Take the floor modulo 10 and return

3

Clojure, 312 bayt

(fn[n](let[b bigdec d #(.divide(b %)%2(+ n 4)BigDecimal/ROUND_HALF_UP)m #(.multiply(b %)%2)a #(.add(b %)%2)s #(.subtract % %2)](-(int(nth(str(reduce(fn[z k](a z(m(d 1(.pow(b 16)k))(s(s(s(d 4(a 1(m 8 k)))(d 2(a 4(m 8 k))))(d 1(a 5(m 8 k))))(d 1(a 6(m 8 k)))))))(bigdec 0)(map bigdec(range(inc n)))))(+ n 2)))48)))48)))

Yani, muhtemelen söyleyebileceğiniz gibi, ne yaptığım hakkında hiçbir fikrim yok. Bu, her şeyden daha komik olmakla sonuçlandı. Google'ı "pi to n rakam" olarak belirledim ve Bailey – Borwein – Plouffe formülü için Wikipedia sayfasını açtım . Formülü okuyacak kadar hesaplamaya (?) Yeteri kadar bilerek, onu Clojure'a çevirmeyi başardım.

Tercümenin kendisi o kadar zor değildi. Formülün gerektirdiği için zorluk, hassasiyeti n basamağa kadar alıyor (Math/pow 16 precision); Bu gerçekten çok hızlı büyüyor. Bunun BigDecimalişe yaraması için her yeri kullanmam gerekiyordu, bu da işleri gerçekten şişiriyordu.

Ungolfed:

(defn nth-pi-digit [n]
  ; Create some aliases to make it more compact
  (let [b bigdec
        d #(.divide (b %) %2 (+ n 4) BigDecimal/ROUND_HALF_UP)
        m #(.multiply (b %) %2)
        a #(.add (b %) %2)
        s #(.subtract % %2)]
    (- ; Convert the character representation to a number...
      (int ; by casting it using `int` and subtracting 48
         (nth ; Grab the nth character, which is the answer
           (str ; Convert the BigDecimal to a string
             (reduce ; Sum using a reduction
               (fn [sum k]
                 (a sum ; The rest is just the formula
                       (m
                         (d 1 (.pow (b 16) k))
                         (s
                           (s
                             (s
                               (d 4 (a 1 (m 8 k)))
                               (d 2 (a 4 (m 8 k))))
                             (d 1 (a 5 (m 8 k))))
                           (d 1 (a 6 (m 8 k)))))))
               (bigdec 0)
               (map bigdec (range (inc n))))) ; Create an list of BigDecimals to act as k
           (+ n 2)))
      48)))

Söylemeye gerek yok, herhangi bir matematik biliyorsanız bu konuda daha kolay bir yöntem olduğuna eminim.

(for [t [0 1 2 3 10 100 599 760 1000 10000]]
  [t (nth-pi-digit t)])

([0 1] [1 4] [2 1] [3 5] [10 8] [100 8] [599 2] [760 4] [1000 3] [10000 5])

Daha sonra standart operatörlerin aslında büyük ondalık sayılar üzerinde çalıştıklarını fark ettim, bu yüzden üstteki kısayollar gereksizdir. Bir noktada bunu düzeltiyorum. Muhtemelen ~ 50 bayt bayıltır.
Carcigenicate

2

Clojure, 253 bayt

(defmacro q[& a] `(with-precision ~@a))(defn h[n](nth(str(reduce +(map #(let[p(+(* n 2)1)a(q p(/ 1M(.pow 16M %)))b(q p(/ 4M(+(* 8 %)1)))c(q p(/ 2M(+(* 8 %)4)))d(q p(/ 1M(+(* 8 %)5)))e(q p(/ 1M(+(* 8 %)6)))](* a(-(-(- b c)d)e)))(range(+ n 9)))))(+ n 2)))

Bu formülü kullanarak pi sayısını hesaplayın . Makroyu with-precisionçok sık kullanıldığı için yeniden tanımlamanız gerekir.

Çıktıyı burada görebilirsiniz: https://ideone.com/AzumC3 1000 ve 10000, ideone, omuz silkiyorlarında kullanılan zaman sınırını aşıyor


2

Python 3 , 338 bayt

Bu uygulama, pi'yi tahmin etmek için en hızlı algoritmalardan biri olan Chudnovsky algoritmasına dayanmaktadır . Her yineleme için, kabaca 14 rakam tahmin edilir ( daha fazla ayrıntı için buraya göz atın ).

f=lambda n,k=6,m=1,l=13591409,x=1,i=0:not i and(exec('global d;import decimal as d;d.getcontext().prec=%d'%(n+7))or str(426880*d.Decimal(10005).sqrt()/f(n//14+1,k,m,l,x,1))[n+2])or i<n and d.Decimal(((k**3-16*k)*m//i**3)*(l+545140134))/(x*-262537412640768000)+f(n,k+12,(k**3-16*k)*m

Çevrimiçi deneyin!


1

Java 7, 262 260 bayt

import java.math.*;int c(int n){BigInteger p,a=p=BigInteger.TEN.pow(10010).multiply(new BigInteger("2"));for(int i=1;a.compareTo(BigInteger.ZERO)>0;p=p.add(a))a=a.multiply(new BigInteger(i+"")).divide(new BigInteger((2*i+++1)+""));return(p+"").charAt(n+1)-48;}

Kullanılan LeakyNun en @ Python 2 algoritması .

Ungolfed ve test kodu:

Burada dene.

import java.math.*;
class M{
  static int c(int n){
    BigInteger p, a = p = BigInteger.TEN.pow(10010).multiply(new BigInteger("2"));
    for(int i = 1; a.compareTo(BigInteger.ZERO) > 0; p = p.add(a)){
      a = a.multiply(new BigInteger(i+"")).divide(new BigInteger((2 * i++ + 1)+""));
    }
    return (p+"").charAt(n+1) - 48;
  }

  public static void main(String[] a){
    System.out.print(c(0)+", ");
    System.out.print(c(1)+", ");
    System.out.print(c(2)+", ");
    System.out.print(c(3)+", ");
    System.out.print(c(10)+", ");
    System.out.print(c(100)+", ");
    System.out.print(c(599)+", ");
    System.out.print(c(760)+", ");
    System.out.print(c(1000)+", ");
    System.out.print(c(10000));
  }
}

Çıktı:

1, 4, 1, 5, 8, 8, 2, 4, 3, 5

1

Küçük konuşma - 270 bayt

Kimlik Güveniyor tan⁻¹(x) = x − x³/3 + x⁵/5 − x⁷/7 ...ve bu π = 16⋅tan⁻¹(1/5) − 4⋅tan⁻¹(1/239). SmallTalk sınırsız hassasiyetli tamsayı aritmetiği kullanır, böylece beklemeye istekliysen, büyük girdiler için işe yarar!

|l a b c d e f g h p t|l:=stdin nextLine asInteger+1. a:=1/5. b:=1/239. c:=a. d:=b. e:=a. f:=b. g:=3. h:=-1. l timesRepeat:[c:=c*a*a. d:=d*b*b. e:=h*c/g+e. f:=h*d/g+f. g:=g+2. h:=0-h]. p:=4*e-f*4. l timesRepeat:[t:=p floor. p:=(p-t)*10]. Transcript show:t printString;cr

Olarak kaydedin pi.stve aşağıdaki test durumlarında olduğu gibi çalıştırın. İndeksleme bir tabandır.

$ gst -q pi.st <<< 1
1
$ gst -q pi.st <<< 2
4
$ gst -q pi.st <<< 3
1
$ gst -q pi.st <<< 4
5
$ gst -q pi.st <<< 11
8
$ gst -q pi.st <<< 101
8
$ gst -q pi.st <<< 600
2
$ gst -q pi.st <<< 761
4
$ gst -q pi.st <<< 1001
3
$ gst -q pi.st <<< 10001 -- wait a long time!
5

1

JavaScript (Node.js) (Chrome 67+), 75 73 67 63 bayt

n=>`${eval(`for(a=c=100n**++n*20n,d=1n;a*=d;)c+=a/=d+++d`)}`[n]

Çevrimiçi deneyin!

kullanma π/2=Σk=0k!/(2k+1)!!(Leaky Nun'un Python'u tarafından kullanılan aynı mantık, ancak JS'nin sözdizimi sayesinde bunu kısaltır). Giriş, işleve bir BigInt olarak iletilir. 1 tabanlı indeksleme kullanılıyorsa 2 byte çıkarılabilir:

n=>`${eval(`for(a=c=100n**n*20n,d=1n;a*=d;)c+=a/=d+++d`)}`[n]

JavaScript (Node.js) (Chrome 67+), 90 89 bayt

n=>`${eval(`for(a=100n**++n*2n,b=a-a/3n,c=0n,d=1n;w=a+b;a/=-4n,b/=-9n,d+=2n)c+=w/d`)}`[n]

Çevrimiçi deneyin!

kullanma π/4=arctan(1/2)+arctan(1/3). Giriş, işleve bir BigInt olarak iletilir. 1 tabanlı indeksleme kullanılıyorsa 2 byte çıkarılabilir:

n=>`${eval(`for(a=100n**n*2n,b=a-a/3n,c=0n,d=1n;w=a+b;a/=-4n,b/=-9n,d+=2n)c+=w/d`)}`[n]

0

Akçaağaç, 24 bayt

 trunc(10^(n+1)*Pi)mod 10

Test durumları:

> f:=n->trunc(10^(n+1)*Pi)mod 10;
> f(0);
  1
> f(1);
  4
> f(2);
  1
> f(3);
  5
> f(10);
  8
> f(100);
  8
> f(599);
  2
> f(760);
  4
> f(1000);
  3
> f(10000);
  5

0

C #, 252 250 bayt

d=>{int l=(d+=2)*10/3+2,j=0,i=0;long[]x=new long[l],r=new long[l];for(;j<l;)x[j++]=20;long c,n,e,p=0;for(;i<d;++i){for(j=0,c=0;j<l;c=x[j++]/e*n){n=l-j-1;e=n*2+1;r[j]=(x[j]+=c)%e;}p=x[--l]/10;r[l]=x[l++]%10;for(j=0;j<l;)x[j]=r[j++]*10;}return p%10+1;}

Çevrimiçi deneyin!

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.