ดวงอาทิตย์ไกลแค่ไหน?


20

บทนำ

TL; DR

ส่งออกอย่างต่อเนื่องระยะทางปัจจุบันจากโลกไปยังดวงอาทิตย์


อย่างง่ายวงโคจรของโลกรอบดวงอาทิตย์เป็นวงรี ดังนั้นระยะทางที่แท้จริงระหว่างทั้งสองจึงเปลี่ยนแปลงตลอดเวลา ระยะทางนี้สามารถคำนวณได้ทุกวันโดยใช้สูตรนี้ :

d / AU = 1-0.01672 cos (0.9856 (วันที่ 4))

สมการสามารถแบ่งออกเป็นส่วนต่าง ๆ ดังต่อไปนี้2 :

  • 1แสดงถึง1 AU (หน่วยดาราศาสตร์) เท่ากับ149,597,870.691 km
  • 0.01672คือความ เยื้องศูนย์กลางของวงโคจรระหว่างโลกกับดวงอาทิตย์
  • cosแน่นอนว่าเป็นฟังก์ชันโคไซน์แต่มีอาร์กิวเมนต์เป็นองศาแทนที่จะเป็นเรเดียน
  • 0.9856คือ360 ° / 365.256363 วันหมุนเต็มรูปแบบในหนึ่งปีโดยที่365.256363ความยาวของปี sidereal ในวันสุริยคติเฉลี่ย
  • 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 น 1.50
  • 1 มกราคม 06: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สำหรับรายละเอียดเพิ่มเติมโปรดดูที่ " ระยะทางโลก - ดวงอาทิตย์ในวันที่กำหนด " ในฟิสิกส์


ภาษาการเขียนโปรแกรมควรทำอะไรที่ไม่สามารถเข้าถึงเวลาปัจจุบันได้? ชอบ BF ฯลฯ เหรอ?
ข้อบกพร่อง

3
ฉันเชื่อว่าตัวอย่างของคุณไม่ถูกต้องเนื่องจากMath.cosใช้เรเดียน และเนื่องจากสูตรนี้ดูเหมือนมากประมาณคุณจะต้องมีความชัดเจนเกี่ยวกับวิธีการคำตอบที่ได้รับการยืนยัน
grc

@grc ฉันแก้ไขข้อผิดพลาดในตัวอย่างแล้ว - ขอบคุณที่ชี้ให้ฉันเห็น
insertusernamehere

@flawr คุณสามารถรับเวลาเป็นข้อมูลเข้าสู่โปรแกรมของคุณ คำถามได้รับการปรับปรุงให้สอดคล้อง
แทรกชื่อที่นี่

1
ฉันพนันได้ว่า Mathematica มีมาให้แล้ว!
sergiol

คำตอบ:


5

TI-BASIC, 38 ไบต์

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

สำหรับเครื่องคิดเลขชุด TI-84 + prgmAชื่อนี้ โปรดทราบว่าสิ่งนี้จะล้นสแต็คหลังจากทำซ้ำสองสามพันครั้ง ใช้While 1:...:Endแทนหากนี่เป็นปัญหาสำหรับสองไบต์พิเศษ

สิ่งนี้ใช้การค้นพบดวงอาทิตย์เมื่อวันที่ 1 มกราคม 1997, 23:16 UTC สำหรับการอ้างอิงและมีความแม่นยำภายในไม่กี่สิบกิโลเมตร (ความแม่นยำประมาณ 7 หลัก) ในอีกไม่กี่ปีข้างหน้า


ตอนนี้มันสั้น รุ่งโรจน์!
แทรกที่นี่

5

Java - 185 180 ไบต์

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 วินาทีจะเพิ่มประมาณ 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 แน่นอนไม่ใช่ภาษาที่เล่นกอล์ฟได้มากที่สุด :)

ลบออกไปสองสามไบต์ด้วย @insertusername ที่นี่


1
ดี ไม่สามารถ1.0กลายเป็น1? และคุณสามารถลบผู้นำ0จาก0.01672และ0.9856?
แทรกชื่อที่นี่

จริงมากนั่นคือสิ่งที่ฉันได้รับจากการคัดลอกจากคำถาม: p ฉันสามารถวางไบต์ได้อีกถ้าฉันใช้ import staticแต่นั่นอาจเป็น "การโกง" ... ฉันยังค่อนข้างใหม่อยู่ที่นี่
Robert Benson

ทำไมต้อง System.err
SuperJedi224

