क्या हम तब भी हैं?


22

मैं एक समय यात्री हूं, और मैं समय बीतने के साथ जुनूनी हूं। मुझे विशेष रूप से उन क्षणों से प्यार है जब घड़ी के हाथ 12 पास होते हैं, या जब मैं अपने कैलेंडर के अगले पृष्ठ पर फ़्लिप करने के लिए मिलता हूं, या जब हर कोई चिल्लाता है "नया साल मुबारक हो!"

कृपया मुझे यह दिखाने के लिए एक कार्यक्रम लिखें कि मैं इस तरह के अंतिम क्षण से अगले तक कितनी दूर हूं, एक प्रगति पट्टी के रूप में। उदाहरण के लिए, अगर मैं यह कहूं कि यह समय 09:12 है, तो इसे प्रिंट करना चाहिए:

09:00 ####---------------- 10:00

अगर मैं यह कहूं कि यह महीना मई, 1982 का है, तो इसे छापना चाहिए:

1982-01 #######------------- 1983-01

क्या मैंने उल्लेख किया है कि मैं एक समय यात्री हूं? मैं 0 AD के पहले मिलिसेकंड से लेकर 9999 ईस्वी के अंतिम मिलिसेकंड तक कहीं भी यात्रा करता हूं, इसलिए कार्यक्रम को उस सीमा में किसी भी तारीख और समय को संभालने की आवश्यकता है।

इनपुट

  • इनपुट निम्न स्वरूपों में से एक में होगा:

    • YYYY-MM-DDThh:mm:ss.sss
    • YYYY-MM-DDThh:mm:ss
    • YYYY-MM-DDThh:mm
    • YYYY-MM-DDThh
    • YYYY-MM-DD
    • YYYY-MM

    ये एकमात्र प्रारूप हैं जिन्हें संभालने की आवश्यकता है। प्रत्येक भाग में वास्तव में दिखाए गए अंकों की संख्या होगी, जिसका अर्थ है कि भिन्नात्मक सेकंड में अनुगामी शून्य (जैसे .120, कभी नहीं .12) हो सकते हैं। Tएक शाब्दिक पत्र "टी" समय से तारीख परिसीमन है। घंटे 24 घंटे की घड़ी पर हैं।

  • महीने और दिन 1-आधारित (नीचे इस पर अधिक) हैं।

  • अमान्य और आउट-ऑफ-रेंज इनपुट को नियंत्रित करने की आवश्यकता नहीं है।

  • प्रोग्रामर के विवेक पर, इनपुट में एक एकल अनुगामी न्यूलाइन हो सकती है।

प्रगति बार गणित

कार्यक्रम दिए गए इनपुट में कम से कम- और दूसरी-सबसे महत्वपूर्ण इकाइयों से संबंधित है। उदाहरण के लिए, यदि इनपुट में दिन-स्तर की सटीकता (जैसे 2016-12-14) है, तो प्रगति बार इंगित करेगा कि इनपुट महीने में दिनों के किस अनुपात में क्या शेष है।

प्रगति बार में 20 इकाइयाँ (वर्ण) होंगी और प्रतिनिधित्व अनुपात 120 के निकटतम वेतन वृद्धि के लिए होगा । उदाहरण के लिए, दिया 2016-12-14T12:28, प्रगति बार प्रदर्शित करेगा दौर ( 28 / 60 × 20) = 9 20 की इकाइयों "से भर दिया।"

1-आधारित महीने और दिन

हालांकि 1 दिसंबर तक दिन (उदाहरण के लिए) है 01में 2016-12-01, गणना के प्रयोजन के लिए यह माह के 0 दिन है, क्योंकि छोटा कर दिया इकाइयों दिन के 0 घंटे के 0 मिनट की 0 मिलीसेकंड मतलब। दूसरे शब्दों में, 2016-12-01है 0 / 31 दिसंबर के माध्यम से रास्ते से और 2016-12-02है 1 / 31 , और इतने पर।

इसी तरह, 2016-01जनवरी के 0 दिन के 0 मिलीसेकंड, इसलिए गणना में यह है 0 / 12 , जो साधन 2016-12है 11 / 12

हां, इसका मतलब है कि महीने और दिन पूरी तरह से प्रगति पट्टी को कभी नहीं भरेंगे।

भिन्न महीने की अवधि और लीप वर्ष

अलग-अलग महीनों में दिनों की अलग-अलग संख्या होती है और आउटपुट को इसे प्रतिबिंबित करना चाहिए-जिसमें लीप वर्ष भी शामिल है। 6 फरवरी, 2017 के लिए प्रगति पट्टी 6 फरवरी, 2016 (या दोनों वर्षों के 6 जनवरी) के लिए प्रगति पट्टी से अलग होगी।

कई तरह का

उत्पादन

कार्यक्रम (या फ़ंक्शन) को एक क्षैतिज रूप से उन्मुख 20-वर्ण प्रगति पट्टी को प्रिंट (या एक स्ट्रिंग के रूप में लौटना) करना चाहिए जो "उस समय के लिए" भर गया है जो समय बीत चुका है और "खुला" है। इसे "बाएं से दाएं" भरना चाहिए।

