सूर्योदय और सूर्यास्त


12

मैं थोड़ा रोमांटिक हूं, मैं अपनी पत्नी को उस स्थान पर स्थित सूर्योदय और सूर्यास्त देखने के लिए बाहर ले जाना पसंद करता हूं। इस अभ्यास के लिए मान लें कि मेरे पास कोड नहीं है जो मुझे सूर्यास्त या सूर्योदय के समय को बता सकता है कि मैं किस तिथि, अक्षांश और देशांतर में होऊंगा।

आपका कार्य, कोडर, सबसे छोटा कोड संभव बनाना है जो एक दशमलव अक्षांश और देशांतर लेता है (डिग्री एन और डब्ल्यू में लिया जाता है, इसलिए डिग्री एस और ई को नकारात्मक के रूप में लिया जाएगा) और प्रारूप YYYY-MM-DD में एक तारीख 1 जनवरी, 2000 से) और यह सूर्योदय और सूर्यास्त के लिए 210 प्रारूप में दो बार थूक देगा।

उदा। सिडनी, ऑस्ट्रेलिया में आज के लिए

riseset -33.87 -151.2 2013-12-27

05:45 20:09

बोनस: -100 यदि आप उन्नयन -100 में कारक कर सकते हैं यदि आप दिन के उजाले की बचत कर सकते हैं

कोड प्रासंगिक समय क्षेत्र में अक्षांश और देशांतर या क्लाइंट मशीन के अपने समय क्षेत्र में आधारित इनपुट में निर्दिष्ट समय से बाहर थूकना चाहिए।


3
रुको, क्या, हमें एक [अक्षांश x देशांतर] => [समयक्षेत्र] देखने की आवश्यकता है? क्या हमें उसके लिए एक डेटा फ़ाइल मिलती है? या एक सर्वर जिसे हम एक्सेस कर सकते हैं? या ऐसी कोई भाषा है जिसमें इस तरह का सामान बनाया गया है? क्या आप हमें बता सकते हैं या हमें समय-सीमा को याद करना होगा? क्या सटीक करने के लिए? हमें यह डेटा कहां से मिलेगा? क्या आपको लगता है कि यह डेटा अधिकांश कोड लंबाई लेगा? निर्देशांक के बारे में क्या है जो टाइमजोन सीमा पर बिल्कुल गिरता है? कहो, भौगोलिक ध्रुव? इसके अलावा, जब ध्रुवीय क्षेत्र में रात / दिन के दौरान इनपुट एक ध्रुवीय क्षेत्र है, तो किस व्यवहार की अनुमति है? बाहर के निर्देशांक के बारे में क्या?
जॉन ड्वोरक

मैं एक आदर्श क्षेत्र के ऊपर एक बिंदु के आधार पर क्षितिज की गणना करने के लिए चुनौती को पसंद करूंगा , लेकिन मुझे संबद्ध चुनौती को खोजने, हाथ से सेक करने, प्रोग्राम को डिकॉप्रेस करने और फिर एक टाइमज़ोन लुकअप मैप में देखने से नफरत है। जब तक, निश्चित रूप से, हम आदर्शीकृत टाइमज़ोन का उपयोग कर सकते हैं (ऑफसेट को चुना जाता है ताकि सूरज दोपहर के दौरान सबसे अधिक हो, फिर इसे निकटतम घंटे में भी गोल किया जाता है)।
जॉन डेवार्क

1
@JDDvorak आप जो कुछ भी कर सकते हैं उसका उपयोग करें, यदि आप जिस भाषा का उपयोग करते हैं वह ग्राहक के समय क्षेत्र का शोषण कर सकती है तो हर तरह से ऐसा करें ...
WallyWest

1
ध्रुवीय क्षेत्रों के लिए वांछित व्यवहार क्या है जब यह एक ध्रुवीय दिन / रात है?
जॉन ड्वोरक

1
यहाँ एक उपकरण है जो बिल्कुल वैसा ही करता है: weatherimages.org/latlonsun.html
Eisa Adil

जवाबों:


4

मैंने इसे लिखने में काफी समय बिताया है:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from math import *


