वर्तमान समय प्रिंट करें ... खाते में लीप सेकंड ले रहा है


9

(नोट: हालांकि संबंधित है, इस चुनौती नहीं का डुप्लिकेट है इस एक है क्योंकि यह छलांग सेकंड स्वचालित रूप से निर्धारित करने के बजाय अपने समय में हार्डकोड आवश्यकता है, और का डुप्लिकेट नहीं है यह एक है क्योंकि कठिनाई के सबसे बिना छलांग दूसरा skewing समय निर्धारित करने से आता है , कुछ ऐसा है जो ज्यादातर समय एपीआई डिफ़ॉल्ट रूप से नहीं करते हैं। इस प्रकार, एक समाधान उन चुनौतियों में से किसी एक समाधान से अलग दिखने की संभावना है।)

हम 2016 के अंत में आ रहे हैं, लेकिन यह ज्यादातर लोगों की अपेक्षा थोड़ा अधिक समय लेने वाला है। तो यहाँ एक चुनौती इस साल हमारी अतिरिक्त दूसरी का जश्न मना रही है।

यूटीसी में वर्तमान समय को आउटपुट, घंटे, मिनट, सेकंड के रूप में। (उदाहरण के लिए, मध्याह्न के लिए वैध आउटपुट स्वरूप शामिल होंगे 12:00:00और [12,0,0], प्रारूपण यहाँ महत्वपूर्ण रूप से महत्वपूर्ण नहीं है।)

हालांकि, एक मोड़ है: आपके कार्यक्रम को अतीत और भविष्य दोनों के लिए उचित रूप से लीप सेकंड को संभालना चाहिए । इसका मतलब है कि आपके प्रोग्राम को कुछ ऑनलाइन या स्वचालित रूप से अपडेट / अपग्रेड करने योग्य स्रोत से लीप सेकंड की एक सूची प्राप्त करनी होगी। यदि आप चाहें तो इसे प्राप्त करने के लिए आप इंटरनेट से जुड़ सकते हैं। हालाँकि, आप केवल उस URL से कनेक्ट हो सकते हैं जो इस चुनौती से पहले है (यानी आपके प्रोग्राम के अन्य हिस्से डाउनलोड नहीं करता है), और आप वर्तमान समय को निर्धारित करने के लिए कनेक्शन का उपयोग नहीं कर सकते हैं (विशेष रूप से: आपका प्रोग्राम कार्य करना चाहिए, भले ही कोई भी एक्सेस करने का प्रयास करे इंटरनेट एक पेज लौटाता है जो 24 घंटे तक बासी रहता है)।

वर्तमान समय के लिए अधिकांश ऑपरेटिंग सिस्टम के डिफॉल्ट API को प्रोग्राम से छुपाने के लिए लीप सेकंड के आसपास का समय कम करना होगा जो अन्यथा भ्रमित हो सकते हैं। इस प्रकार, इस चुनौती की मुख्य कठिनाई यह है कि पूर्ववत करने के लिए एक विधि या एपीआई की खोज की जाए, और यूटीसी में वर्तमान अपरिवर्तित वर्तमान समय में सही काम किया जाए।

सिद्धांत रूप में, आपका कार्यक्रम पूरी तरह से सही होना चाहिए अगर यह एक असीम रूप से तेज़ कंप्यूटर पर चलता है, और इसे चलाने के लिए जानबूझकर शून्य से अधिक समय नहीं लेना चाहिए। (बेशक, व्यवहार में, आपका कार्यक्रम अपूर्ण कंप्यूटर पर चलेगा, और इसलिए संभवतः तुरंत नहीं चलेगा। आपको परिणामों को अमान्य करने के बारे में चिंता करने की ज़रूरत नहीं है, लेकिन अपने कार्यक्रम की शुद्धता के लिए इस पर निर्भर नहीं होना चाहिए। )

आपके प्रोग्राम को इस बात की परवाह किए बिना काम करना चाहिए कि सिस्टम घड़ी किस टाइमज़ोन पर सेट है। (हालांकि, यह ऑपरेटिंग सिस्टम या पर्यावरण से जानकारी का अनुरोध कर सकता है कि किस समय का उपयोग किया जा रहा है, और मान सकते हैं कि उत्तर सटीक है।)

के तौर पर सबसे छोटा कार्यक्रम जीतता है। सौभाग्य!


जवाबों:


2

पॉवरशेल , 161 बाइट्स

