Betrachten Sie drei Zahlenfolgen A
, B
und C
:
A
: Eine auf wiederkehrenden Beziehungen basierende Sequenzf(n) = f(n-1)+f(n-2)
, beginnend mitf(1) = 3, f(2) = 4
. Die Sequenz beginnt also so:3 4 7 11 18 29 47 76 ...
B
: Die zusammengesetzten Zahlen , dh alle Ganzzahlen, die keine Primzahlen (oder 1) sind:4 6 8 9 10 12 14 15 16 ...
C
: Die Ziffern von Pi:3 1 4 1 5 9 2 6 5 ...
Bei einer positiven Ganzzahl N < 50
, entweder als Funktionsargument oder als STDIN, wird der Dezimalwert des Bruchs A(N)/B(N)
mit C(N)
Nachkommastellen zurückgegeben. Es gelten die normalen Rundungsregeln (aufrunden, wenn die N + 1-te Ziffer 5 oder höher ist). Wenn die n-te Ziffer pi
Null ist, sollte eine Ganzzahl gedruckt werden. Wissenschaftliche Notation / Das Standardformular wird für Zahlen über 1000 akzeptiert.
Dies ist Codegolf, daher gewinnt die kürzeste Antwort in Bytes.
Einige Beispiele:
N = 1: 0.750
N = 2: 0.7
N = 3: 0.8750
N = 4: 1.2
N = 6: 2.416666667
N = 10: 11.056
N = 20: 764.8750
Natürlich gelten die Standard-Code-Golfregeln.
Die Funktion muss auf jedem modernen Laptop in weniger als zwei Minuten beendet sein.
C(n)
Ziffern sagen , müssen wir nachfolgende Nullen einschließen?N
? Wenn ja, bis zu N = 49. Oder etwas anderes?Antworten:
Pyth,
605758 BytesKabelbaum testen
Es ist ganz einfach: Berechnen Sie pi, die Fibonacci-Reihe und die Komposite, gerundet auf C (n) -Ziffern, auf C (n) -Ziffern auffüllen und die Position der Dezimalstellen, fertig.
Ein):
hu,eGsGQjT7
B (n):
e.ftPZQ)
C (n):
e/u+/*GHhyHy^TQr99ZZT
60 -> 57: Der Sonderfall n = 1 in der pi-Berechnung wurde bereinigt.
57 -> 58: Es wurde nicht genügend Präzision für pi für den gesamten Eingabebereich verwendet - 99 Iterationen wurden auf 1000 Iterationen erhöht.
Hinweis zum Runden: Dies verwendet Pythons "Nearest Even" -Rundungssystem und nicht das vom OP festgelegte "Into Infinity" -System. Der Unterschied ist jedoch nur dann von Bedeutung, wenn die unmittelbar auf den Rundungspunkt folgenden Stellen
5000...
z. B. 1,25 auf 1 Stelle gerundet sind. Ich habe den Eingabebereich überprüft, und dies geschieht nie, sodass immer das richtige Ergebnis zurückgegeben wird.quelle
PowerShell,
420 Bytes (JJJJJJJ)378 BytesDanke an isaacg für das Speichern von 41 Bytes, für die Berechnung, wie die Frage rundet. Bedeutet, dass ich das Schreckliche nicht mit einbeziehen musste
[MidpointRounding]::AwayFromZero
und nicht explizit als[double]
.Dieser hat großen Spaß gemacht!
Erweitert:
Die Rekursion in PowerShell ist ... langsam, sagen wir mal, also müssen wir
A(N)
die andere Richtung bauen und sie in einem Array speichern und dann indizieren.ALT
Auch, heilige Kuh, haben die Ausgabeanforderungen dies zunichte gemacht. PowerShell rundet standardmäßig auf die nächste a / k / a-Banker-Rundung, was die Verwendung der außerordentlich ausführlichen
[MidpointRounding]::AwayFromZero
Angaben zum Wechseln der Rundungsstile erforderlich macht . Darüber hinaus müssen wir gegebenenfalls nachfolgende Nullen auffüllen. Diese beiden Anforderungen haben zusammengenommen die letzten Zeilen von 20 Bytes[math]::Round($r,$q)
auf 102 Bytes (von$s=""
bis+$s)
) geändert ... wow.quelle
[MidpointRounding]::AwayFromZero
allein ist fast zu gut / schlecht, um wahr zu sein ... =)Javascript (ES6), 302 Bytes
Ein Wort: Unvollendet.
Die ersten 49 Stellen von pi werden in einer Zeichenfolge gespeichert, und die anderen beiden Sequenzen werden automatisch generiert. Dies wurde etwa auf halber Strecke golfen; Ich bin (fast) sicher, dass ich weitere 50 Bytes herausholen könnte.
Funktioniert für alle Testfälle und sollte für den Rest funktionieren. Abstürze bei mehr als 49 oder weniger als 0 (diese Situationen sollten sowieso nie auftreten). Besonders gut gefällt mir das Ergebnis für 0:
quelle
Oktave,
276236 BytesZunächst dachte ich, es wäre cool, in diesen mathematischen Werkzeugen eine unbegrenzte Genauigkeit zu verwenden (und etwas Wissen darüber aufzufrischen), also fing ich an, einige Algorithmen zu schreiben, und fand schließlich heraus, dass der
pi
Wert nicht so genau ist, wie ich muss das Array erneut verwenden. Also wieder kein großer Erfolg:Immer noch gut lesbar, nicht wahr?
Verwendung
Kopieren-Einfügen-Funktion in Oktave, Funktion
c
mit Argument des gewünschten Wertes aufrufen :Optimierungen:
endif
,endfor
und ähnlich mitend
denen die gleiche Weise funktionierti
um eins verringern , ein Byte speichernnum2str(str2num(p(A)))
Unsinn entfernen :)quelle
end
nichtendif
so viele gespeicherte Bytes. Wenn Sie auch zufällig über die symbolische Toolbox für MATLAB verfügen, können Sie mitvpa
pi: genügend Dezimalstellen abrufenvpa(sym(pi),49)
. Ich habe es bei diesem Laptop nicht, also bin ich mir nicht sicher, ob dassym
dort notwendig ist, sollte aber trotzdem einige Bytes einsparen =) Und lesbar ist nicht unbedingt eine gute Sache im Code Golf =)while
vonendwhile
und Ähnliches funktioniert gut, also aktualisiere ich die Antwort mit ein paar weniger Zeichen :)