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, 15
der in der Sequenz anstelle von " 1 5
weil" angezeigt wird, ist 1
bereits aufgetreten.
Beachten Sie auch, dass dieser Hinweis 0
nicht auftritt, da er nicht positiv 950
ist 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, N
und D
, und gibt die N
th pirrational Zahl gekürzt auf D
Dezimalstellen.
D
ist immer positiv, aber N
nicht negativ, und die D
Ziffern von Pi sollten ausgegeben werden, wenn N
0 ist.
Wenn D
1 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 N
und D
unter 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.)
N=1
,D=13393
zum Beispiel, würden Sie die 31000000. Stelle der PI benötigenAntworten:
Python 292 Bytes
Ziemlich ineffizient, ich konnte nur ein paar Ziffern von N = 3 und keine von N = 4 erhalten.
Beispieleingabe:
quelle
=="0"
zu<"1"
. Machen Sie die innere while-Schleife eine Zeile. Leerzeichen entfernenx += 1
.if l not in h
->if(l in h)<1:
N==0
->N<1
if(l in h)<1
ist auch ziemlich clever.s
als Parameter vonP
(def P(N,D,s=''):
).str(...)
kann wahrscheinlich mit Backticks geschrieben werden.while'1'>...
spart Platz. Machen Sieh
einen Satz und initialisieren mith=l,={''}
, dann schreibenl in h
als{l}<h
.h
bestellt werden musste. Trotzdem, das ist ein guter Trick, an den ich mich erinnern werde.while j+1:
kannwhile-~j
übrigens auf gekürzt werden.Haskell,
431400369Muss 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
g
einem Zapfenalgorithmus (der einem Typen namens Stanley Rabinowitz schamlos gestohlen wurde), gruppiere die Ziffern / erstelle die Sequenz mitv
und erstelle daraus eine pirrationale Zahlm
.Hier ist es in Aktion:
quelle