सूर्य कितनी दूर है?


20

परिचय

tl; डॉ

पृथ्वी से सूर्य की वर्तमान दूरी का लगातार उत्पादन।


सरलीकृत, सूर्य के चारों ओर पृथ्वी की कक्षा एक दीर्घवृत्त है। इसलिए दोनों के बीच वास्तविक दूरी लगातार बदल रही है। इस सूत्र का उपयोग करके किसी भी दिन इस दूरी की गणना की जा सकती है :

d / AU = 1-0.01672 कॉस (0.9856 (दिन -4))

समीकरण को निम्न भागों 2 में विभाजित किया जा सकता है :

  • 11 एयू (खगोलीय इकाई) का प्रतिनिधित्व करता है , बराबर है149,597,870.691 km
  • 0.01672है कक्षीय सनक पृथ्वी और सूर्य के बीच
  • cosनिश्चित रूप से कोसाइन फ़ंक्शन है, लेकिन रेडियन की बजाय डिग्री में तर्क के साथ
  • 0.9856है 360 ° / 365.256363 दिन , एक वर्ष में एक पूर्ण रोटेशन, जहां 365.256363एक नाक्षत्र वर्ष की लंबाई है, मतलब सौर दिनों में
  • day वर्ष का दिन है [1-365]
  • 44 से 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

इनपुट

इस चुनौती का कोई इनपुट नहीं है।


यदि आपकी भाषा को वर्तमान समय नहीं मिल सकता है, तो आप इसे अपने प्रोग्राम के इनपुट के रूप में प्राप्त कर सकते हैं। मान्य इनपुट टाइमस्टैम्प या पूर्ण तिथि-समय के तार हैं जो भाषा को सबसे अच्छी तरह सूट करते हैं। अकेले वर्तमान दिन (जैसे 55 जनवरी को या 5.25उसी दिन शाम 6 बजे) को पास करने की अनुमति नहीं है।

उत्पादन

पृथ्वी से सूर्य की वर्तमान दूरी का उत्पादन करें:

  • में मूल्य का उत्पादन km
  • मूल्य को कम से कम हर सेकंड अपडेट करें ।

उदाहरण आउटपुट:

152098342

यदि यह आपकी बाइट गिनती नहीं बढ़ाता है, तो आप परिणाम को बहुत सुंदर प्रिंट कर सकते हैं:

152,098,342
152,098,342 km

आवश्यकताएँ

  • आप एक कार्यक्रम या एक समारोह लिख सकते हैं। यदि यह एक अनाम फ़ंक्शन है, तो कृपया इसे कैसे लागू करें, इसका एक उदाहरण शामिल करें।
  • यह इसलिए बाइट्स में सबसे कम जवाब जीतता है।
  • मानक खामियों को अस्वीकार कर दिया जाता है।

उदाहरण कार्यान्वयन

मैंने जावास्क्रिप्ट में एक उदाहरण कार्यान्वयन तैयार किया है। यह न तो प्रतिस्पर्धी है और न ही गोल्फ।

// 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 का उपयोग करते हैं तो कृपया अपने उत्तर में एक नोट जोड़ें।

2 अधिक जानकारी के लिए भौतिकी में " वर्ष के एक निश्चित दिन पर पृथ्वी-सूर्य की दूरी " देखें


प्रोग्रामिंग भाषाओं को क्या करना चाहिए जो वर्तमान समय तक नहीं पहुंच सकता है? बीएफ आदि की तरह?
दोष

3
मेरा मानना ​​है कि Math.cosरेडियंस का उपयोग करने के बाद से आपका उदाहरण गलत है । और चूंकि यह सूत्र बहुत अनुमानित है, इसलिए आपको इस बात पर स्पष्ट होना होगा कि उत्तर कैसे सत्यापित किए जाने हैं।
grc

@grc मैंने अपने उदाहरण में त्रुटि को ठीक किया है - मुझे इसे इंगित करने के लिए धन्यवाद।
16

@flawr आप अपने प्रोग्राम के इनपुट के रूप में समय प्राप्त कर सकते हैं। प्रश्न तदनुसार अद्यतन किया जाता है।
16

1
मुझे यकीन है कि गणितज्ञ के पास इसके लिए एक अंतर्निहित है!
सेरगॉयल