प्रगति बार के पास बाईं ओर एक लेबल होना चाहिए, जिसे अवधि की शुरुआत के रूप में गिना जा रहा है और इसके दाईं ओर एक और अगली अवधि की शुरुआत दिखा रहा है, उसी प्रारूप में इनपुट के रूप में (लेकिन केवल दो इकाइयों को सटीक दिखा रहा है)। हमारे उदाहरण के लिए 2016-12-14वैध आउटपुट होगा:

12-01 #########----------- 01-01

यहां प्रत्येक संभावित अवधि के लिए मान्य लेबल प्रारूप दिए गए हैं:

  • महीने: YYYY-MM
  • दिन: MM-DD
  • घंटे: DDThh
  • मिनट: hh:mm
  • सेकंड: mm:ss
  • मिलीसेकंड: ss.sss

कोई अतिरिक्त इकाइयाँ लेबल में शामिल नहीं की जा सकती हैं, और किसी को भी छोड़ा नहीं जा सकता है।

आउटपुट नोट

  • प्रगति बार की "भरी हुई" इकाइयों को एक #चरित्र द्वारा दर्शाया जाएगा । "ओपन" इकाइयों द्वारा प्रतिनिधित्व किया जाएगा -
  • प्रगति पट्टी और प्रत्येक लेबल के बीच बिल्कुल एक स्थान होना चाहिए।
  • अग्रणी या अनुगामी रिक्त स्थान और / या एकल अनुगामी न्यूलाइन की अनुमति है।

जीतना

यह । बाइट्स में सबसे छोटा कोड जीतता है। मानक नियम लागू होते हैं। मानक खामियों को मना किया।

उदाहरण

Input                      Output
-----------------------    -------------------------------------
2016-12-12T12:17           12:00 ######-------------- 13:00
2016-12-12                 12-01 #######------------- 01-01
0000-01-01T00:00:00.000    00.000 -------------------- 01.000
0000-01-01T00:00           00:00 -------------------- 01:00
1899-12-31T23              31T00 ###################- 01T00
1899-12-31                 12-01 ###################- 01-01
1899-12                    1899-01 ##################-- 1900-01
1982-05-15T17:15           17:00 #####--------------- 18:00
1982-05-15T17              15T00 ##############------ 16T00
1982-05                    1982-01 #######------------- 1983-01
9999-12-31T23:59:59.999    59.000 #################### 00.000
9999-12                    9999-01 ##################-- 10000-01
2000-01-06                 01-01 ###----------------- 02-01
2000-02-06                 02-01 ###----------------- 03-01
2001-02-06                 02-01 ####---------------- 03-01
1742-09-10                 09-01 ######-------------- 10-01

4
क्या हमें लीप सेकंड के बारे में चिंता करने की ज़रूरत है?
रिले

@ रिले अच्छा सवाल। नंबर
जॉर्डन

2
मुझे लगता है कि डेलाइट सेविंग को नजरअंदाज कर दिया गया है, क्योंकि कोई भी मानकीकृत रूप नहीं है?
1597 पर CAD97

3
@ CAD97 अच्छा सवाल। तुम सही हो। डीएसटी वास्तव में समय यात्रियों के लिए चीजों को जटिल करता है इसलिए हम इसे अनदेखा करते हैं।
जॉर्डन

"1899-12-31T23" उदाहरण इनपुट प्रारूपों की प्रदान की गई सूची के अनुसार मान्य नहीं है, जो "1982-05-15T17" के लिए समान है। कृपया अपना परीक्षण डेटा सत्यापित करें।
ज़ेपेलिन

जवाबों:


4

जावास्क्रिप्ट, 282 बाइट्स

(x,v=x.split(/\D/g),l=v.length-2,[a,b,c,d]=("10e5,01,-,12,01,-,"+new Date(v[0],v[1],0).getDate()+",00,T,24,00,:,60,00,:,60,000,.,1000").split`,`.slice(l*3,l*3+4),t=(v[l+1]-b)/d*20+.5|0,n=v[l],o=((n|0)+1)%a,r=l?('0'+o).slice(-2):o)=>n+c+b+' '+'#'.repeat(t)+'-'.repeat(20-t)+' '+r+c+b

सभी टेस्ट पास करता है

(
x,
v=x.split(/\D/g),
l=v.length-2,
[a,b,c,d]=("10e5,01,-,12,01,-,"+new Date(v[0],v[1],0).getDate()+",00,T,24,00,:,60,00,:,60,000,.,1000").split`,`.slice(l*3,l*3+4),
t=(v[l+1]-b)/d*20+.5|0,
n=v[l],
o=((n|0)+1)%a,
r=l?('0'+o).slice(-2):o
) =>n+c+b+' '+'#'.repeat(t)+'-'.repeat(20-t)+' '+r+c+b

टेस्ट फ़ंक्शन पास के लिए कुछ भी प्रिंट नहीं करता है, असफल होने के लिए मूल्य।

