Einführung
tl; dr
Kontinuierliche Ausgabe der aktuellen Entfernung von der Erde zur Sonne.
Vereinfacht ausgedrückt ist die Erdumlaufbahn um die Sonne eine Ellipse. Der tatsächliche Abstand zwischen beiden ändert sich also ständig. Diese Distanz kann für einen bestimmten Tag nach folgender Formel berechnet werden :
Die Gleichung kann in die folgenden Teile 2 aufgeteilt werden :
1
entspricht 1 AE (astronomische Einheit)149,597,870.691 km
0.01672
ist die Exzentrizität der Umlaufbahn zwischen Erde und Sonnecos
ist natürlich die Kosinusfunktion, aber mit Argumenten in Grad und nicht im Bogenmaß0.9856
beträgt 360 ° / 365,256363 Tage , eine volle Umdrehung in einem Jahr, wobei365.256363
die Länge eines Sternjahres in mittleren Sonnentagen istday
ist der Tag des Jahres[1-365]
4
stellt den Versatz zum Perihel dar , der zwischen dem 4. und 6. Januar liegt
Die Formel dauert einen ganzen Tag, aber für diese Herausforderung - eine kontinuierliche Ausgabe - müssen Sie genauer sein; oder bis zum nächsten Tag wird nicht viel passieren. Fügen Sie einfach den Prozentsatz der vergangenen Zeit zum aktuellen Tag hinzu, z. B. 1 :
day + (h * 3600 + m * 60 + s) / 864 / 100
Einige Beispiele:
- 1. Januar, 23:59:59
1.99998842592593
- 1. Januar, 18:00:00 Uhr
1.75
- 1. Januar, 12:00:00
1.50
- 1. Januar, 06:00:00
1.25
Eingang
Diese Herausforderung hat keine Eingabe.
Wenn Ihre Sprache die aktuelle Zeit nicht abrufen kann, können Sie sie als Eingabe für Ihr Programm verwenden. Gültige Eingaben sind Zeitstempel oder vollständige Datums- / Uhrzeitzeichenfolgen , die der Sprache am besten entsprechen. Das Übergeben des aktuellen Tages allein (wie am 5
5. Januar oder 5.25
am selben Tag um 6 Uhr) ist nicht erlaubt.
Ausgabe
Geben Sie die aktuelle Entfernung von der Erde zur Sonne aus:
- Den Wert in ausgeben
km
. - Aktualisieren Sie den Wert mindestens jede Sekunde .
Beispielausgabe:
152098342
Wenn es Ihre Byteanzahl nicht erhöht, können Sie das Ergebnis auch hübsch ausdrucken:
152,098,342
152,098,342 km
Bedarf
- Sie können ein Programm oder eine Funktion schreiben. Wenn es sich um eine anonyme Funktion handelt, geben Sie bitte ein Beispiel für den Aufruf an.
- Dies ist Code-Golf, also gewinnt die kürzeste Antwort in Bytes.
- Standardlücken sind nicht zulässig.
Beispielimplementierung
Ich habe eine Beispielimplementierung in JavaScript vorbereitet. Es ist weder wettbewerbsfähig noch golfen.
// dayOfYear from http://stackoverflow.com/a/8620357/1456376
Date.prototype.dayOfYear = function() {
var j1= new Date(this);
j1.setMonth(0, 0);
return Math.round((this-j1)/8.64e7);
}
// vars
var e = document.getElementById('view'),
au = 149597870.691,
deg2rad = Math.PI/180,
date = now = value = null;
// actual logic
function calculate() {
date = new Date();
now = date.dayOfYear() + (date.getHours() * 3600 + date.getMinutes() * 60 + date.getSeconds()) / 864 / 100;
value = 1 - 0.01672 * Math.cos(deg2rad * 0.9856 * (now - 4));
// supported in Firefox and Chrome, unfortunately not in Safari
e.innerHTML = Math.round(value * au).toLocaleString('en-US') + ' km';
setTimeout(calculate, 1000);
}
// let's do this
calculate();
<div id="view"></div>
1 Um die Komplexität nicht unangemessen zu erhöhen, müssen Sie Ihre Ortszeit nicht in UTC umrechnen. Wenn Sie UTC verwenden, fügen Sie Ihrer Antwort eine Notiz hinzu.
2 Weitere Informationen finden Sie unter " Erde-Sonne-Abstand an einem bestimmten Tag des Jahres " bei Physik
Math.cos
Radiant verwendet. Und da diese Formel sehr ungefähr zu sein scheint , müssen Sie sich darüber im Klaren sein, wie die Antworten überprüft werden sollen.Antworten:
TI-BASIC, 38 Bytes
Für einen Taschenrechner der Serie TI-84 +. Nennen Sie das
prgmA
. Beachten Sie, dass der Stapel nach einigen tausend Iterationen überläuft. Verwenden SieWhile 1:...:End
stattdessen ein, wenn dies ein Problem ist, für zwei zusätzliche Bytes.Dies verwendet das Perihel am 1. Januar 1997, 23:16 UTC als Referenz und ist in den nächsten Jahren auf einige Dutzend Kilometer genau (ungefähr 7 Stellen Genauigkeit).
quelle
Java -
185180 BytesDies nutzt die Tatsache, dass ein Tag 86.400 Sekunden hat und die Ortszeit verwendet, nicht GMT. Die Ausgabe erfolgt viel häufiger als einmal pro Sekunde. Nicht sicher, ob Importanweisungen in die Byteanzahl einbezogen werden sollen.
Um eine Verzögerung von 1 Sekunde einzuschließen, werden etwa 26 Bytes hinzugefügt, z
Java ist definitiv nicht die golferischste Sprache. :)
Einige Bytes dank @insertusernamehere entfernt
quelle
1.0
werden1
? Und können Sie die Führung0
von0.01672
und entfernen0.9856
?import static
aber das könnte "schummeln" ... ich bin hier immer noch ziemlich neu.System.err
also keine Pufferung. Ich weiß, dass dasprintln
sowieso sofort gedruckt werden soll, aber das scheint nicht immer so zu sein. Natürlich könnte es zu System.out konvertiert werden, ohne die Byteanzahl zu ändern :)Python, 101 Bytes
345600 = 4 * 24 * 3600 (vier Tage)
5022635.53 ≌ (365.256363 * 24 * 3600) / (2π) (Sekunden im Jahr / 2π)
quelle
import
s: kombinierenimport time,math
. Wenn Sie Python 2 verwenden, können Sie auch die Klammer von entfernenprint
.Bash / Coreutils / BC, 101 Bytes
Dies berechnet den Versatz vom 4. Januar in Sekunden und verwendet eine entsprechende Konstante, um in Bogenmaß umzurechnen. Ein halbes Jahr rechnet sich in ungefähr pi um:
Der Rest der Berechnung ergibt sich direkt aus der Frage.
quelle
bc
dies nützlich sein könnte. Mir ist aufgefallen, dass dudc
in deinem Header aberbc
im Code verwendest. Ich verwechsle die beiden oft selbst.F #, 178 Bytes
Dies ist ein F # -Skript, das in F # Interactive gut ausgeführt wird. Der Einfachheit halber wird die Anforderung der "kontinuierlichen Ausgabe" auf ein wörtliches Niveau gebracht, obwohl ich bei jeder Iteration ein Byte verloren habe, um die Ausgabe in einer neuen Zeile zu drucken, damit sie nicht zu schlecht ist. = P
Ungolfed und erklärte:
quelle
Mathematica, 97 Bytes
Erläuterung
{DateValue@"Year",1,5}
stellt den 5. Januar dieses Jahres dar und...~DateDifference~...
gibt die zeitliche Distanz an.Dynamic[...,UpdateInterval->1]
Aktualisieren Sie den Ausdruck einmal pro Sekunde.quelle
Dynamic[Round[PlanetData["Earth", "DistanceFromSun"]~QuantityMagnitude~"Kilometers"]]
Pyth, 51 Bytes
Alternative Formel
d / AU = 1 - 0,01672 cos (2π [Zeit seit Perihel] / [Umlaufzeit])
Diese Formel entspricht im Wesentlichen der OP-Formel, mit der Ausnahme, dass verallgemeinert wird, dass jedes Perihel als Bezugsdatum verwendet werden kann.
Die OP-Formel hat [Zeit seit Perihel] als (Tag - 4) und (2π rad / [Umlaufzeit]) als 0,9856 Grad / Tag vorberechnet.
In meiner Lösung verwende ich das Perihel am nächsten an die Unix - Epoche, 2 nd Januar 1970.
Der Code
Handkompilierter pythonischer Pseudocode:
Dies ist im Wesentlichen nur das
Umwandeln der folgenden Formel in Code: d = (1 - 0,01672 cos (2π (t - 86400) / 31558149)) * 149597870.691
wobei t die Unix-Zeit ist.
quelle
Python 2.4 - 158 Bytes
Nimmt die Ortszeit und spuckt die Entfernung aus. time.localtime () gibt ein Tupel zurück und kann hier referenziert werden .
quelle
.0
aus864.0
und100.0
ein paar Bytes speichern?.0
also würden sie Gleitkomma und nicht Ganzzahl sein.C 338
quelle