Einführung:
Der Sinus von x
ist gegeben durch die Formel:
sin(x) = x - x^3/3! + x^5/5! - x^7/7! + x^9/9! - x^11/11! // and more follows...
Der Cosinus von x
wird durch die Formel gegeben:
cos(x) = 1 - x^2/2! + x^4/4! - x^6/6! + x^8/8! - x^10/10! // and more follows...
Aufgabe:
Wenn der Wert von x
und gegeben ist n
, schreiben Sie ein Programm (keine Funktionen usw.), um den Wert der obigen Formel auszugeben sin(x)
und diese zu cos(x)
korrigieren n
. Angenommen, das x
ist im Bogenmaß.
Eingang:
x n
Eine Dezimalzahl x
(mit bis zu 3 Dezimalstellen) und eine Ganzzahl n
. Die Eingabe muss in stdin oder in einem Dialogfeld erfolgen (falls Ihre Sprache stdin nicht unterstützt).
Ausgabe:
[sin(x)]
[cos(x)]
Der Wert von beiden sin(x)
und cos(x)
sollte auf 6 Dezimalstellen gerundet werden. Wenn sin(x)
ist 0.5588558855
(10 Dezimalstellen), sollte es auf 0.558856
(6 Dezimalstellen) gerundet werden . Die Rundung muss auf den nächsten Wert erfolgen, wie in der fünften Spalte "Auf den nächsten Wert runden" der Tabelle in diesem Wiki-Artikel beschrieben .
Einschränkungen:
1 <= x <= 20
1 <= n <= 20
Proben:
----
5 3
10.208333
14.541667
----
8.555 13
0.765431
-0.641092
----
9.26 10
-3.154677
-8.404354
----
6.54 12
0.253986
0.967147
----
5 1
5.000000
1.000000
----
20 20
-5364.411846
-10898.499385
----
Anmerkungen:
- Standardlücken sind verboten.
- Eingebaute mathematische Funktionen und Operatoren für Trigonometrie (sin, cos, tan usw.), Fakultät und Exponentiation können nicht verwendet werden. Es steht Ihnen frei, eine integrierte Rundungsfunktion zur Schätzung des Rechenergebnisses
sin(x)
undcos(x)
der 6. Dezimalstelle zu verwenden. - Keine Notwendigkeit, mit falschen Eingaben umzugehen.
- Im Programm können nur ASCII-Zeichen verwendet werden, nicht die chinesischen Unicode-Zeichen, die die Codekomprimierung ermöglichen.
- Ihr Programm muss innerhalb von 3 Sekunden nach der Eingabe beendet werden und die Ausgabe anzeigen.
- Ihre Antwort muss zusammen mit der Erklärung des Codes dem Code ohne Golf beigefügt sein (obligatorisch, wenn der Code für Programmierer, die nicht mit Ihrer Sprache vertraut sind, insbesondere GolfScript, J usw., nicht sofort ersichtlich ist).
- Bitte fügen Sie einen Link zu einem Online-Compiler hinzu, auf dem Ihr Programm getestet werden kann.
Wertung:
Die Antwort mit der niedrigsten Codelänge in Zeichen, einschließlich Leerzeichen, Tabulatoren usw., gewinnt! Der Gewinner wird am 21. Mai 2014 bekannt gegeben.
EDIT : 21/05/14 Gewinner ist Aditsu mit CJam-Sprache . Der zweite Platz folgt jpjacobs mit der Sprache J und der zweite Platz ist primo mit der Sprache Perl . Herzlichen Glückwunsch an alle!
mod 2pi
Operation zu erfordern, um die Konvergenz der Eingaben zu beschleunigen, wäre ziemlich nützlich - es ist eine von vielen Verbesserungen, die die reale Welt beim Umgang mit diesen Funktionen verwendet. (eigentlich mod pi und zeichenbewusstsein).Antworten:
CJam - 42
Versuchen Sie es online unter http://cjam.aditsu.net
Erläuterung:
r
liest ein von dem Eingangstokend
umwandelt , um Doppelabtretungsempfängern:X
auf die Variable X;
den Wert von dem Stapel erscheint1
setzt 1 auf dem Stapel (die erste Term)_
dupliziert die 1r
liest das nächste Token (die n)i
konvertiert zu integer2*,1>{...}/
ist eine Art von Schleife von 1 bis 2 * n - 1:-
2*
multipliziert mit 2- erstellt
,
ein Array von 0 bis (letzter Wert) -1-
1>
entfernt das erste Element des Arrays (0)-
{...}/
führt den Block für jedes Element im Array aus und_
dupliziert die "Schleife" Variable "(nennen wir es k)2%2*(
konvertiert von gerade / ungerade zu -1/1:-
2%
ist Modulo 2 (-> 0/1)-
2*
multipliziert mit 2 (-> 0/2)-
(
Dekremente (-> -1/1)*
multiplizieren sich, wodurch das Vorzeichen jedes zweite Mal geändert wird , wenn/
der Term auf dem Stapel durch k oder -k geteilt wird; das ist das "/ k!" ein Teil der Berechnung zusammen mit dem VorzeichenwechselX*
multipliziert mit X; dies ist der "X ^ k" -Teil der Berechnung; wir erhalten die nächste Laufzeit in der Serie_
dupliziert der Ausdruck für die Berechnung des folgenden Term in der nächsten Iteration verwendet werden soll;
(nach der Schleife) erscheint der letzte duplizierten Begriff]
die Bedingungen auf den Stapel in einem Array sammeltAn diesem Punkt haben wir eine Reihe haben [ 1 X-X ^ 2/2! -X ^ 3/3! X ^ 4/4! X ^ 5/5! ...] genau alle Terme enthält, die wir für cos (x) und sin (x) benötigen, und verschachtelt
2/
dieses Array in Paarez
transponiert die Matrix, woraus sich das Array mit den Begriffen für cos (x) und das Array mit den Begriffen für sin (x) ergibt, da "Matrixzeilen"{...}/
den Block für jedes Arrayelement (Matrixzeile) erneut ausführt:-
:+
fügt die Elemente hinzu der Matrixreihe zusammen-
6mO
rundet auf 6 Dezimalstellen.An diesem Punkt haben wir das gewünschte cos (x) und sin (x) auf dem Stapel,
p
druckt die Darstellung des letzten Elements auf dem Stapel (sin (x)), gefolgt von einer neuen ZeileAt am ende des programms wird der restliche inhalt des stapels (cos (x)) automatisch ausgedruckt.
quelle
Perl - 72 Bytes
Oder zählen Sie die Befehlszeilenoptionen als jeweils 1 Byte in 70 Byte :
Oder, wenn Sie mir Perl 5.8 erlauben, in 63 Bytes :
aber warum würdest du?
Bearbeiten : Einhaltung der neuen Regeln.
%f
Runden auf 6 Stellen standardmäßig, wie bequem!Algorithmus
Untersuchen der Taylor-Reihe auf Sünde (x) :
Es ist ersichtlich, dass jeder Term jeden aufeinanderfolgenden Term gleichmäßig verteilt. Aus diesem Grund kann es mühelos in einen verschachtelten Ausdruck umgewandelt werden:
cos (x) transformiert ähnlich, ohne die führenden x- und Nenner-Terme eins kleiner.
Darüber hinaus kann dieser verschachtelte Ausdruck als umgekehrter rekursiver Ausdruck umformuliert werden:
mit s ∞ = 0 und sin (x) = x · s 1 , was letztendlich verwendet wird.
Ungolfed
Beispielnutzung
Wenn Sie dies online testen möchten, empfehle ich die Verwendung von compileonline.com . Kopieren-Einfügen Sie den Code in
main.pl
und die Eingabe in dieSTDIN
Box, dann Execute Script.quelle
Python 3 (102) / Python 2 (104)
Python 3 (102)
Python 2.7 (104)
Grundsätzlich der gleiche Code. Wir sparen zwei Charaktere, weil sie keine Parens brauchen
print
, verlieren aber vier von ihnenraw_input
.Probelauf
Sie können diese hier ausführen .
Code Erklärung
Die Hauptidee ist es,
2*n
Terme von zu berechnene^(ix)
und dann den imaginären und realen Teil zu nehmen, um diesin
undcos
Werte ann
Terme anzunähern. Wir verwenden die Kürzung der Taylor-Reihe:Dies ist ein Polynom in i * x, aber anstatt seinen Wert durch Summieren jedes Terms zu berechnen , verwenden wir eine modifizierte Horner-Methode , um die Sequenz zu berechnen (in umgekehrter Reihenfolge rekursiv definiert).
was
t_1
gleich den gewünschten Wert ergibt.Formatierungsoperationen für Python-Strings werden verwendet, um die Werte auf 6 Dezimalstellen aufgerundet anzuzeigen.
Bearbeiten: Wurde geändert, um nach neuen Regeln auf 6 Stellen zu runden. Es waren keine weiteren Änderungen erforderlich.
quelle
J
98 70 6958Obwohl dies wahrscheinlich mit ausgefalleneren Funktionen einiges gekürzt werden kann ... Kommentare sind willkommen:
hinweis 2: die eingabe endet mit dem empfang von eof (strg-d unter linux). Edit: beitreten Potenzierung und Fakultäts in eine schönere, J-ish Ganzen:
($ %&(*/) >:@i.@[ )
. Dies führt zu einer Reihe von x-Replikationen von y und einer Reihe von Zahlen von 1 bis y. Multiplizieren Sie jedes und teilen Sie das Ergebnis. Dadurch wird das Duplikat entfernt*/
.Dank algortihmshark sind noch 7 Charaktere übrig.
Eliminierter Schnitt, um die nachlaufende Newline loszuwerden.
Längere Version, für die das Wissen über Gabeln ein Muss ist.
Es gibt keinen Online-J-Interpreter, aber es ist seit einigen Jahren Open Source. Die Installation ist mit diesen Anweisungen einfach:
http://www.jsoftware.com/jwiki/System/Installation/J801
Auf #jsoftware auf irc.freenode.org gibt es auch einen J-Bot.
stdin funktioniert nur, wenn es von einer Datei aus über die Befehlszeile ausgeführt wird, andernfalls ersetzen Sie es
stdin ''
durch,'a b;'
wobei a und b die Zahlen sind, die in der Befehlszeile übergeben worden wären.quelle
exit
&
von entfernen0j6&":
, um ein Zeichen zu speichern. Auch(i.@(,&_2)@{:($%&(*/)>:@i.@[)"0{.)
kann neu geschrieben werden(($%&(*/)1+i.@[)"0~i.@,&_2)/
für eine andere 6.T.
(ungefähre Funktion nach n-Term Taylor-Reihe), aber ich denke, das ist als Standard-Regelungslücke verboten.Perl,
1201081048985Ungolfed:
Die erste Zeile liest die Eingabe und verwendet Regex, um ein Leerzeichen zu finden. Dadurch wird der Wert automatisch vor das Leerzeichen in "$" und der Wert danach in "$" gesetzt.
Jetzt schleifen wir von 1 bis
2*n-1
.$t
ist unser Begriff, den die Schleife wiederholt mitx
dem Index ($_
) der Schleife multipliziert und dividiert . Die Schleife beginnt bei 1 und nicht bei 0, da der Cosinus auf 1 initialisiert ist, wodurch ich mich nicht mit dem Teilen durch Null befassen musste.Nach der Aktualisierung
$t
gibt der Trinary-Operator entweder$sine
oder zurück$cosine
, je nachdem, ob der Index ungerade oder gerade ist, und fügt$t
den Wert hinzu . Die Zauberformel gibt an$_&2?-$t:$t
, ob dieser Wert addiert oder subtrahiert werden soll (im Grunde genommen mit einem bitweisen und auf dem Index und 2, um die sich wiederholende Folge von "addieren, addieren, subtrahieren, subtrahieren" zu erzeugen).Sie können diesen Code unter compileonline.com testen .
quelle
20 20
.1..$n*2-1
, anstatt1..$n
. Während ich hier bin ...$s
ist vollkommen in Ordnung, uninitialisiert zu lassen, wie in einem numerischen Kontextundef
ausgewertet wird0
. Ternary Zuordnung nicht Klammern nicht brauchen:$_&1?$s:$c+=$t
."%.8f\n%.8f"
kann auf verkürzt werden"%.8f\n"x2
, wenn eine abschließende Newline hinzugefügt wird.$t*(1-($_&2))
=>$_&2?-$t:$t
.Fortran:
8910912510210198 ByteIch missbrauche die implizite Typisierung, aber leider gibt es keinen solchen impliziten Komplextyp. Deshalb musste ich diesen & den Komplex angeben
i
.Gfortran schneidet die Ausgabe auf natürliche Weise mit 8 Dezimalstellen ab, daher halten wir diese Spezifikation gut ein.Leider entsprach meine ursprüngliche Ausgabemethodeprint*,t
nicht den Spezifikationen, sodass ich 16 Zeichen hinzufügen musste, um die imaginären und realen Komponenten auszugeben und die erforderlichen 8 Dezimalstellen einzugeben.Dank Ventero konnte ich 23 Bytes zwischen Ausgabe und Schleife einsparen. Und ein weiteres Zeichen, um korrekte Antworten und formatierte Ausgabe zu erhalten. Und 3 weitere zur
read
Aussage.Ungolfed,
quelle
C 120
Um ein Byte zu speichern, werden die Anweisungen, die den Sinuswert aktualisieren, in die Anweisung eingefügt
for()
, aber tatsächlich nach den Anweisungen ausgeführt, die auf die schließende Klammer folgen, die den Cosinuswert aktualisieren. (Ich denke, ich könnte auch ein paar Bytes mehr sparen, indem ich das letzte Newline-Zeichen in der Programmausgabe entferne.)Die globalen Variablen
s
,c
,r
undx
werden auf Null implizit initialisiert, undi
einen Wert von 1 haben , solange es keine Argumente auf der Kommandozeile zur Verfügung gestellt. Unglücklicherweiseprintf()
standardmäßig 6 Dezimalstellen verwendet, sodass das Ausgabeformat etwas ausführlich ist.Ungolfed:
Hier ist der Code mit einigen Änderungen, um die Reihenfolge zu vereinfachen:
Beispielausgabe:
Probieren Sie es online aus:
http://ideone.com/URZWwo
quelle
Python> = 2.7.3,
186184211200182170 ZeichenEin bisschen einfach wie die Hölle. Verwendet die Formel aus der für Sinus und Cosinus parametrisierten Frage.
Online-Dolmetscher finden Sie hier
HierHierBearbeiten: Gültige Version mit allen Einschränkungen
Edit2: Der Online-Interpreter wurde wegen ungültiger
round
Funktionsausgaben in Python 2.7.1 zu ideone.com geändertEdit3: Es stellte sich heraus, dass ich unnötiges Inline-Lambda + Rundung auf String-Format geändert habe (von xnor gestohlen :))
Edit4: Ersetzt
join
mit nicht funktionellenfor
Hauptschleifequelle
**
tun, nehme ich an). Also, ich denke, Sie müssen Ihre Antwort bearbeiten. Entschuldigung für die Unannehmlichkeiten. Bitte korrigieren Sie mich, wenn ich falsch liege.20 20
, ich bekomme eine Ausgabe-5364.4118142500001
. Möglicherweise möchten Sie es auf 8 Dezimalstellen korrigieren.2.7.1
. Wenn Sie es auf ideone.com (Python 2.7.3) ausführen, funktioniert es ordnungsgemäß. ideone.com/JsYNNKJavaScript - 114 Zeichen
Basierend auf der großartigen Antwort von James. Gleicher Algorithmus, erster Schritt vermieden mit Initialisierung von c = 1 und s = x. Die Verwendung von 2 Variablen anstelle eines Arrays für die Ausgabe vereinfacht die Schleife.
Ungolfed
quelle
s += (l *= x / ++d)
und nichts += (l* = x / ++d)
in den Code ungolfed.JavaScript (ECMAScript 6 Draft) -
9796 ZeichenEine rekursive Lösung:
Ausgabe:
quelle
no functions
Anforderungen.C 114
Unzureichende Reputation zum Kommentieren, aber zusätzlich zu der C- Antwort von Squeamish Offisrage , 7-Byte-Reduktion durch Verwendung von float zum Verdoppeln und Entfernen von Leerzeichen und Kombinieren von Deklaration und Init von 'r' ergibt
versuche es hier .
quelle
r
in der Deklaration bemerkt . Ich habe nicht getestet, obfloat
die erforderliche Präzision gegeben ist.float
würde die erforderliche Präzision geben, aber es funktioniert :) Und willkommen bei PPCG, user2702245!float
variables then? Forx=5
andn=3
, I getsin(x)=10.20833206
andcos(x)=14.54166412
:-( (Intel Core Duo, in case you were wondering)GNU bc, driven by bash, 128 bytes
Far too many bytes spent setting decimal places and to-nearest rounding. Oh well, here it is anyway:
Output:
Linux command-line tools, 97 unicode characters
Unicode hack answer removed at OP's request. Look at the edit history if you interested.
quelle
Ruby, 336
Probably the longest one here, but I'm sure it could be made shorter :(
quelle
JavaScript (ES6) - 185 chars
Uses a function
q
for factorial,i
for exponentiation, andp
for performing bothsin
andcos
. Run at jsbin.com. Uses exactly the formula without any modification.EDIT: Changed
8
decimal places to6
decimal places. 15/May/14Ungolfed Code:
quelle
JavaScript - 133 chars
Ungolfed
quelle
Mathematica, 96 chars
quelle
x,n
to me ?x n
.Ruby -
160152140 CharsUsing recursion and the fact that for this recursive implementation sin(x, 2n + 1) = 1 + cos(x, 2n - 1), being sin(x, n) and cos(x, n) the series defined above for cos x and sin x.
Edit: Contributed by commenters (read below).
quelle
p=->x,n{...}
,f=->n{...}
and so on, and then use square brackets instead of parentheses to call them, likep[x,n-1]
. Also, I thinkcollect
is just an alias formap
, which is much shorter, and since you're only mapping a member call, you can shorten that togets.split.map &:to_f
.