function test(value,expected){
    if (f(value)!=expected)
    {
        console.log(value);
        console.log(f(value));
        console.log(expected);
     }
}

परीक्षण के मामले:

test('2016-12-12T12:17','12:00 ######-------------- 13:00')                 ;
test('2016-12-12','12-01 #######------------- 01-01')                       ;
test('0000-01-01T00:00:00.000','00.000 -------------------- 01.000')        ;
test('0000-01-01T00:00','00:00 -------------------- 01:00')                 ;
test('1899-12-31T23','31T00 ###################- 01T00')                    ;
test('1899-12-31','12-01 ###################- 01-01')                       ;
test('1899-12','1899-01 ##################-- 1900-01')                      ;
test('1982-05-15T17:15','17:00 #####--------------- 18:00')                 ;
test('1982-05-15T17','15T00 ##############------ 16T00')                    ;
test('1982-05','1982-01 #######------------- 1983-01')                      ;
test('9999-12-31T23:59:59.999','59.000 #################### 00.000')        ;
test('9999-12','9999-01 ##################-- 10000-01')                     ;
test('2000-01-06','01-01 ###----------------- 02-01')                       ;
test('2000-02-06','02-01 ###----------------- 03-01')                       ;
test('2001-02-06','02-01 ####---------------- 03-01')                       ;
test('1742-09-10','09-01 ######-------------- 10-01')                       ;

2
मुझे इस संस्करण को शीर्ष करने के लिए एक नई भाषा सीखनी पड़ी ... यह बहुत संक्षिप्त है!
rexroni

3

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

अजगर में मेरा पहला कोड! देखो:

+%h=N:[d"%.4d"\-=Z"%.2d"\-Z\TZ\:Z\:Z\."%.3d")-*2lKr:w"[-T:.]"d7 3*2lKJ@K_2+@N1+%eN=b<lK4+d+*\#=Gs+*20c-eKb@=H[0^9T12?q2=k@K1+28+q0%=YhK4-q0%Y400q0%Y100+30%+k/k8 2 24 60 60 999)lK.5+*\--20G+d+%hN%+J1@H-lK1+@N1%eNb

मेरा अजगर कोड मेरे पिछले अजगर जवाब से दूर आधारित है। यहाँ टिप्पणियों के साथ ungolfed संस्करण है:

"K is the input, as a list of numbers"
Kr:w"[-T:.]"d7
"Y=year"
=YhK
"k=month"
=k@K1
"H = a list of denominators"
=H[0 ^9T 12 ?q2k+28+q0%Y4-q0%Y400q0%Y100 +30%+k/k8 2 24 60 60 999)
"J is the second-to-last number of the input"
J@K_2
"b is the +1 starting point for months and days"
=b<lK4
"G is the number of hashtags in the statusbar"
=Gs+*20c-eKb@HlK.5
"N is the formatted string"
=N:[d"%.4d"\-=Z"%.2d"\-Z\TZ\:Z\:Z\."%.3d")-*2lK3 *2lK
+%hNJ+@N1+%eNb+d+*\#G+*\--20G+d+%hN%+J1@H-lK1+@N1%eNb

कोड लूप बनाकर और अंत में एक नई रूपरेखा जोड़कर कई मूल्यों का परीक्षण आसानी से पूरा किया जाता है:

Wp+%h=N:[d"%.4d"\-=Z"%.2d"\-Z\TZ\:Z\:Z\."%.3d")-*2lKr:w"[-T:.]"d7 3*2lKJ@K_2+@N1+%eN=b<lK4+d+*\#=Gs+*20c-eKb@=H[0^9T12?q2=k@K1+28+q0%=YhK4-q0%Y400q0%Y100+30%+k/k8 2 24 60 60 999)lK.5+*\--20G+d+%hN%+J1@H-lK1+@N1+%eNb"\n"

तब मैं भाग गया cat testinput | pyth code.pyth > outputऔर diff output testoutput या इसे ऑनलाइन आज़माएं


2

पायथन 2, 371 बाइट्स

यह चुनौती आश्चर्यजनक रूप से कठिन थी! ऐसा लग रहा था कि मैं 300 से कम उम्र का होने जा रहा हूं जब तक कि मैंने आउटपुट स्ट्रिंग फॉर्मेटिंग का काम नहीं किया।

इस तरह का शांत भाग यह है कि मेरा उत्तर किसी भी तारीख पैकेज का उपयोग नहीं करता है:

import re
s=raw_input()
S=[int(i)for i in re.sub('[-T:.]',' ',s).split()]
l=len(S)
y,m=S[:2]
d=[0,20<<9,12,28+(y%4==0!=y%100)+(y%400==0)if m==2else 30+(m+m/8)%2,24,60,60,999]
a,n=S[-2:]
b=1-(1if l>3else 0)
h=int(20.*(n-b)/d[l]+.5)
x,y,z='- %.4d - %.2d - %.2d T %.2d : %.2d : %.2d . %.3d'.split()[l*2-3:l*2]
print x%a+y+z%b+' '+'#'*h+'-'*(20-h)+' '+x%((a+1)%d[l-1])+y+z%b
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.