Pirrasyonel Sayılar


14

Pi bir olan irrasyonel sayı onluk gösterimi sonlandırır veya tekerrür asla araçları.

Pi 41 ondalık basamağa kesildi (40 basamak) 3.1415926535897932384626433832795028841971.

Ondalık noktayı dikkate almazsak ve rakamları yinelemeden kaçınarak pozitif tamsayı dizisi olarak listelersek, elde ederiz 3 1 4 15 9 2 6 5 35 8 97 93 23 84 62 64 33 83 27 950 28 841 971( OEIS A064809 ).
( Zaten oluşmuş olması 15yerine sırayla beliren uyarı . Olumlu olmadığı için oluşmadığını unutmayın ; ilk sıfırı içerir.)1 51
0950

İlk pirrasyonel sayıyı oluşturmak için, bu diziyi Pi basamaklarına endekslemek için kullanırız (ilk basamak 3, ikinci 1 vb.).

Yani ilk pirrasyonel sayının ilk basamağı Pi'nin 3. basamağı
, ikinci basamak Pi'nin 1. basamağı
, üçüncü basamak Pi'nin 4. basamağı
, dördüncü Pi'nin 15. basamağı
vb.
Pi'yi taklit etmek için ilk basamaktan sonra bir ondalık nokta eklenir.

Böylece 41 basamaklı ilk basamak sayısı 4.3195195867462520687356193644029372991880.
(30. basamak için Pi'nin 974. basamağına kadar gitmem gerektiğini unutmayın.)

İkinci pirrasyonel sayıyı oluşturmak için, işlem Pi yerine birinci pirrasyonel sayı kullanılarak tekrarlanır. (Pi'nin kendisi sıfırıncı pirrasyonel sayı olarak adlandırılabilir.) Böylece yeni dizi başlar 4 3 1 9 5 19 58 ...ve ilk piirarasyon sayısı, ikinciyi üretmek için endekslenir ve bu başlar 9.14858....

Diğer pirrasyonel sayılar aynı şekilde oluşturulur, her biri bir öncekinden üretilir.

Meydan okuma

Senin görevin, iki tamsayı alır Nve ondalık basamaklara kesilmiş ikinci sayı Dçıktısı mümkün olan en kısa programı Nyazmaktır D.

Dher zaman pozitiftir, ancak Nnegatif değildir ve DPi rakamları N0
olduğunda çıktılanmalıdır. D1 olduğunda ondalık noktasının mevcut olup olmadığı önemli değildir.

Giriş stdin veya komut satırından gelmeli ve çıkış stdout'a (veya dilinizin en yakın alternatiflerine) gitmelidir.

Programınız 2 16N ve Daltındaki tüm giriş değerleri için çalışmalıdır , ancak zamanında veya verimli olması gerekmez.

Bayt cinsinden en kısa kod kazanır.

(Pirrasyonel sayıların diğer bazlarda çıktığını, ancak bu meydan okumadaki her şeyin taban 10'da yapıldığını unutmayın.)


Rakamlarını almak için Pi'nin yerleşik keyfi hassasiyetli temsillerini kullanabilir miyiz ?
Martin Ender

1
@ MartinBüttner Tabii. Eğer sürece gibi Hatta isterseniz çevrimiçi Pi'nin basamak alabilir ancak Pi'nin basamak alma.
Calvin'in Hobileri

@ Calvin'sHobbies: Ah güzel yani ben sadece bir dosyada ilk 64ki pi rakam olabilir? Dosya adı için +1 eklemeli miyim?
Claudiu

Bu giriş aralığı doğru mu? Örneğin N=1, D=13393PI'nın 31 milyonuncu basamağına ihtiyacınız var
Claudiu

Pi'nin ilk 1 milyar basamağı size yalnızca 1. pirrasyonel sayının 42.598 basamağını alır
Claudiu

Yanıtlar:


3

Python 292 bayt

Oldukça verimsiz, sadece birkaç rakam N = 3 elde edebildim ve hiçbiri N = 4 elde edemedim.

import sympy
def P(N,D,s=''):
 if N<1:return'3'+`sympy.pi.evalf(D+9)`[2:-9]
 for i in range(D):
    h=[];l='';j=i;x=0
    while-~j:
     x+=1;d=P(N-1,x)[-1];l+=d
     while'1'>P(N-1,x+1)[-1]:x+=1;l+='0'
     if(l in h)<1:h+=[l];l='';j-=1
    s+=P(N-1,int(h[i]))[-1]
 return s
s=P(*input())
print s[0]+'.'+s[1:]

Örnek giriş:

0,20
3.1415926535897932384

1,20
4.3195195867462520687

2,10
9.148583196

3,5
9.9815

Golf'ün: Değişim =="0"için <"1". İç while döngüsü bir satır olun. Etraftaki boşlukları kaldırın x += 1. if l not in h-> if(l in h)<1: N==0->N<1
isaacg

@isaacg Teşekkürler, yayınladığım ve bazı açık şeyleri kaçırdığımda biraz acelem vardı. Muhtemelen dize karşılaştırması yapabileceğini fark etmezdim ve if(l in h)<1aynı zamanda oldukça zeki.
KSab

Biraz daha: ( ) sparametresi olarak başlat . muhtemelen backticks ile yazılabilir. yerden tasarruf sağlar. Yap bir dizi ile başlatmak daha sonra yazmak kadar . Pdef P(N,D,s=''):str(...)while'1'>...hh=l,={''}l in h{l}<h
flornquake

@flornquake Bu oldukça zekice, özellikle de python'un bir diksiyon olduğunu düşünmediği için başlattığınız şekilde. Bunu olsa da, maalesef hsipariş edilmesi gereken oldukça büyük bir optimizasyon gerçekleştirdim . Yine de, bu hatırlamaya çalışacağım temiz bir numara.
KSab

@KSab Bu daha da iyi. :) while j+1:kısaltılabilir while-~j, btw.
flornquake

4

Haskell, 431 400 369

import Data.List
g(q,r,t,k,n,l)|4*q+r-t<n*t=n:g(q#0,(r-n*t)#0,t,k,div(r#(30*q))t-n#0,l)|1<2=g(q*k,(2*q+r)*l,t*l,k+1,div(q*(7*k+2)+r*l)(t*l),l+2)
u w@(x:y:xs)=x:v y xs 0 w
v a(r:s)n w|a`elem`take n(u w)||r==0=v(a#r)s n w|1<2=a:v r s(n+1)w
m p=map(genericIndex p.pred)$u p
a#b=a*10+b
(x:s)%n=show x++'.':show(foldl1(#)$n`take`s)
f n d=print$iterate m(g(1,0,1,1,3,3))!!n%d

Sonsuz listeleri sevmek lazım! Yeterli zaman ve hafıza verildiğinde, bu program sonunda herhangi bir N ve D için doğru cevabı hesaplayacaktır (sanırım).

gBir spigot algoritması (Stanley Rabinowitz adlı bir adamdan utanmadan çalındı) kullanarak pi rakamlarını üretiyorum, rakamları gruplandırıyor / kullanarak sıra oluşturuyor vve bunlardan bir pirrasyonel sayı üretiyorum m.

İşte burada:

λ> f 0 10
"3.1415926535"
λ> f 1 10
"4.3195195867"
λ> f 2 10
"9.Interrupted. --didn't have the time to wait for this to finish
λ> f 2 4
"9.1485"

1
"Haskell!" Diye düşündüm. soruyu görünce aşağı kaydırdım ve gülümsedim.
Soham Chowdhury
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.