ฉันใช้System.errดังนั้นจะไม่มีการบัฟเฟอร์ ฉันรู้ว่าprintlnควรพิมพ์ทันที แต่ก็ไม่ได้ทำเช่นนั้นเสมอไป แน่นอนมันอาจจะถูกแปลงเป็น System.out โดยไม่ต้องเปลี่ยนการนับไบต์ :)
โรเบิร์ตเบนสัน

2
ฉันสังเกตเห็นว่าหลายคนลืมที่จะเปลี่ยนจากองศาเป็นเรเดียน ฉันจะแสดงความคิดเห็นกับพวกเขา แต่ฉันเป็นมือใหม่ที่มีตัวแทนน้อยเกินไป: p
Robert Benson

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 (สี่วัน)

5022635.53 ≌ (365.256363 * 24 * 3600) / (2π) (วินาทีในปี / 2π)


ยินดีต้อนรับสู่การเขียนโปรแกรมปริศนาและรหัสกอล์ฟ นี่เป็นทางออกที่ดี +1 อย่างไรก็ตามอาจช่วยปรับปรุงคำตอบได้หากคุณเพิ่มเวอร์ชันที่ไม่ได้พูดและแสดงความคิดเห็นอธิบายสิ่งที่คุณทำหรือแม้แต่เพิ่มความคิดเห็นแบบง่าย ๆ ก่อนโค้ด
wizzwizz4

ฉันได้ 107 จากการนับไบต์
Morgan Thrapp

ใช่ฉันได้รวมบรรทัดใหม่ล่าสุดแล้ว
pacholik

คุณสามารถบันทึก 7 ไบต์โดยการรวมs:import 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

สิ่งนี้คำนวณออฟเซ็ตจากวันที่ 4 มกราคมในไม่กี่วินาทีดังนั้นใช้ค่าคงที่ที่สอดคล้องกันเพื่อแปลงเป็นเรเดียน ครึ่งปีแปลงเป็น pi โดยประมาณ:

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

ส่วนที่เหลือของการคำนวณตรงจากคำถาม


งานที่ดี. ฉันสงสัยว่าbcอาจมีประโยชน์กับสิ่งนี้หรือไม่ ฉันสังเกตเห็นว่าคุณมีdcในส่วนหัวของคุณ แต่ใช้bcในรหัส ฉันมักจะสับสนทั้งสองตัวเอง
Robert Benson

1
ขอบคุณ @Robert - ฉันได้แก้ไขชื่อ ฉันเริ่มมองหา dc จากนั้นฉันก็รู้ว่าฉันต้องการ mathlib ของ bc ดังนั้นฉันจึงมีเครื่องคิดเลขทั้งสองในเวลาที่ผิด!
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 # ที่ทำงานได้ดีใน F # Interactive เพื่อความเรียบง่ายข้อกำหนด "เอาท์พุทต่อเนื่อง" จะถูกนำไปใช้ในระดับตัวอักษรถึงแม้ว่าฉันจะทำไบต์หายไปเพื่อให้พิมพ์งานพิมพ์บนบรรทัดใหม่ทุกการวนซ้ำเพื่อที่จะได้ไม่เลวร้ายเกินไป = P

Ungolfed และอธิบาย:

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}แสดงถึงวันที่ 5 มกราคมของปีนี้และ...~DateDifference~...ให้ระยะทางชั่วคราว

Dynamic[...,UpdateInterval->1] อัพเดตนิพจน์หนึ่งครั้งต่อวินาที


เพียงเพื่อเตือนคุณคุณต้องส่งคำตอบเป็นกม. ไม่ใช่ AU ฉันคิดว่า 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π rad / [ระยะเวลาวงโคจร]) คำนวณล่วงหน้าเป็น 0.9856deg / วัน

ในการแก้ปัญหาของฉันฉันใช้ใกล้ดวงอาทิตย์ที่สุดที่ใกล้เคียงกับยุค Unix, 2 ครั้งมกราคม 1970

รหัส

รวบรวม pseonic pseudocode ด้วยมือ:

#                        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 () ผลตอบแทน tuple และสามารถอ้างอิงได้ที่นี่


คุณสามารถลบ.0จาก864.0และ100.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 กอล์ฟ] แท็กคำตอบที่ต้องใช้ความพยายามในการลดขนาดของพวกเขามากที่สุดเท่าที่เป็นไปได้ที่จะได้รับการพิจารณาในหัวข้อ - ดูศูนย์ช่วยเหลือ ฉันจะรอดูเวอร์ชั่นของกอล์ฟ! =)
Roujo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.