태양은 얼마나 멀어요?


20

소개

tl; dr

지구에서 태양까지의 현재 거리를 지속적으로 출력합니다.


간단히 말해, 태양 주위의 지구 궤도는 타원입니다. 따라서 둘 사이의 실제 거리는 지속적으로 변합니다. 이 거리는 다음 공식을 사용하여 주어진 날짜에 대해 계산할 수 있습니다 .

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

방정식은 다음의 부분으로 분할 될 수있다 2 :

  • 11AU (천문 단위)를 나타내며149,597,870.691 km
  • 0.01672지구와 태양 사이 의 궤도 편심
  • cos물론 코사인 함수 이지만 라디안 대신 각도로 인수를 사용합니다.
  • 0.9856360 ° / 365.256363 일 , 일년에 전체 회전, 365.256363평균 태양 일 항성 년의 길이,
  • day 올해의 날이다 [1-365]
  • 4perihelion 의 오프셋을 나타냅니다. 1 월 4 일에서 6 일 사이입니다.

공식은 하루 종일 걸리지 만이 도전의 목적을 위해 – 지속적인 결과물 –보다 정확해야합니다. 아니면 다음날까지 아무 일도 일어나지 않을 것입니다. 현재 시간에 과거 시간의 백분율을 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.25 같은 날 6시) 전달하는 것은 허용되지 않습니다.

산출

지구에서 태양까지의 현재 거리를 출력합니다.

  • 의 값을 출력하십시오 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 자세한 내용은 물리 에서 " 일년의 지구-태양 거리 "를 참조하십시오.


현재 시간에 액세스 할 수없는 프로그래밍 언어는 무엇을해야합니까? BF 등등처럼?
flawr

3
Math.cos라디안을 사용하기 때문에 귀하의 예가 잘못되었다고 생각합니다 . 이 공식은 매우 근사해 므로 답변을 확인하는 방법을 명확히해야합니다.
grc

@grc 예제에서 오류를 수정했습니다.
insertusername 여기

@flawr 시간은 프로그램의 입력으로 얻을 수 있습니다. 그에 따라 질문이 업데이트됩니다.
insertusername 여기

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에 perihelion을 사용하며 향후 몇 년 동안 수십 킬로미터 (정확도 약 7 자리) 이내로 정확합니다.


이제 짧습니다. 명성!
insertusername 여기

5

자바- -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)))));}}

이것은 하루에 86,400 초가 있으며 GMT가 아닌 현지 시간을 사용한다는 사실을 사용합니다. 초당 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){}}

자바는 가장 골프 가능한 언어가 아닙니다. :)

@insertusername으로 인해 몇 바이트가 제거되었습니다.


1
좋은. 할 수 없습니다 1.01? 그리고 당신은 선도적 인을 제거 할 수 있습니다 0에서 0.016720.9856?
insertusername 여기

매우 사실, 그것은 질문에서 copy-paste를 얻는 import static것입니다.
Robert Benson

왜 System.err인가?
SuperJedi224

System.err버퍼링이 없도록 사용했습니다 . println어쨌든 즉시 인쇄해야한다는 것을 알고 있지만 항상 그렇게하는 것은 아닙니다. 물론 바이트 수를 변경하지 않고 System.out으로 변환 할 수 있습니다 :)
Robert Benson

2
많은 사람들이도에서 라디안으로 변환하는 것을 잊고 있음을 알았습니다. 나는 그들에 대해 언급하고 싶지만 나는 너무 작은 담당자와 초보자입니다 : p
Robert Benson

4

파이썬, 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. 그러나 ungolfed 및 주석이 달린 버전을 추가하거나 수행 한 작업을 설명하거나 코드 앞에 간단한 주석을 추가 한 경우 응답이 향상 될 수 있습니다.
wizzwizz4

바이트 수는 107입니다.
Morgan Thrapp 2016 년

네, 마지막 줄 바꿈을 포함 시켰습니다.
pacholik

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코드에서 사용하는 것으로 나타났습니다 . 나는 종종 두 사람을 혼동한다.
Robert Benson

1
감사합니다, @Robert-제목을 수정했습니다. 나는 dc를보고 시작한 다음 bc의 mathlib가 필요하다는 것을 깨달았습니다. 따라서 두 순간에 두 계산기를 모두 잘못 생각했습니다!
Toby Speight

그렇습니다. 나는 항상 어느 것이 무엇인지 잊어 버립니다.
Robert Benson

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

수학, 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] 초당 한 번 식을 업데이트하십시오.


다시 말해, AU가 아닌 km 단위로 답을 출력해야합니다. Mathematica에 변환기가 내장되어 있으므로 단위 변환을 위해 바이트를 절약 할 수 있다고 가정합니다.
busukxuan

@busukxuan 나는 계수를 공식에 곱했다.
njpipeorgan 2016 년

오 sry 나는 그것을 놓쳤다. 그것이 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π [perihelion 이후의 시간] / [궤도 기간])
이 공식은 기준일로 모든 perihelion을 사용할 수 있도록 일반화되는 것을 제외하고는 OP의 공식과 본질적으로 동일합니다.

OP의 공식은 [perihelion 이후의 시간]을 (day-4)로, (2π rad / [orbital period])를 0.9856deg / day로 미리 계산했습니다.

내 솔루션에서 나는 유닉스 시대, 2에 가장 가까운 근일점 사용하고 ND 년 1 월 1970.

코드

파이썬 의사 코드로 수동 컴파일 :

#                        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는 유닉스 시간입니다.


1

파이썬 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몇 바이트를 저장?
insertusernamehere 여기에

내가 걱정하는 유일한 것은 더 이상 부동 소수점 나누기가 될 수 없다는 것입니다. .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] 태그가있는 질문의 경우 답변을 통해 주제별로 고려할 수 있도록 최대한 크기를 줄이기 위해 노력해야 합니다. 도움말 센터를 참조하십시오 . 나는 골프 버전을 기대하고 있습니다! =)
Roujo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.