जवाबों:


5

टीआई-बेसिक, 38 बाइट्स

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

एक TI-84 + श्रृंखला कैलकुलेटर के लिए। इसे नाम दें prgmA। ध्यान दें कि यह कुछ हज़ार पुनरावृत्तियों के बाद स्टैक को ओवरफ्लो करता है; While 1:...:Endदो अतिरिक्त बाइट्स के लिए एक समस्या है, तो इसके बजाय का उपयोग करें ।

यह संदर्भ के लिए 1 जनवरी, 1997, 23:16 UTC पर पेरीहेलियन का उपयोग करता है, और अगले कुछ वर्षों के लिए कुछ दर्जन किलोमीटर (सटीकता के लगभग 7 अंक) के भीतर सटीक है।


अब यह छोटा है। कुडोस!
इन्सर्टसर्नमीयर

5

जावा - 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 सेकंड हैं और जीएमटी नहीं, बल्कि स्थानीय समय का उपयोग कर रहा है। आउटपुट प्रति सेकंड एक से अधिक बार होता है। सुनिश्चित नहीं है कि आयात विवरणों को बाइट गणना में शामिल किया जाना चाहिए।

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){}}

जावा निश्चित रूप से सबसे गोल्फ की भाषा नहीं है। :)

@Insertusernamehere की बदौलत कुछ बाइट्स निकाले


1
अच्छा लगा। नहीं 1.0बन सका 1? और क्या आप अग्रणी 0को हटा सकते हैं 0.01672और 0.9856?
25'16

बहुत सच है, कि मुझे इस प्रश्न से कॉपी-पेस्ट के लिए क्या मिलता है: पी मैं कुछ और बाइट्स छोड़ सकता था अगर मैंने इस्तेमाल किया, import staticलेकिन यह "धोखा" हो सकता है ... मैं अभी भी यहां नया हूं।
राबर्ट बेन्सन

क्यों System.err?
सुपरजेडि २२४

मैंने इस्तेमाल किया System.errइसलिए कोई बफरिंग नहीं होगी। मुझे पता printlnहै कि वैसे भी तुरंत प्रिंट करना चाहिए, लेकिन ऐसा हमेशा नहीं होता है। बेशक यह बाइट काउंट को बदले बिना System.out में परिवर्तित किया जा सकता है :)
रॉबर्ट बेन्सन

2
मैंने देखा है कि कई लोग डिग्री से रेडियन में बदलना भूल रहे हैं। मैं उन पर टिप्पणी करूंगा, लेकिन मैं बहुत कम प्रतिनिधि के साथ एक नौसिखिया हूं: पी
रॉबर्ट बेन्सन

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 (चार दिन)

5022635.53 ≌ (365.256363 * 24 * 3600) / (2π) (वर्ष 2 सेकंड में सेकंड)


प्रोग्रामिंग पहेलियाँ और कोड गोल्फ में आपका स्वागत है। यह एक अच्छा समाधान है, +1। हालाँकि, यह उत्तर को बेहतर कर सकता है यदि आपने एक असंबद्ध और टिप्पणी संस्करण जोड़ा है, जो यह समझाता है कि आपने क्या किया है, या यहां तक ​​कि कोड से पहले एक साधारण टिप्पणी भी जोड़ दी है।
wizzwizz4

मुझे बाइट की गिनती के लिए 107 मिले।
मॉर्गन थ्रैप

सही है, मैंने अंतिम नई पंक्ति को शामिल किया है।
पचोलिक

आप imports को मिलाकर 7 बाइट्स बचा सकते हैं import time,math:। इसके अलावा, यदि आप पायथन 2 का उपयोग करते हैं तो आप कोष्ठक को छोड़ सकते हैं print
पुरकाकूदरी

यह भी सच है, उन सभी PEP के साथ मैं भूल गया हूँ यह संभव है :)
pacholik

3

बैश / कोरुटिल्स / बीसी, 101 बाइट्स

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

यह 4 जनवरी से सेकंड में ऑफ़सेट की गणना करता है, इसलिए रेडियन में बदलने के लिए एक संगत स्थिरांक का उपयोग करता है। आधा साल मोटे तौर पर पाई में परिवर्तित होता है:

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

शेष गणना प्रश्न से सीधे है।


