太陽はどこまでですか?


20

前書き

tl; dr

現在の地球から太陽までの距離を継続的に出力します。


簡単に言えば、太陽の周りの地球の軌道は楕円です。したがって、両方の実際の距離は常に変化しています。この距離は、次の式を使用して特定の日に計算できます。

d / AU = 1-0.01672 cos(0.9856(day-4))

方程式は、次のパート2に分割できます。

  • 11 AU(天文単位)を表し、等しい149,597,870.691 km
  • 0.01672地球と太陽の間の 軌道離心率です
  • cosもちろんコサイン関数ですが、引数はラジアンではなく度単位です
  • 0.9856である360°/ 365.256363日、1年間で全回転、365.256363平均太陽日で恒星年の長さであり、
  • day 年の日です [1-365]
  • 41月4日から6日までの近日点へのオフセットを表します

数式は1日かかりますが、この課題の目的である継続的な出力のためには、より正確でなければなりません。翌日まで何も起こりません。1のように、過去の時間の割合を現在の日に単純に加算します。

day + (h * 3600 + m * 60 + s) / 864 / 100

いくつかの例:

  • 1月1日23:59:59 1.99998842592593
  • 1月1日、18:00:00 1.75
  • 1月1日、12:00:00 1.50
  • 1月1日、06:00:00 1.25

入力

このチャレンジには入力がありません。


言語が現在の時刻を取得できない場合は、プログラムへの入力として取得できます。有効な入力は、言語に最適なタイムスタンプまたは完全な日時文字列です。現在の日だけを渡すことはできません(51月5日や5.256時の同じ日など)。

出力

地球から太陽までの現在の距離を出力します。

  • の値を出力しますkm
  • 少なくとも1秒ごとに更新します。

出力例:

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詳細については、物理学」の「1年の特定の日の地球と太陽の距離」を参照してください。


現在の時間にアクセスできないプログラミング言語は何をすべきですか?BFなどが好きですか?
フレイ

3
Math.cosラジアンを使用しているため、あなたの例は間違っていると思います。また、この式は非常に近似しているよう見えるので、回答を検証する方法を明確にする必要があります。
-grc

@grc私は私の例のエラーを修正しました-それを指摘してくれてありがとう。
ユーザー名をここに挿入

@flawrプログラムへの入力として時間を取得できます。それに応じて質問が更新されます。
ここにユーザー名を挿入します

1
Mathematicaにはそれが組み込まれているに違いない!
sergiol

回答:


5

TI-BASIC、38バイト

