introduction
tl; dr
Émet en continu la distance actuelle de la Terre au Soleil.
Simplifiée, l'orbite de la Terre autour du Soleil est une ellipse. La distance réelle entre les deux est donc en constante évolution. Cette distance peut être calculée pour un jour donné en utilisant cette formule :
L'équation peut être divisée en les parties suivantes 2 :
1
représente 1 UA (unité astronomique), est égal à149,597,870.691 km
0.01672
est l' excentricité orbitale entre la Terre et le Soleilcos
est bien sûr la fonction cosinus, mais avec un argument en degrés plutôt qu'en radians0.9856
est de 360 ° / 365.256363 jours , une rotation complète en un an, où365.256363
est la longueur d'une année sidérale, en jours solaires moyensday
est le jour de l'année[1-365]
4
représente le décalage par rapport au périhélie , qui se situe entre le 4 et le 6 janvier
La formule prend une journée entière, mais pour ce défi - une sortie continue - vous devez être plus précis; ou il ne se passera pas grand-chose jusqu'au lendemain. Ajoutez simplement le pourcentage du temps passé au jour actuel, comme 1 :
day + (h * 3600 + m * 60 + s) / 864 / 100
Quelques exemples:
- 1 janvier, 23:59:59
1.99998842592593
- 1 janvier, 18:00:00
1.75
- 1 janvier, 12:00:00
1.50
- 1 janvier, 06:00:00
1.25
Contribution
Ce défi n'a aucune entrée.
Si votre langue ne peut pas obtenir l'heure actuelle, vous pouvez l'obtenir comme entrée dans votre programme. Les entrées valides sont des horodatages ou des chaînes de date-heure complètes qui conviennent le mieux à la langue. Passer seul le jour en cours (comme 5
pour le 5 janvier ou 5.25
pour le même jour à 6 heures) n'est pas autorisé.
Production
Sortie de la distance actuelle de la Terre au Soleil:
- Sortez la valeur en
km
. - Mettez à jour la valeur au moins toutes les secondes .
Exemple de sortie:
152098342
Si cela n'augmente pas votre nombre d'octets, vous pouvez également imprimer le résultat:
152,098,342
152,098,342 km
Exigences
- Vous pouvez écrire un programme ou une fonction. S'il s'agit d'une fonction anonyme, veuillez inclure un exemple de la façon de l'invoquer.
- C'est le code-golf, donc la réponse la plus courte en octets gagne.
- Les failles standard ne sont pas autorisées.
Exemple d'implémentation
J'ai préparé un exemple d'implémentation en JavaScript. Ce n'est ni compétitif ni golfé.
// 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 Pour ne pas augmenter déraisonnablement la complexité, vous n'avez pas besoin de convertir votre heure locale en UTC. Si vous utilisez UTC, veuillez ajouter une note à votre réponse.
2 Pour plus de détails, voir " Distance Terre-Soleil un jour donné de l'année " sur Physics
Math.cos
utilise des radians. Et puisque cette formule semble très approximative, vous devrez être clair sur la façon dont les réponses doivent être vérifiées.Réponses:
TI-BASIC, 38 octets
Pour une calculatrice de la série TI-84 +. Nommez ceci
prgmA
. Notez que cela déborde de la pile après quelques milliers d'itérations; utilisez un à laWhile 1:...:End
place si c'est un problème, pour deux octets supplémentaires.Celui-ci utilise le périhélie le 1er janvier 1997, 23:16 UTC pour référence, et est précis à quelques dizaines de kilomètres (environ 7 chiffres de précision) pour les prochaines années.
la source
Java -
185180octetsCela utilise le fait qu'il y a 86 400 secondes dans une journée et utilise l'heure locale, pas GMT. La sortie se produit beaucoup plus d'une fois par seconde. Je ne sais pas si les instructions d'importation doivent être incluses dans le nombre d'octets.
Pour inclure un délai de 1 seconde ajoute environ 26 octets, par exemple
Java n'est certainement pas le langage le plus jouable au golf. :)
Suppression de quelques octets grâce à @insertusernamehere
la source
1.0
devenir1
? Et pouvez-vous supprimer le début0
de0.01672
et0.9856
?import static
mais cela pourrait "tricher" ... Je suis encore assez nouveau ici.System.err
donc il n'y aurait pas de mise en mémoire tampon. Je sais que leprintln
est censé imprimer immédiatement de toute façon, mais cela ne semble pas toujours le faire. Bien sûr, il pourrait être converti en System.out sans changer le nombre d'octets :)Python, 101 octets
345600 = 4 * 24 * 3600 (quatre jours)
5022635.53 ≌ (365.256363 * 24 * 3600) / (2π) (secondes dans l'année / 2π)
la source
import
s:import time,math
. De plus, si vous utilisez Python 2, vous pouvez supprimer la parenthèse deprint
.Bash / coreutils / bc, 101 octets
Ceci calcule le décalage par rapport au 4 janvier en secondes, utilise donc une constante correspondante pour convertir en radians. Une demi-année se transforme en environ pi:
Le reste du calcul découle directement de la question.
la source
bc
pouvait être utile. J'ai remarqué que vous en avezdc
dans votre en-tête, mais utilisez-lebc
dans le code. Je confond souvent les deux moi-même.F #, 178 octets
Il s'agit d'un script F # qui fonctionne bien dans F # Interactive. Par souci de simplicité, l'exigence de "sortie continue" est portée à des niveaux littéraux, bien que j'ai perdu un octet pour faire imprimer la sortie sur une nouvelle ligne à chaque itération afin que ce ne soit pas trop mal. = P
Non golfé et expliqué:
la source
Mathematica, 97 octets
Explication
{DateValue@"Year",1,5}
représente le 5 janvier de cette année et...~DateDifference~...
donne la distance temporelle.Dynamic[...,UpdateInterval->1]
mettre à jour l'expression une fois par seconde.la source
Dynamic[Round[PlanetData["Earth", "DistanceFromSun"]~QuantityMagnitude~"Kilometers"]]
Pyth, 51 octets
Formule alternative
d / AU = 1 - 0,01672 cos (2π [temps depuis le périhélie] / [période orbitale])
Cette formule est essentiellement la même que la formule du PO, sauf qu'elle est généralisée pour pouvoir utiliser n'importe quel périhélie comme date de référence.
La formule de l'OP a [temps depuis le périhélie] comme (jour - 4) et a (2π rad / [période orbitale]) pré-calculée à 0,9856deg / jour.
Dans ma solution , je suis en utilisant le périhélie le plus proche de l'époque Unix, 2 e Janvier 1970.
Le code
Compilé à la main en pseudocode pythonique:
Il s'agit essentiellement de transformer la formule suivante en code:
d = (1 - 0,01672 cos (2π (t - 86400) / 31558149)) * 149597870.691
où t est le temps Unix.
la source
Python 2.4 - 158 octets
Prend l'heure locale et crache la distance. time.localtime () renvoie un tuple et peut être référencé ici .
la source
.0
de864.0
et100.0
pour sauver quelques octets?.0
afin qu'ils soient en virgule flottante et non en entier.C, 338
la source