अच्छी नौकरी। मुझे आश्चर्य हुआ कि bcक्या इसके लिए उपयोगी हो सकता है। मैंने देखा कि dcआपके हेडर में है, लेकिन bcकोड में उपयोग करें । मैं अक्सर दोनों को भ्रमित करता हूं।
रॉबर्ट बेन्सन

1
धन्यवाद, @ रॉबर्ट - मैंने शीर्षक तय कर लिया है। मैंने डीसी को देखना शुरू कर दिया, तब मुझे महसूस हुआ कि मुझे bc की मैथलिब की जरूरत है, इसलिए मेरे दिमाग में दोनों कैलकुलेटर गलत समय पर थे!
स्पाइट २

हाँ, वहाँ किया गया है, कि किया। मैं हमेशा भूल जाता हूं कि कौन सा है।
रॉबर्ट बेन्सन

2

एफ #, 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")

यह एक एफ # स्क्रिप्ट है जो एफ # इंटरएक्टिव में अच्छा चलता है। सादगी के लिए, "निरंतर आउटपुट" की आवश्यकता को शाब्दिक स्तरों पर ले जाया जाता है, हालांकि मैंने आउटपुट को एक नई लाइन पर बनाने के लिए एक बाइट खो दिया, ताकि यह बहुत बुरा न हो । = 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}इस साल 5 जनवरी का प्रतिनिधित्व करता है, और ...~DateDifference~...लौकिक दूरी देता है।

Dynamic[...,UpdateInterval->1] प्रति सेकंड एक बार अभिव्यक्ति अपडेट करें।


बस आपको याद दिलाने के लिए, आपको किमी में उत्तर का उत्पादन करने की आवश्यकता है, न कि एयू। मुझे लगता है कि Mathematica में अंतर्निहित कन्वर्टर्स हैं ताकि आप यूनिट रूपांतरण के लिए कुछ बाइट्स बचा सकें, हाँ?
बुसकुक्सुआन

@busukxuan मैंने सूत्र के गुणांक को गुणा किया है।
njpipeorgan

ओह स्री मैं इससे चूक गया। यह 4 महत्वपूर्ण आंकड़ों में होने की उम्मीद नहीं की थी।
बुसुकुआन

2
वैकल्पिक रूप से,Dynamic[Round[PlanetData["Earth", "DistanceFromSun"]~QuantityMagnitude~"Kilometers"]]
२०१२ आर्कम्पियन २ '

1

पायथ, 51 बाइट्स

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

वैकल्पिक सूत्र

d / AU = 1 - 0.01672 cos (2 time [perihelion के बाद का समय] / [कक्षीय अवधि])
यह सूत्र मूल रूप से OP के सूत्र के समान है, सिवाय इसके कि किसी संदर्भ के रूप में किसी भी perihelion का उपयोग करने में सक्षम होने के लिए सामान्यीकृत है।

ओपी के सूत्र में [समय के बाद से पेरिहेलियन] (दिन - 4) और (2π रेड / [कक्षीय अवधि]) 0.9856deg / दिन के रूप में पूर्व-गणना की गई है।

अपने समाधान में मैं यूनिक्स युग के निकटतम पेरीहेलियन का उपयोग कर रहा हूं, 2 एन डी जनवरी 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 just (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.0और 100.0कुछ बाइट्स को बचाने के लिए?
सम्मिलित करें

केवल एक चीज जिससे मैं चिंतित हूं वह यह है कि यह अब एक फ्लोटिंग पॉइंट डिवीजन नहीं होगा। मैंने रखा, .0ताकि वे फ़्लोटिंग पॉइंट होंगे और पूर्णांक नहीं।
linkian209

0

सी, 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
प्रोग्रामिंग पहेलियाँ और कोड गोल्फ में आपका स्वागत है! हालांकि यह एक सही उत्तर की तरह दिखता है, लेकिन यह बहुत अधिक गोल्फ नहीं लगता है। [कोड-गोल्फ] टैग के साथ सवालों के जवाब के लिए, उत्तर-विषय पर विचार किए जाने के लिए उनके आकार को कम करने के लिए यथासंभव प्रयास करने की आवश्यकता है - सहायता केंद्र देखें । मैं गोल्फ संस्करण को देखने के लिए उत्सुक हूँ! =)
रज्जो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.