Introducción
tl; dr
Salida continua de la distancia actual de la Tierra al Sol.
Simplificado, la órbita de la Tierra alrededor del Sol es una elipse. Entonces, la distancia real entre ambos está cambiando constantemente. Esta distancia se puede calcular para cualquier día usando esta fórmula :
La ecuación se puede dividir en las siguientes partes 2 :
1
representa 1 UA (unidad astronómica), igual149,597,870.691 km
0.01672
es la excentricidad orbital entre la Tierra y el Solcos
es, por supuesto, la función coseno, pero con argumentos en grados en lugar de radianes0.9856
es 360 ° / 365.256363 días , una rotación completa en un año, donde365.256363
es la duración de un año sideral, en días solares mediosday
es el dia del año[1-365]
4
representa el desplazamiento del perihelio , que es entre el 4 y el 6 de enero
La fórmula lleva todo un día, pero para este desafío, una salida continua, debe ser más preciso; o no pasará mucho hasta el día siguiente. Simplemente agregue el porcentaje del tiempo pasado al día actual, como 1 :
day + (h * 3600 + m * 60 + s) / 864 / 100
Algunos ejemplos:
- 1 de enero, 23:59:59
1.99998842592593
- 1 de enero, 18:00:00
1.75
- 1 de enero, 12:00:00
1.50
- 1 de enero, 06:00:00
1.25
Entrada
Este desafío no tiene aportes.
Si su idioma no puede obtener la hora actual, puede obtenerla como entrada para su programa. Las entradas válidas son marcas de tiempo o cadenas completas de fecha y hora que se adaptan mejor al idioma. No está permitido pasar el día actual solo (como el 5
5 de enero o 5.25
el mismo día a las 6 en punto).
Salida
Salida de la distancia actual de la Tierra al Sol:
- Salida del valor en
km
. - Actualice el valor al menos cada segundo .
Salida de ejemplo:
152098342
Si no aumenta su número de bytes, también puede imprimir bastante el resultado:
152,098,342
152,098,342 km
Requisitos
- Puedes escribir un programa o una función. Si es una función anónima, incluya un ejemplo de cómo invocarla.
- Este es el código de golf, por lo que la respuesta más corta en bytes gana.
- Las lagunas estándar no están permitidas.
Implementación de ejemplo
He preparado un ejemplo de implementación en JavaScript. No es competitivo ni golfista.
// 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 Para no aumentar injustificadamente la complejidad, no tiene que convertir su hora local a UTC. Si usa UTC, agregue una nota a su respuesta.
2 Para más detalles, consulte " Distancia entre la Tierra y el Sol en un día determinado del año " en Física
Math.cos
usa radianes. Y dado que esta fórmula parece muy aproximada, tendrá que tener claro cómo deben verificarse las respuestas.Respuestas:
TI-BASIC, 38 bytes
Para una calculadora de la serie TI-84 +. Nombra esto
prgmA
. Tenga en cuenta que esto desborda la pila después de unos pocos miles de iteraciones; use unWhile 1:...:End
en su lugar si esto es un problema, para dos bytes adicionales.Utiliza el perihelio el 1 de enero de 1997 a las 23:16 UTC como referencia, y tiene una precisión de unas pocas docenas de kilómetros (aproximadamente 7 dígitos de precisión) para los próximos años.
fuente
Java -
185180 bytesEsto utiliza el hecho de que hay 86,400 segundos en un día y está usando la hora local, no GMT. La salida ocurre mucho más de una vez por segundo. No estoy seguro si las declaraciones de importación deben incluirse en el recuento de bytes.
Para incluir un retraso de 1 segundo se agregan unos 26 bytes, por ejemplo
Java definitivamente no es el lenguaje más golfable. :)
Se eliminaron algunos bytes gracias a @insertusernamehere
fuente
1.0
ser1
? ¿Y puedes eliminar el líder0
de0.01672
y0.9856
?import static
pero eso podría ser "trampa" ... Todavía soy bastante nuevo aquí.System.err
para que no hubiera buffering. Sé queprintln
se supone que se imprime inmediatamente de todos modos, pero no siempre parece hacerlo. Por supuesto, podría convertirse a System.out sin cambiar el recuento de bytes :)Python, 101 bytes
345600 = 4 * 24 * 3600 (cuatro días)
5022635.53 ≌ (365.256363 * 24 * 3600) / (2π) (segundos en año / 2π)
fuente
import
s:import time,math
. Además, si usa Python 2, puede quitar el paréntesisprint
.Bash / coreutils / bc, 101 bytes
Esto calcula el desplazamiento desde el 4 de enero en segundos, por lo que utiliza una constante correspondiente para convertir a radianes. Medio año se convierte en aproximadamente pi:
El resto del cálculo es directamente de la pregunta.
fuente
bc
podría ser útil para esto. Me di cuenta de que tienedc
en su encabezado, pero lo usabc
en el código. A menudo los confundo a los dos.F #, 178 bytes
Este es un script de F # que funciona bien en F # Interactive. En aras de la simplicidad, el requisito de "salida continua" se lleva a niveles literales, aunque perdí un byte para hacer que la salida se imprima en una nueva línea cada iteración para que no sea tan malo. = P
Ungolfed y explicó:
fuente
Mathematica, 97 bytes
Explicación
{DateValue@"Year",1,5}
representa el 5 de enero de este año, y...~DateDifference~...
da la distancia temporal.Dynamic[...,UpdateInterval->1]
Actualice la expresión una vez por segundo.fuente
Dynamic[Round[PlanetData["Earth", "DistanceFromSun"]~QuantityMagnitude~"Kilometers"]]
Pyth, 51 bytes
Fórmula alternativa
d / AU = 1 - 0.01672 cos (2π [tiempo desde el perihelio] / [período orbital])
Esta fórmula es esencialmente la misma que la fórmula del OP, excepto que está generalizada para poder usar cualquier perihelio como fecha de referencia.
La fórmula del OP tiene [tiempo desde el perihelio] como (día - 4) y tiene (2π rad / [período orbital]) precalculado como 0.9856deg / día.
En mi solución Estoy utilizando el perihelio más cercano a la época Unix, 2 nd de enero de 1970.
El código
Compilado a mano a pseudocódigo pitónico:
Esto es esencialmente convertir la siguiente fórmula en código:
d = (1 - 0.01672 cos (2π (t - 86400) / 31558149)) * 149597870.691
donde t es el tiempo Unix.
fuente
Python 2.4 - 158 bytes
Toma la hora local y escupe la distancia. time.localtime () devuelve una tupla y se puede hacer referencia aquí .
fuente
.0
desde864.0
y100.0
para ahorrar unos pocos bytes?.0
para que fueran punto flotante y no entero.C, 338
fuente