Wprowadzenie
tl; dr
Ciągle wysyłaj aktualną odległość od Ziemi do Słońca.
Uproszczona orbita Ziemi wokół Słońca jest elipsą. Rzeczywista odległość między nimi ciągle się zmienia. Odległość tę można obliczyć dla dowolnego dnia za pomocą tego wzoru :
Równanie można podzielić na następujące części 2 :
1
reprezentuje 1 AU (jednostka astronomiczna), jest równy149,597,870.691 km
0.01672
to ekscentryczność orbity między Ziemią a Słońcemcos
jest oczywiście funkcją cosinus, ale z argumentami w stopniach, a nie w radianach0.9856
wynosi 360 ° / 365.256363 dni , pełny obrót w ciągu jednego roku, gdzie365.256363
jest długość roku gwiazdowego, w średnich dniach słonecznychday
jest dniem roku[1-365]
4
reprezentuje przesunięcie w stosunku do peryhelium , które przypada między 4 a 6 stycznia
Formuła trwa cały dzień, ale w celu sprostania temu wyzwaniu - ciągłej wydajności - musisz być bardziej dokładny; albo nic więcej się nie wydarzy do następnego dnia. Po prostu dodaj procent czasu przeszłego do bieżącego dnia, na przykład 1 :
day + (h * 3600 + m * 60 + s) / 864 / 100
Kilka przykładów:
- 1 stycznia, 23:59:59
1.99998842592593
- 1 stycznia, 18:00:00
1.75
- 1 stycznia, 12:00:00
1.50
- 1 stycznia, 06:00:00
1.25
Wejście
To wyzwanie nie ma wkładu.
Jeśli twój język nie może uzyskać aktualnego czasu, możesz go uzyskać jako dane wejściowe do swojego programu. Poprawne dane wejściowe to znaczniki czasu lub pełne ciągi daty i godziny, które najlepiej pasują do języka. Minięcie bieżącego dnia samemu (jak 5
na 5 stycznia lub 5.25
tego samego dnia o godzinie 6) jest niedozwolone.
Wynik
Wyjście aktualnej odległości od Ziemi do Słońca:
- Podaj wartość w
km
. - Aktualizuj wartość przynajmniej co sekundę .
Przykładowe dane wyjściowe:
152098342
Jeśli nie zwiększy to liczby bajtów, możesz również całkiem wydrukować wynik:
152,098,342
152,098,342 km
Wymagania
- Możesz napisać program lub funkcję. Jeśli jest to funkcja anonimowa, podaj przykład jej wywołania.
- To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w bajtach.
- Standardowe luki są niedozwolone.
Przykładowa implementacja
Przygotowałem przykładową implementację w JavaScript. Nie jest konkurencyjny ani golfowy.
// 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 Aby nieracjonalnie zwiększyć złożoności, nie musisz przeliczać czasu lokalnego na UTC. Jeśli korzystasz z UTC, dodaj notatkę do swojej odpowiedzi.
2 Aby uzyskać więcej informacji, patrz „ Odległość Ziemia-Słońce w danym dniu roku ” w Physics
Math.cos
używa radianów. A ponieważ ta formuła wydaje się bardzo przybliżona, musisz wyjaśnić, w jaki sposób należy weryfikować odpowiedzi.Odpowiedzi:
TI-BASIC, 38 bajtów
Do kalkulatora serii TI-84 +. Nazwij to
prgmA
. Zauważ, że to przepełnia stos po kilku tysiącach iteracji; użyjWhile 1:...:End
zamiast tego, jeśli jest to problem, dla dwóch dodatkowych bajtów.Wykorzystuje peryhelium 1 stycznia 1997 r., 23:16 UTC w celach informacyjnych i jest dokładny z dokładnością do kilkudziesięciu kilometrów (około 7 cyfr dokładności) przez kilka następnych lat.
źródło
Java -
185180 bajtówWykorzystuje to fakt, że dziennie jest 86 400 sekund i używa czasu lokalnego, a nie GMT. Wyjście odbywa się znacznie częściej niż raz na sekundę. Nie jestem pewien, czy instrukcje importu powinny być uwzględnione w liczbie bajtów.
Uwzględnienie 1-sekundowego opóźnienia dodaje około 26 bajtów, np
Java zdecydowanie nie jest najbardziej golfowym językiem. :)
Usunięto kilka bajtów dzięki @insertusernameherehere
źródło
1.0
się stać1
? Czy możesz usunąć wiodące pozycje0
z0.01672
i0.9856
?import static
ale to może być „oszukiwanie” ... Nadal jestem tu nowy.System.err
więc nie byłoby buforowania. Wiem, że iprintln
tak powinien drukować natychmiast, ale nie zawsze tak się dzieje. Oczywiście można go przekonwertować na System.out bez zmiany liczby bajtów :)Python, 101 bajtów
345600 = 4 * 24 * 3600 (cztery dni)
5022635,53 ≌ (365.256363 * 24 * 3600) / (2π) (sekundy w roku / 2π)
źródło
import
s:import time,math
. Ponadto, jeśli używasz języka Python 2, możesz usunąć nawiasprint
.Bash / coreutils / bc, 101 bajtów
To oblicza przesunięcie od 4 stycznia w sekundach, więc używa odpowiedniej stałej do konwersji na radiany. Pół roku zmienia się w mniej więcej pi:
Reszta obliczeń pochodzi wprost z pytania.
źródło
bc
może to być przydatne. Zauważyłem, że maszdc
w nagłówku, ale użyjbc
w kodzie. Często sam siebie mylę.F #, 178 bajtów
To jest skrypt F #, który działa dobrze w F # Interactive. Dla uproszczenia wymóg „ciągłego drukowania” jest przenoszony na poziomy dosłowne, chociaż straciłem bajt, aby wydruk był wyświetlany w nowej linii przy każdej iteracji, aby nie było tak źle. = P
Nie golfił i wyjaśnił:
źródło
Mathematica, 97 bajtów
Wyjaśnienie
{DateValue@"Year",1,5}
reprezentuje 5 stycznia tego roku i...~DateDifference~...
podaje dystans czasowy.Dynamic[...,UpdateInterval->1]
aktualizuj wyrażenie raz na sekundę.źródło
Dynamic[Round[PlanetData["Earth", "DistanceFromSun"]~QuantityMagnitude~"Kilometers"]]
Pyth, 51 bajtów
Alternatywna formuła
d / AU = 1 - 0,01672 cos (2π [czas od peryhelium] / [okres obiegu orbitalnego])
Ta formuła jest zasadniczo taka sama jak formuła PO, z tym że uogólnia się, aby móc użyć dowolnego peryhelium jako daty odniesienia.
Formuła OP ma [czas od peryhelium] jako (dzień - 4) i ma (2π rad / [okres obiegu orbitalnego]) wstępnie obliczone jako 0,9856 stopni / dzień.
W moim rozwiązanie używam peryhelium najbliższą epoki Uniksa, 2 -go stycznia 1970 r.
Kod
Ręcznie skompilowany do pseudokodu pythonowego:
Zasadniczo jest to po prostu przekształcenie następującej formuły w kod:
d = (1 - 0,01672 cos (2π (t - 86400) / 31558149)) * 149597870.691
gdzie t jest czasem uniksowym.
źródło
Python 2.4 - 158 bajtów
Zajmuje czas lokalny i wypluwa dystans. time.localtime () zwraca krotkę i można się do niej odwoływać tutaj .
źródło
.0
z864.0
i100.0
zaoszczędzić kilka bajtów?.0
tak, żeby były zmiennoprzecinkowe, a nie całkowite.C 338
źródło