(('{0:H:m:s}','23:59:60')[(($d=[datetime]::UtcNow).Ticks-6114960*98e9)/1e8-in((irm ietf.org/timezones/data/leap-seconds.list)-split'[^@]	|
'-match'^\d{9}')])-f$d

इसे ऑनलाइन आज़माएं! (यहाँ काम नहीं करता है, ऐसा लगता है कि TIO पहचान नहीं करता है irmऔर iwr, शायद यह एक सुरक्षा सुविधा है?)

लॉजिक टेस्ट (हार्डकोड कोड):

(('{0:H:m:s}','23:59:60')[(($d=[datetime]'1/1/2017 00:00:00').Ticks-6114960*98e9)/1e8-in((irm ietf.org/timezones/data/leap-seconds.list)-split'[^@]	|
'-match'^\d{9}')])-f$d

टिप्पणियाँ

रेगेक्स स्ट्रिंग में एक शाब्दिक TABऔर एक शाब्दिक लाइनब्रेक ( 0xA) है, जिससे मुझे उन्हें (1 बाइट बचाकर प्रत्येक) बचना नहीं था।

व्याख्या

Ietf फ़ाइल में दिया गया समय (लीप सेकंड) NTP सेकंड के बाद से सेकंड में है 1/1/1900 00:00:00। विंडोज पर, एक "टिक" एक सेकंड (10,000,000 टिक / सेकंड) का दस-दसवाँ हिस्सा है।

यदि आप इसमें एक पूर्णांक जोड़ते हैं [datetime], तो पूर्णांक मान को टिक के रूप में गिना जाता है, इसलिए मैं NTP युग के हार्डकोड टिक मूल्य का उपयोग कर रहा हूं, फिर इसे वर्तमान UTC समय के टिक मूल्य से घटाकर (जिसका मूल मान एक साथ असाइन किया गया है) को $d)।

उस हार्डकोड के टिक मूल्य को छोटा करने के लिए, मैंने कुछ शून्य (उनमें से 9) निकाले और 98 से विभाजित किया, फिर 98e9(98 * 10 9 ) से गुणा करें ।

उस घटाव का परिणाम एनटीपी युग के बाद से टिक्स में मूल्य है। यही कारण है कि द्वारा विभाजित हो जाता है 1e8(नहीं 1e9(एक तरह से) एनटीपी अवधि के बाद सेकंड में मूल्य प्राप्त करने के कारण है कि एक पल में स्पष्ट हो जाएगा के लिए,)। यह वास्तव में 10 के कारक से छोटा होगा।

दस्तावेज़ को IETF से पुनर्प्राप्त करने के बजाय, इसे पहले लाइनों में विभाजित करने के बजाय, फिर टाइमस्टैम्प के साथ लाइनों को संसाधित करें, मैंने दोनों लाइन ब्रेक और TABवर्णों पर विभाजित करने का निर्णय लिया , क्योंकि टाइमस्टैम्प के बाद यही आता है। फ़ाइल में एक एकल त्रुटिपूर्ण लाइन के कारण, अकेले उस अतिरिक्त टाइमस्टैम्प को शामिल किया जाएगा जिसे हम नहीं चाहते हैं। रेखा इस तरह दिखती है:

#@	3707596800

इसलिए मैंने रेगेक्स को विभाजित करने के लिए बदल दिया [^@]\t(किसी भी चरित्र का @पालन नहीं किया जाता है TAB) जो उस लाइन को बाहर करने के लिए काम करता है, लेकिन 0प्रत्येक टाइमस्टैम्प में अंतिम का उपभोग करना भी समाप्त करता है।

इसीलिए मैं लापता होने की वजह से 1e8नहीं 1e9, बल्कि उससे विभाजित करता हूं 0

वर्तमान टाइमस्टैम्प की जाँच की जाती है यह देखने के लिए कि यह न्यूटर्ड लीप सेकंड टाइमस्टैम्प की सूची के अंदर मौजूद है। यह पूरी प्रक्रिया जो मैंने वर्णित की है [], वह [bool]एक्‍सेस एक्‍सेसर के अंदर है , इसलिए परिणामी मान ए 0( $false) या 1( $true) के लिए जमा हो जाता है । जिस सरणी में हम अनुक्रमण कर रहे हैं, उसमें दो तत्व शामिल हैं: समय प्रदर्शित करने के लिए एक प्रारूप स्ट्रिंग, और एक हार्डकोड 23:59:60। उपर्युक्त तुलना की सत्यता यह निर्धारित करती है कि किसे चुना जाएगा, और इसे इसके परिचालक -fके रूप में पूर्व निर्धारित वर्तमान तिथि के साथ प्रारूप ऑपरेटर में खिलाया जाता है $d


एक छलांग के बाद यह दूसरा क्या छापता है? मैं लीप सेकंड के लिए तर्क का पालन कर सकता हूं, लेकिन यह सुनिश्चित नहीं कर सकता कि मैं किसी भी समय तर्क का पालन कर सकता हूं। (क्या विंडोज स्वाभाविक रूप से एक लीप सेकंड और निम्न दूसरे को 00:00:00 के रूप में प्रदर्शित करता है?)

@ ais523 यह लीप सेकंड के बाद दूसरे को प्रदर्शित करेगा जैसा भी सिस्टम समय है। विंडोज लीप सेकंड के बारे में नहीं जानता है, इसलिए घड़ी सिंक या मैनुअल सेटिंग द्वारा सही होने तक 1 सेकंड तेज होगी। आवश्यकताओं को देखते हुए मैं वास्तव में इसके लिए समायोजित नहीं कर सकता, क्योंकि यह निर्धारित करना संभव नहीं है कि सिस्टम समय सही है या नहीं, बाहरी समय स्रोत का उपयोग किए बिना, जो प्रतिबंधित है। मैं जो सबसे अच्छा कर सकता हूं, उसके बारे में कोड जोड़ें जो एनटीपी सिंक को मजबूर करता है क्योंकि यह समय मुद्रित करने के बाद, जो निश्चित रूप से विफल हो सकता है (नेटवर्क त्रुटि, कोई समय स्रोत सेट, आदि), अगर यह भी अनुमति है।
२०:
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.