Вступление
ТЛ; др
Постоянно выводить текущее расстояние от Земли до Солнца.
Упрощенно, орбита Земли вокруг Солнца является эллипсом. Таким образом, фактическое расстояние между ними постоянно меняется. Это расстояние можно рассчитать для любого данного дня, используя эту формулу :
Уравнение можно разбить на следующие части 2 :
1
представляет 1 AU (астрономическая единица), равно149,597,870.691 km
0.01672
это орбитальный эксцентриситет между Землей и Солнцемcos
конечно функция косинуса, но с аргументом в градусах, а не в радианах0.9856
составляет 360 ° / 365,256363 дней , полный оборот за один год, где365.256363
длина сидерического года, в средних солнечные дниday
это день года[1-365]
4
представляет смещение перигелия , которое находится между 4 и 6 января
Формула занимает целый день, но для решения этой задачи - непрерывного вывода - вам нужно быть более точным; или ничего особенного не произойдет до следующего дня. Просто добавьте процент прошедшего времени к текущему дню, например 1 :
day + (h * 3600 + m * 60 + s) / 864 / 100
Несколько примеров:
- 1 января 23:59:59
1.99998842592593
- 1 января, 18:00:00
1.75
- 1 января, 12:00:00
1.50
- 1 января, 06:00:00
1.25
вход
Этот вызов не имеет вклада.
Если ваш язык не может получить текущее время, вы можете получить его в качестве входных данных для вашей программы. Допустимые входные данные - это метки времени или полные строки даты и времени, которые лучше всего подходят для языка. Прохождение текущего дня в одиночку (например, 5
5 января или 5.25
в тот же день в 6 часов) не допускается.
Выход
Выведите текущее расстояние от Земли до Солнца:
- Выведите значение в
km
. - Обновите значение по крайней мере каждую секунду .
Пример вывода:
152098342
Если это не увеличивает количество байт, вы также можете распечатать результат:
152,098,342
152,098,342 km
Требования
- Вы можете написать программу или функцию. Если это анонимная функция, пожалуйста, включите пример того, как ее вызвать.
- Это код-гольф, поэтому выигрывает самый короткий ответ в байтах.
- Стандартные лазейки запрещены.
Пример реализации
Я подготовил пример реализации в JavaScript. Это ни соревнование, ни игра в гольф.
// 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 Чтобы не чрезмерно увеличивать сложность, вам не нужно переводить местное время в UTC. Если вы используете UTC, пожалуйста, добавьте примечание к вашему ответу.
2 Более подробную информацию см. В разделе « Расстояние Земля-Солнце в определенный день года» в разделе « Физика».
Math.cos
использует радианы. И поскольку эта формула кажется очень приблизительной, вам нужно будет четко определить, как нужно проверять ответы.Ответы:
TI-BASIC, 38 байт
Для калькулятора серии TI-84 +. Назовите это
prgmA
. Обратите внимание, что это переполняет стек после нескольких тысяч итераций; используйтеWhile 1:...:End
вместо этого, если это проблема, для двух дополнительных байтов.При этом для справки используется перигелий 1 января 1997 года, 23:16 UTC, и с точностью до нескольких десятков километров (около 7 цифр точности) в течение следующих нескольких лет.
источник
Ява -
185180 байтПри этом используется тот факт, что в дне 86 400 секунд, и используется местное время, а не время по Гринвичу. Вывод происходит гораздо чаще, чем раз в секунду. Не уверен, что операторы импорта должны быть включены в число байтов.
Для включения задержки в 1 секунду добавляется около 26 байтов, например
Ява определенно не самый подходящий для игры язык. :)
Удалено несколько байтов благодаря @insertusernameherehere
источник
1.0
стать1
? И можете ли вы удалить ведущие0
из0.01672
и0.9856
?import static
но это могло бы быть "обманом" ... Я все еще довольно новичок здесь.System.err
чтобы не было никакой буферизации. Я знаю, чтоprintln
в любом случае предполагается, что печать должна выполняться немедленно, но, похоже, это не всегда происходит. Конечно, его можно преобразовать в System.out без изменения количества байтов :)Python, 101 байт
345600 = 4 * 24 * 3600 (четыре дня)
5022635,53 ≌ (365,256363 * 24 * 3600) / (2π) (секунды в году / 2π)
источник
import
S:import time,math
. Кроме того, если вы используете Python 2, вы можете удалить скобки изprint
.Bash / coreutils / bc, 101 байт
Это вычисляет смещение от 4 января в секундах, поэтому использует соответствующую константу для преобразования в радианы. Пол года превращается примерно в пи:
Остальная часть расчета прямо из вопроса.
источник
bc
может ли это быть полезным для этого. Я заметил, что у вас естьdc
в вашем заголовке, но использоватьbc
в коде. Я часто путаю их обоих.F #, 178 байт
Это скрипт F #, который хорошо работает в F # Interactive. Для простоты требование «непрерывного вывода» перенесено на буквальный уровень, хотя я потерял байт, чтобы выводить вывод на новую строку каждую итерацию, чтобы он не был слишком плохим. = Р
Разгромил и объяснил:
источник
Mathematica, 97 байт
объяснение
{DateValue@"Year",1,5}
представляет 5 января этого года, и...~DateDifference~...
дает временную дистанцию.Dynamic[...,UpdateInterval->1]
обновлять выражение один раз в секунду.источник
Dynamic[Round[PlanetData["Earth", "DistanceFromSun"]~QuantityMagnitude~"Kilometers"]]
Pyth, 51 байт
Альтернативная формула
d / AU = 1 - 0,01672 cos (2π [время с перигелия] / [орбитальный период])
Эта формула, по сути, такая же, как формула OP, за исключением того, что она обобщена, чтобы иметь возможность использовать любой перигелий в качестве контрольной даты.
Формула OP имеет [время с перигелия] как (день - 4) и имеет (2π рад / [орбитальный период]), предварительно рассчитанный как 0,9856 градусов в день.
В моем решении я использую перигелий ближе всего к эпохе Unix, 2 - го января 1970 года.
Код
Собранный вручную в питонический псевдокод:
По сути, это просто превращение следующей формулы в код:
d = (1 - 0,01672 cos (2π (t - 86400) / 31558149)) * 149597870.691,
где t - время Unix.
источник
Python 2,4 - 158 байт
Занимает местное время и выплевывает расстояние. time.localtime () возвращает кортеж и на него можно ссылаться здесь .
источник
.0
из864.0
и100.0
сэкономить несколько байт?.0
чтобы они были с плавающей точкой, а не целое число.С, 338
источник