Pirrationale Zahlen

14

Pi ist eine irrationale Zahl , was bedeutet, dass ihre Dezimaldarstellung niemals endet oder sich wiederholt.

Pi abgeschnitten auf 41 Dezimalstellen (40 Stellen) ist 3.1415926535897932384626433832795028841971.

Wenn wir den Dezimalpunkt ignorieren und die Ziffern als eine Folge positiver Ganzzahlen auflisten , wobei Duplikate vermieden werden , erhalten wir 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 ).
(Hinweis, 15der in der Sequenz anstelle von " 1 5weil" angezeigt wird, ist 1bereits aufgetreten.
Beachten Sie auch, dass dieser Hinweis 0nicht auftritt, da er nicht positiv 950ist und die erste Null enthält.)

Um die erste pirrationale Zahl zu konstruieren, verwenden wir diese Sequenz, um die Ziffern von Pi zu indizieren (die erste Ziffer ist 3, die zweite 1 usw.).

Die erste Ziffer der ersten pirrationalen Zahl ist also die dritte Ziffer von Pi,
die zweite Ziffer ist die erste Ziffer von Pi,
die dritte Ziffer ist die vierte Ziffer von Pi,
die vierte ist die 15. Ziffer von Pi
und so weiter.
Nach der ersten Ziffer wird ein Dezimalpunkt hinzugefügt, um Pi nachzuahmen.

Somit ist die erste Irritationszahl auf 41 Stellen 4.3195195867462520687356193644029372991880.
(Beachten Sie, dass ich für die 30. Ziffer bis zur 974. Ziffer von Pi gehen musste.)

Um die zweite Pirrationszahl zu konstruieren, wird der Vorgang unter Verwendung der ersten Pirrationszahl anstelle von Pi wiederholt. (Pi selbst kann als nullte Pirrationszahl bezeichnet werden.) Die neue Sequenz lautet also 4 3 1 9 5 19 58 ...und die erste Pirrationszahl wird indiziert, um die zweite zu erzeugen, die beginnt 9.14858....

Weitere pirrationale Zahlen werden auf die gleiche Weise erzeugt, wobei jede aus der vorherigen generiert wird.

Herausforderung

Ihre Aufgabe ist es das kürzeste Programm möglich zu schreiben , die in zwei ganzen Zahlen nehmen, Nund D, und gibt die Nth pirrational Zahl gekürzt auf DDezimalstellen.

Dist immer positiv, aber Nnicht negativ, und die DZiffern von Pi sollten ausgegeben werden, wenn N0 ist.
Wenn D1 ist, spielt es keine Rolle, ob der Dezimalpunkt vorhanden ist oder nicht.

Die Eingabe sollte von stdin oder der Befehlszeile kommen, und die Ausgabe sollte zu stdout (oder den nächstgelegenen Alternativen Ihrer Sprache) gehen.

Ihr Programm sollte für alle Eingabewerte von Nund Dunter 2 16 funktionieren , es muss jedoch nicht rechtzeitig oder effizient sein.

Der kürzeste Code in Bytes gewinnt.

(Beachten Sie, dass pirrationale Zahlen in anderen Basen existieren, aber alles in dieser Herausforderung in Basis 10 erledigt wird.)

Calvins Hobbys
quelle
Können wir eingebaute Darstellungen von Pi mit willkürlicher Genauigkeit verwenden, um seine Ziffern zu erhalten?
Martin Ender
1
@ MartinBüttner Klar. Sie können sogar Pi-Ziffern online abrufen, wenn Sie möchten, solange Sie nur Pi-Ziffern abrufen.
Calvins Hobbys
@ Calvin'sHobbies: Ah schön, also kann ich nur die ersten 64ki-Stellen von pi in einer Datei haben? Sollte ich +1 für den Dateinamen hinzufügen?
Claudiu
Ist dieser Eingabebereich korrekt? Für N=1, D=13393zum Beispiel, würden Sie die 31000000. Stelle der PI benötigen
Claudiu
Die ersten 1 Milliarde Stellen von pi erhalten Sie nur 42.598 Stellen der ersten irrationalen Zahl
Claudiu

Antworten:

3

Python 292 Bytes

Ziemlich ineffizient, ich konnte nur ein paar Ziffern von N = 3 und keine von N = 4 erhalten.

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

Beispieleingabe:

0,20
3.1415926535897932384

1,20
4.3195195867462520687

2,10
9.148583196

3,5
9.9815
KSab
quelle
Golf: Wechseln Sie =="0"zu <"1". Machen Sie die innere while-Schleife eine Zeile. Leerzeichen entfernen x += 1. if l not in h-> if(l in h)<1: N==0->N<1
isaacg
@isaacg Danke für die, ich war ein bisschen in Eile, als ich einige offensichtliche Dinge gepostet und verpasst habe. Ich hätte wahrscheinlich nicht bemerkt, dass Sie den Saitenvergleich durchführen können, und das if(l in h)<1ist auch ziemlich clever.
KSab
Noch etwas: Initialisieren sals Parameter von P( def P(N,D,s=''):). str(...)kann wahrscheinlich mit Backticks geschrieben werden. while'1'>...spart Platz. Machen Sie heinen Satz und initialisieren mit h=l,={''}, dann schreiben l in hals {l}<h.
Flornquake
@flornquake Das ist ziemlich clever, vor allem, wie Sie es initialisieren, damit Python es nicht für ein Diktat hält. Als ich dies einfügte, bemerkte ich eine ziemlich große Optimierung, die leider hbestellt werden musste. Trotzdem, das ist ein guter Trick, an den ich mich erinnern werde.
KSab
@KSab Das ist noch besser. :) while j+1:kann while-~jübrigens auf gekürzt werden.
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

Muss unendlich viele Listen lieben! Wenn genügend Zeit und Speicher vorhanden sind, berechnet dieses Programm eventuell die richtige Antwort für N und D (nehme ich an).

Ich generiere die Ziffern von pi mit geinem Zapfenalgorithmus (der einem Typen namens Stanley Rabinowitz schamlos gestohlen wurde), gruppiere die Ziffern / erstelle die Sequenz mit vund erstelle daraus eine pirrationale Zahlm .

Hier ist es in Aktion:

λ> 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"
Flonk
quelle
1
Ich dachte "Haskell!" Als ich die Frage sah, scrollte ich nach unten und lächelte.
Soham Chowdhury