Numeri pirazionali


14

Pi è un numero irrazionale , il che significa che la sua rappresentazione decimale non si interrompe mai o si ripete.

Pi troncato a 41 cifre decimali (40 posizioni) è 3.1415926535897932384626433832795028841971.

Se ignoriamo il punto decimale ed elenchiamo le cifre come una sequenza di numeri interi positivi, evitando duplicati , otteniamo 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 ).
(Notare che 15appare nella sequenza anziché 1 5perché si 1era già verificato.
Si noti inoltre che 0non si verifica perché non è positivo; 950contiene il primo zero.)

Per costruire il primo numero pirrazionale usiamo questa sequenza per indicizzare le cifre di Pi (la prima cifra è 3, la seconda 1, ecc.).

Quindi la prima cifra del primo numero pirrazionale è la terza cifra di Pi,
la seconda cifra è la prima cifra di Pi,
la terza cifra è la quarta cifra di Pi,
la quarta è la 15a cifra di Pi
e così via.
Un punto decimale viene aggiunto dopo la prima cifra per imitare Pi.

Quindi il primo numero pirrazionale a 41 cifre è 4.3195195867462520687356193644029372991880.
(Notare che per la 30a cifra ho dovuto arrivare fino alla 974a cifra di Pi.)

Per costruire il secondo numero pirrazionale, il processo viene ripetuto usando il primo numero pirrazionale anziché Pi. (Pi stesso può essere chiamato il numero pirrazionale di zeroth.) Quindi la nuova sequenza è 4 3 1 9 5 19 58 ...e il primo numero di penetrazione viene indicizzato per produrre il secondo, che inizia 9.14858....

Ulteriori numeri pirrazionali vengono creati allo stesso modo, ciascuno generato da quello precedente.

Sfida

Il tuo compito è quello di scrivere il programma più breve possibile che comprenda due numeri interi Ne Dche Ngeneri il numero pirrazionale troncato in Dcifre decimali.

Dè sempre positivo ma Nnon negativo e le Dcifre di Pi devono essere emesse quando Nè 0.
Quando Dè 1, non importa se il punto decimale è presente o meno.

L'input dovrebbe provenire da stdin o dalla riga di comando e l'output dovrebbe andare a stdout (o alle alternative più vicine alla tua lingua).

Il programma dovrebbe funzionare per tutti i valori di input di Ne Dinferiore a 2 16 , ma non deve essere tempestivo o efficiente.

Vince il codice più breve in byte .

(Nota che i numeri pirrazionali escono in altre basi ma tutto in questa sfida viene fatto nella base 10.)


Possiamo usare rappresentazioni di precisione arbitraria incorporate di Pi per ottenere le sue cifre?
Martin Ender,

1
@ MartinBüttner Certo. Potresti anche ottenere le cifre di pi online se vuoi fino a quando ricevi solo le cifre di pi.
Calvin's Hobbies,

@Calvin'sHobbies: Ah bene, quindi posso avere solo le prime 64 cifre di pi in un file? Devo aggiungere +1 per il nome file?
Claudiu,

L'intervallo di input è corretto? Per N=1, D=13393ad esempio, si avrebbe bisogno la cifra il 31 milionesimo di PI
Claudiu

Il primo 1 miliardo di cifre di pi ottiene solo 42.598 cifre del 1 ° numero pirrazionale
Claudiu,

Risposte:


3

Python 292 byte

Abbastanza inefficiente, sono stato in grado di ottenere solo poche cifre di N = 3 e nessuna di N = 4.

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

Input di esempio:

0,20
3.1415926535897932384

1,20
4.3195195867462520687

2,10
9.148583196

3,5
9.9815

Golf: Cambia =="0" a <"1". Fai il ciclo while interno di una riga. Rimuovi gli spazi intorno x += 1. if l not in h-> if(l in h)<1: N==0->N<1
isaacg

@isaacg Grazie per quelli, ho avuto un po 'di fretta quando ho pubblicato e perso alcune cose ovvie. Probabilmente non mi sarei reso conto che potresti fare il confronto delle stringhe e che if(l in h)<1è anche abbastanza intelligente.
KSab,

Ancora un po ': Inizializza scome parametro di P( def P(N,D,s=''):). str(...)può probabilmente essere scritto con i backtick. while'1'>...salva lo spazio. Crea hun set e inizializza conh=l,={''} , quindi scrivi l in hcome {l}<h.
terremoto,

@flornquake È abbastanza intelligente, specialmente il modo in cui lo inizializzi, quindi Python non pensa che sia un dict. Mentre stavo inserendo questo però, ho realizzato un'ottimizzazione abbastanza grande che purtroppo ha richiesto hdi essere ordinato. Comunque, è un trucco accurato che proverò a ricordare.
KSab,

@KSab È ancora meglio. :) while j+1:può essere abbreviato in while-~j, a proposito.
terremoto,

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

Devi amare le liste infinite! Dato abbastanza tempo e memoria, questo programma alla fine calcolerà la risposta giusta per qualsiasi N e D (suppongo).

Sto generando le cifre di pi con l' gutilizzo di un algoritmo spigot (rubato spudoratamente da un ragazzo chiamato Stanley Rabinowitz), raggruppando le cifre / creando la sequenza usando ve generando un numero pirrazionale da questi usando m.

Eccolo in azione:

λ> 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
Ho pensato "Haskell!" quando ho visto la domanda, ho fatto scorrere verso il basso e ho sorriso.
Soham Chowdhury,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.