class RiseSet(object):

    __ZENITH = {'official': 90.833,
                'civil': '96',
                'nautical': '102',
                'astronomical': '108'}

    def __init__(self, day, month, year, latitude, longitude, daylight=False,
                 elevation=840, zenith='official'):
        ''' elevation is set to 840 (m) because that is the mean height of land above the sea level '''

        if abs(latitude) > 63.572375290155:
            raise ValueError('Invalid latitude: {0}.'.format(latitude))

        if zenith not in self.__ZENITH:
            raise ValueError('Invalid zenith value, must be one of {0}.'.format
                            (self.__ZENITH.keys()))

        self.day = day
        self.month = month
        self.year = year
        self.latitude = latitude
        self.longitude = longitude
        self.daylight = daylight
        self.elevation = elevation
        self.zenith = zenith

    def getZenith(self):
        return cos(radians(self.__ZENITH[self.zenith]))

    def dayOfTheYear(self):
        n0 = floor(275*self.month/9)
        n1 = floor((self.month + 9) / 12)
        n2 = (1 + floor((self.year - 4*floor(self.year/4) + 2) / 3))
        return n0 - (n1*n2) + self.day - 30

    def approxTime(self):
        sunrise = self.dayOfTheYear() + ((6 - (self.longitude/15.0)) / 24)
        sunset = self.dayOfTheYear() + ((18 - (self.longitude/15.0)) / 24)
        return (sunrise, sunset)

    def sunMeanAnomaly(self):
        sunrise = (0.9856 * self.approxTime()[0]) - 3.289
        sunset = (0.9856 * self.approxTime()[1]) - 3.289
        return (sunrise, sunset)

    def sunTrueLongitude(self):
        sma = self.sunMeanAnomaly()
        sunrise = sma[0] + (1.916*sin(radians(sma[0]))) + \
                  (0.020*sin(radians(2*sma[0]))) + 282.634

        if sunrise < 0:
            sunrise += 360
        if sunrise > 360:
            sunrise -= 360

        sunset = sma[1] + (1.916*sin(radians(sma[1]))) + \
                 (0.020*sin(radians(2*sma[1]))) + 282.634

        if sunset <= 0:
            sunset += 360
        if sunset > 360:
            sunset -= 360

        return (sunrise, sunset)

    def sunRightAscension(self):
        stl = self.sunTrueLongitude()
        sunrise = atan(radians(0.91764*tan(radians(stl[0]))))

        if sunrise <= 0:
            sunrise += 360
        if sunrise > 360:
            sunrise -= 360

        sunset = atan(radians(0.91764*tan(radians(stl[1]))))

        if sunset <= 0:
            sunset += 360
        if sunset > 360:
            sunset -= 360

        sunrise_stl_q = (floor(stl[0]/90)) * 90
        sunrise_ra_q = (floor(sunrise/90)) * 90
        sunrise = sunrise + (sunrise_stl_q - sunrise_ra_q)
        sunrise = sunrise/15.0

        sunset_stl_q = (floor(stl[1]/90)) * 90
        sunset_ra_q = (floor(sunset/90)) * 90
        sunset = sunrise + (sunset_stl_q - sunset_ra_q)
        sunset /= 15.0

        return (sunrise, sunset)

    def sunDeclination(self):
        sunrise_sin_dec = 0.39782 * sin(radians(self.sunTrueLongitude()[0]))
        sunrise_cos_dec = cos(radians(asin(radians(sunrise_sin_dec))))

        sunset_sin_dec = 0.39782 * sin(radians(self.sunTrueLongitude()[1]))
        sunset_cos_dec = cos(radians(asin(radians(sunrise_sin_dec))))

        return (sunrise_sin_dec, sunrise_cos_dec,
                sunset_sin_dec, sunset_cos_dec)

    def sunHourAngle(self):
        sd = self.sunDeclination()
        sunrise_cos_h = (cos(radians(self.getZenith())) - (sd[0]* \
                         sin(radians(self.latitude))) / (sd[1]* \
                         cos(radians(self.latitude))))
        if sunrise_cos_h > 1:
            raise Exception('The sun never rises on this location.')

        sunset_cos_h = (cos(radians(self.getZenith())) - (sd[2]* \
                         sin(radians(self.latitude))) / (sd[3]* \
                         cos(radians(self.latitude))))
        if sunset_cos_h < -1:
            raise Exception('The sun never sets on this location.')

        sunrise = 360 - acos(radians(sunrise_cos_h))
        sunrise /= 15.0

        sunset = acos(radians(sunrise_cos_h))
        sunset /= 15.0

        return (sunrise, sunset)

    def localMeanTime(self):
        sunrise = self.sunHourAngle()[0] + self.sunRightAscension()[0] - \
                 (0.06571*self.approxTime()[0]) - 6.622
        sunset = self.sunHourAngle()[1] + self.sunRightAscension()[1] - \
                 (0.06571*self.approxTime()[1]) - 6.622
        return (sunrise, sunset)

    def convertToUTC(self):
        sunrise = self.localMeanTime()[0] - (self.longitude/15.0)

        if sunrise <= 0:
            sunrise += 24
        if sunrise > 24:
            sunrise -= 24

        sunset = self.localMeanTime()[1] - (self.longitude/15.0)

        if sunset <= 0:
            sunset += 24
        if sunset > 24:
            sunset -= 24

        return (sunrise, sunset)

    def __str__(self):
        return None

अब यह अभी तक कार्यात्मक नहीं है (मैंने कुछ गणनाओं को खराब कर दिया है) - मैं इसे पूरा करने के लिए बाद में (यदि मैं अभी भी साहस करूँगा) इसे वापस लेने / टिप्पणी करने के लिए आऊंगा ।

इसके अलावा, कुछ रोचक संसाधन जो मुझे इस विषय पर शोध करते समय मिले:


3
मैंने देखा कि आपकी टिप्पणी # It's late, I'm tired, and OP is a prick for asking me to do this. इस कार्य को करने के लिए कोई बाध्यता नहीं थी ... कृपया अपने कोड में इस तरह की टिप्पणियां न डालें ... यह मेरे सहित अन्य कोडर के साथ अनुकूल रूप से नहीं बैठता है। मैं इस तथ्य की प्रशंसा करता हूं कि आपने इसे लाल गर्म दिया, और अन्य लिंक जो आपने प्रदान किए हैं, लेकिन कृपया इस तरह की टिप्पणियों का कभी भी उपयोग न करें ...
WallyWest

@ Eliseod'Annunzio मेरे पास आपकी क्षमायाचना है।
डेनेब

@ Eliseod'Annunzio मैंने आपको अपमानित करने का इरादा नहीं किया। मुझे अनुसंधान और कोड के लिए मुझे एक शानदार विचार देने के लिए धन्यवाद देना चाहूंगा। अब मैं इसे स्व-स्थायी अजगर मॉड्यूल में बदलना चाहता हूं (sys तर्कों के साथ और इसी तरह)। जैसा कि मैंने पहले सोचा था कि यह थोड़ा अधिक जटिल हो जाता है, लेकिन मैं इसे बंद करने का इरादा रखता हूं। फिर से धन्यवाद।
डेनेब

@ एलेक्स, क्या आपको पता है कि यह चुनौती एक साल पुरानी है? मुझे पूरा यकीन है कि वह जीता था।
mbomb007

@ mbomb007: एहसास नहीं हुआ।
एलेक्स ए।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.