Disp 25018086(59.8086-cos(5022635.4⁻¹checkTmr(83761
prgmA

TI-84 +シリーズの計算機用。これに名前を付けますprgmA。これは、数千回の反復後にスタックをオーバーフローさせることに注意してください。While 1:...:Endこれが問題になる場合は、代わりに2バイトを使用してください。

これは、1997年1月1日23:16 UTCの近日点を参照に使用し、今後数年間は数十キロメートル(精度は約7桁)以内の精度です。


今、これは短いです。称賛!
ここにユーザー名を挿入します

5

Java- 185180バイト

static void d(){while(true){System.err.println(149597870.691*(1-.01672*Math.cos(Math.toRadians(.9856*(Calendar.getInstance().get(6)+LocalTime.now().toSecondOfDay()/8.64e4-4)))));}}

これは、1日に86,400秒あるという事実を使用し、GMTではなく現地時間を使用しています。出力は、1秒に1回以上発生します。importステートメントをバイトカウントに含める必要があるかどうかはわかりません。

1秒の遅延を含めるには、約26バイトを追加します。

static void d(){try{while(true){System.err.println(149597870.691*((1-.01672*Math.cos(Math.toRadians(.9856*(Calendar.getInstance().get(6)+LocalTime.now().toSecondOfDay()/8.64e4-4)))));Thread.sleep(1000L);}}catch(Exception e){}}

Javaは間違いなく最もゴルフに適した言語ではありません。:)

@insertusernamehereのおかげで数バイト削除されました


1
いいね に1.0なれなかった1?そして、あなたは大手を削除することができます0から、0.016720.9856
ここにユーザー名を挿入します

非常に真実です、それは私が質問からコピーアンドペーストするために得たものです:p使用しimport staticた場合、もう少しバイトを落とすことができました が、それは「不正行為」かもしれません...私はまだかなり新しいです。
ロバートベンソン

System.errを使用する理由
SuperJedi224

System.errバッファリングがないように使用しました。printlnとにかくすぐに印刷することになっていることは知っていますが、常にそうであるとは限りません。もちろん、バイトカウントを変更せずにSystem.outに変換できます:)
ロバートベンソン

2
多くの人が度からラジアンへの変換を忘れていることに気づきました。私はそれらにコメントしたいと思いますが、私はあまりにも少ない担当者と初心者です:p
ロバートベンソン

4

Python、101バイト

import time,math
a=149597870.691
while 1:print(a-a*.01672*math.cos((time.time()-345600)/5022635.53))

345600 = 4 * 24 * 3600(4日間)

5022635.53≌(365.256363 * 24 * 3600)/(2π)(年の秒/2π)


プログラミングパズルとコードゴルフへようこそ。これは良い解決策です、+ 1。ただし、コメントのないバージョンを追加して、何をしたかを説明したり、コードの前に簡単なコメントを追加したりすると、回答が改善される場合があります。
wizzwizz4

バイトカウントが107になります。
モーガンスラップ16年

右、最後の改行を含めました。
パチョリク

imports:を組み合わせることにより、7バイト節約できますimport time,math。また、Python 2を使用している場合は、から括弧を削除できますprint
-PurkkaKoodari

また、本当です、私はそれが可能であることを忘れていましたそのPEPのすべてで:)
pacholik

3

Bash / coreutils / bc、101バイト

#!/bin/bash
bc -l <<<"149597870.691*(1-.01672*c((`date +%s`-`date -d 4-Jan +%s`)/5022635.5296))"
sleep .5
exec $0

これは、1月4日からのオフセットを秒単位で計算するため、対応する定数を使用してラジアンに変換します。半年はおよそpiに変換されます。

$ bc -l <<<"(365.256363/2*86400)/5022635.5296"
3.14159265361957033371

残りの計算は、質問から直接です。


良くやった。bcこれに役立つのではないかと思いました。私はあなたがdcあなたのヘッダーにあることに気づきbcましたが、コードで使用しています。私はよくこの2つを混同します。
ロバートベンソン

1
ありがとう、@ Robert-タイトルを修正しました。私はdcを見始めてから、bcのmathlibが必要だと気づいたので、間違った瞬間に両方の電卓が頭にありました!
トビー・スペイト

うん、そこにいた、それをやった。私はいつもどちらがどれかを忘れます。
ロバートベンソン

2

F#、178バイト

open System
Seq.initInfinite(fun _->
let n=DateTime.Now
(1.-0.01672*Math.Cos(0.0172*((n-DateTime.Today).TotalDays+float(n.DayOfYear-4))))*149597870.691)|>Seq.iter(printfn"%f")

これは、F#Interactiveで適切に実行されるF#スクリプトです。簡単にするために、「連続出力」の要件はリテラルレベルになりますが、繰り返しごとに新しい行に出力を印刷するためにバイトを失いました。それほど悪く。= P

ゴルフをしていないと説明:

Seq.initInfinite (fun _ ->            // Create an infinite sequence, with each element being defined by the following function
    let n = DateTime.Now
    let dayOffset = n.DayOfYear - 4   // Day of year returns the day as a number between 1 and 366
    let today = n - DateTime.Today    // Extract the current day, so the hours, minutes and all
    let partialDay = today.TotalDays  // Get the value of 'today' as a floating point number of days
                                      // so between 0 and 1 in this case - exactly what I needed
    // And now, the formula - note that 0.9856 has been combined with the conversion from degrees to radians, giving 0.0172
    (1. - 0.01672 * Math.Cos (0.0172 * (partialDay + float dayOffset))) * 149597870.691
)
|> Seq.iter (fun i -> printfn "%f" i) // For each of the (infinity of) numbers, print it

1

Mathematica、97バイト

Dynamic[1496*^5-2501*^3Cos[.9856#&@@Now~DateDifference~{DateValue@"Year",1,4}],UpdateInterval->1]

説明

{DateValue@"Year",1,5} 今年1月5日を表し、 ...~DateDifference~...、時間的距離を示します。

Dynamic[...,UpdateInterval->1] 1秒に1回式を更新します。


念のため、答えをAUではなくkmで出力する必要があります。Mathematicaにはコンバータが組み込まれているので、単位変換のために数バイト節約できると思いますか?
-busukxuan

@busukxuan係数を式に乗算しました。
njpipeorgan

ああ、私はそれを見逃した。4桁の有効数字になるとは思わなかった。
-busukxuan

2
または、Dynamic[Round[PlanetData["Earth", "DistanceFromSun"]~QuantityMagnitude~"Kilometers"]]
2012rcampion

1

Pyth、51バイト

#*149597870.691-1*.01672.t*c-.dZ86400 31558149*2.nZ1

代替式

d / AU = 1-0.01672 cos(2π[近日点からの時間] / [軌道周期])
この式は基本的にOPの式と同じですが、近日点を基準日として使用できるように一般化されています。

OPの公式には、[近日点からの時間]が(日-4)として、(2πラジアン/ [軌道周期])が0.9856度/日として事前に計算されています。

私の解決策では、私はUnixエポックに近日点に最も近いを使用しています、2 回目 1970年1月。

コード

pythonic擬似コードに手動でコンパイル:

#                        while 1:
  *149597870.691             print( 149597870.691 * (                 # implicit print
    -1                           1 - (
      *.01672                        0.1672 * (
        .t                               trigo(
          *                                  multiply(
            c                                    divide(
              -.dZ86400                              unixTime-86400,
              31558149                               31558149
                                                 ),
            *2.nZ                                2*pi
                                             ),
          1                                  1                        # 1 means cos
                             )))))

これは基本的に、次の式をコードに変換するだけです。
。d =(1-0.01672 cos(2π(t-86400)/ 31558149))* 149597870.691
ここで、tはUnix時間です。


1

Python 2.4-158バイト

import time,math
while 1:t=time.localtime();print(int(149597870.691*(1-.01672*math.cos(math.radians(.9856*(t[7]+(t[3]*3600+t[4]*60+t[5])/864.0/100.0-4))))))

現地時間を取り、距離を吐き出します。time.localtime()はタプルを返し、ここで参照できます


あなたが削除することができます.0から864.0100.0数バイトを保存しますか?
ユーザー名をここに挿入します

私が心配しているのは、それが浮動小数点除算でなくなることです。私は、.0整数ではなく浮動小数点になるように保持しました。
linkian209

0

C、338

#include <stdio.h>
#include <time.h>
#include <math.h>
int main ()
{
  time_t rt;
  struct tm * ti;
  while(1) {
  time(&rt);
  ti = localtime(&rt);
  double d = 1.0 - .01672*cos(0.0174533 * .9856*((ti->tm_yday + (ti->tm_hour * 3600.0 + ti->tm_mday * 60.0 + ti->tm_sec) / 86400.0) - 4));
  printf ("%f\n", d * 149598000.0);}
}

3
プログラミングパズルとコードゴルフへようこそ!これは正解のように見えますが、あまりゴルフされていないようです。[code-golf]タグを使用した質問については、回答でトピックのサイズをできるだけ小さくするよう努力する必要があります。ヘルプセンターをご覧ください。ゴルフバージョンを見ることを楽しみにしています!=)
ルージョ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.