Introdução
tl; dr
Saída contínua da distância atual da Terra ao Sol.
Simplificado, a órbita da Terra ao redor do Sol é uma elipse. Portanto, a distância real entre ambos muda constantemente. Essa distância pode ser calculada para qualquer dia usando esta fórmula :
A equação pode ser dividida nas seguintes partes 2 :
1
representa 1 AU (unidade astronômica), é igual a149,597,870.691 km
0.01672
é a excentricidade orbital entre a Terra e o Solcos
é obviamente a função cosseno, mas com argumentos em graus, em vez de radianos0.9856
é 360 ° / 365.256363 dias , uma rotação completa em um ano, onde365.256363
é a duração de um ano sideral, em dias solares médiosday
é o dia do ano[1-365]
4
representa o deslocamento para o periélio , que é entre 4 e 6 de janeiro
A fórmula leva um dia inteiro, mas para o objetivo desse desafio - uma saída contínua - você precisa ser mais preciso; ou nada vai acontecer até o dia seguinte. Basta adicionar a porcentagem do tempo passado ao dia atual, como 1 :
day + (h * 3600 + m * 60 + s) / 864 / 100
Alguns exemplos:
- 1 de janeiro, 23:59:59
1.99998842592593
- 1 de janeiro, 18:00:00
1.75
- 1 de janeiro, 12:00:00
1.50
- 1 de janeiro, 06:00:00
1.25
Entrada
Este desafio não tem entrada.
Se o seu idioma não conseguir obter a hora atual, você poderá obtê-la como uma entrada para o seu programa. Entradas válidas são carimbos de data / hora ou seqüências completas de data e hora que melhor se adaptam ao idioma. Passar o dia atual sozinho (como 5
em 5 de janeiro ou 5.25
no mesmo dia às 6 horas) não é permitido.
Saída
Emita a distância atual da Terra ao Sol:
- Emita o valor em
km
. - Atualize o valor pelo menos a cada segundo .
Exemplo de saída:
152098342
Se não aumentar sua contagem de bytes, você também pode imprimir o resultado:
152,098,342
152,098,342 km
Exigências
- Você pode escrever um programa ou uma função. Se for uma função anônima, inclua um exemplo de como invocá-la.
- Este é o código-golfe, pelo que a resposta mais curta em bytes vence.
- As brechas padrão não são permitidas.
Implementação de exemplo
Eu preparei um exemplo de implementação em JavaScript. Não é competitivo nem jogado de golfe.
// 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 não aumentar excessivamente a complexidade, você não precisa converter a hora local em UTC. Se você usa o UTC, adicione uma nota à sua resposta.
2 Para mais detalhes, consulte " Distância Terra-Sol em um determinado dia do ano ", em Física
Math.cos
usa radianos. E como essa fórmula parece muito aproximada, você terá que ser claro sobre como as respostas devem ser verificadas.Respostas:
TI-BASIC, 38 bytes
Para uma calculadora da série TI-84 +. Nomeie isso
prgmA
. Observe que isso excede a pilha após alguns milhares de iterações; use um,While 1:...:End
se isso for um problema, por dois bytes extras.Ele usa o periélio em 1 de janeiro de 1997, às 23:16 UTC como referência, e tem uma precisão de algumas dezenas de quilômetros (cerca de 7 dígitos de precisão) nos próximos anos.
fonte
Java -
185180 bytesIsso usa o fato de que existem 86.400 segundos em um dia e está usando a hora local, não o GMT. A saída acontece muito mais de uma vez por segundo. Não tenho certeza se as instruções de importação devem ser incluídas na contagem de bytes.
Para incluir um atraso de 1 segundo, adiciona cerca de 26 bytes, por exemplo
Java definitivamente não é a linguagem mais golfável. :)
Removidos alguns bytes graças a @insertusernamehere
fonte
1.0
tornar1
? E você pode remover a liderança0
de0.01672
e0.9856
?import static
mas isso pode ser "trapaça" ... Ainda sou novo por aqui.System.err
para que não houvesse buffer. Eu sei queprintln
é suposto imprimir imediatamente de qualquer maneira, mas nem sempre parece fazer isso. Claro que poderia ser convertido para System.out sem alterar a contagem de bytes :)Python, 101 bytes
345600 = 4 * 24 * 3600 (quatro dias)
5022635,53 ≌ (365,256363 * 24 * 3600) / (2π) (segundos no ano / 2π)
fonte
import
s:import time,math
. Além disso, se você usa o Python 2, pode soltar os parêntesesprint
.Bash / coreutils / bc, 101 bytes
Isso calcula o deslocamento a partir de 4 de janeiro em segundos, e usa uma constante correspondente para converter em radianos. Meio ano se converte em aproximadamente pi:
O restante do cálculo é direto da questão.
fonte
bc
pode ser útil para isso. Percebi que você temdc
no seu cabeçalho, mas usebc
no código. Eu muitas vezes confundo os dois.F #, 178 bytes
Este é um script F # que roda bem no F # Interactive. Por uma questão de simplicidade, o requisito de "saída contínua" é levado a níveis literais, embora eu tenha perdido um byte para imprimir a saída em uma nova linha a cada iteração, para que não seja muito ruim. = P
Ungolfed e explicou:
fonte
Mathematica, 97 bytes
Explicação
{DateValue@"Year",1,5}
representa 5 de janeiro deste ano e...~DateDifference~...
fornece a distância temporal.Dynamic[...,UpdateInterval->1]
atualize a expressão uma vez por segundo.fonte
Dynamic[Round[PlanetData["Earth", "DistanceFromSun"]~QuantityMagnitude~"Kilometers"]]
Pitão, 51 bytes
Fórmula alternativa
d / AU = 1 - 0,01672 cos (2π [tempo desde o periélio] / [período orbital])
Esta fórmula é essencialmente a mesma que a fórmula do OP, exceto que é generalizada para poder usar qualquer periélio como data de referência.
A fórmula do OP tem [tempo desde o periélio] como (dia - 4) e tem (2π rad / [período orbital]) pré-calculado como 0,9856deg / dia.
Na minha solução, estou usando o periélio mais próximo da época do Unix, 2 2º Janeiro de 1970.
O código
Compilado manualmente para pseudocódigo python:
Isso é basicamente transformar a seguinte fórmula no código:
d = (1 - 0,01672 cos (2π (t - 86400) / 31558149)) * 149597870.691
onde t é o tempo do Unix.
fonte
Python 2.4 - 158 bytes
Leva a hora local e cospe a distância. time.localtime () retorna uma tupla e pode ser referenciada aqui .
fonte
.0
a partir de864.0
e100.0
para economizar alguns bytes?.0
para que eles fossem ponto flutuante e não inteiro.C, 338
fonte