আমরা কি তাহলে এখনও?


22

আমি একজন সময়ের ভ্রমণকারী এবং আমি সময়ের সাথে সময় কাটিয়ে উঠি। আমি বিশেষত সেই মুহুর্তগুলিকে খুব পছন্দ করি যখন ঘড়ির হাত 12 টি পেরিয়ে যায় বা যখন আমি আমার ক্যালেন্ডারের পরবর্তী পৃষ্ঠায় চলে যাই বা যখন সবাই চিৎকার করে বলে "শুভ নববর্ষ!"

অগ্রগতি বারের আকারে শেষ মুহুর্ত থেকে পরের মুহূর্তে আমি কতটা দূরে রয়েছি তা দেখানোর জন্য দয়া করে আমার জন্য একটি প্রোগ্রাম লিখুন। উদাহরণস্বরূপ, যদি আমি বলি সময়টি 09:12 হয় তবে এটি এটি মুদ্রণ করা উচিত:

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

আমি যদি এটি বলি যে মাসটি 1982 সালের মে হয়, তবে এটি মুদ্রণ করা উচিত:

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

আমি কি একজন সময় ভ্রমণকারী উল্লেখ করেছি? আমি 0 এডি এর প্রথম মিলি সেকেন্ড থেকে 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একটি আক্ষরিক চিঠি "টি" সময় থেকে তারিখ delimiting হয়। ঘন্টা 24 ঘন্টা সময় থাকে on

  • মাস এবং দিন 1-ভিত্তিক (নীচে এটি আরও)।

  • অবৈধ এবং সীমার বাইরে ইনপুটগুলি হ্যান্ডেল করা দরকার না।

  • প্রোগ্রামারের বিবেচনার ভিত্তিতে, ইনপুটটির একটি একক ট্রেলিং নিউলাইন থাকতে পারে।

অগ্রগতি বার গণিত

প্রোগ্রামটি প্রদত্ত ইনপুটটিতে সর্বনিম্ন- এবং দ্বিতীয়-সর্বনিম্ন-তাত্পর্যপূর্ণ ইউনিটগুলির সাথে সম্পর্কিত। উদাহরণস্বরূপ, যদি ইনপুটটিতে দিনের-স্তরের যথার্থতা থাকে (যেমন,2016-12-14 ), অগ্রগতি বারটি নির্দেশ করে যে ইনপুট মাসের দিনগুলির অনুপাতটি কিসের বিপরীতে চলে গেছে।

অগ্রগতি বারে 20 টি ইউনিট (অক্ষর) থাকবে এবং প্রতিনিধিত্ব করা অনুপাতটি 120 এর নিকটতম বৃদ্ধিতে গোল হবে । উদাহরণস্বরূপ, প্রদত্ত 2016-12-14T12:28, অগ্রগতি দণ্ডটি 20 টি ইউনিটের "ভরাট" রাউন্ড ( 2860 × 20) = 9 দেখাবে ।

1 ভিত্তিক মাস এবং দিন

যদিও 1 ডিসেম্বর দিন (উদাহরণস্বরূপ) হল 01মধ্যে 2016-12-01, হিসাব উদ্দেশ্যে এটা মাসের 0th দিন, কারণ ছেঁটে ফেলা ইউনিট দিনের 0th ঘণ্টা 0th মিনিটের 0th মিলিসেকেন্ডে পরোক্ষভাবে। অন্য কথায়, 2016-12-01হয় 0 / 31 ডিসেম্বর মাধ্যমে উপায় এবং 2016-12-02হয় 1 / 31 , ইত্যাদি।

অনুরূপভাবে, 2016-01জানুয়ারি 0th দিনের 0th মিলিসেকেন্ডে, তাই গণনার এটা হয় 0 / 12 , যার মানে 2016-12হল 11 / 12

হ্যাঁ, এর অর্থ মাস এবং দিনগুলি কখনই পুরোপুরি অগ্রগতি বার পূরণ করে না।

পৃথক মাসের সময়কাল এবং লিপ বছর years

বিভিন্ন মাসে বিভিন্ন সংখ্যক দিন থাকে এবং আউটপুটটি অবশ্যই প্রতিফলিত হয় le লিপ বছর সহ। 6 ফেব্রুয়ারী, 2017 এর অগ্রগতি বারটি 6 ফেব্রুয়ারী, 2016 (বা উভয় বছরের 6 জানুয়ারীর) জন্য অগ্রগতি বারের চেয়ে আলাদা হবে।

বিবিধ

  • সময় ভ্রমণকারীরা প্রলেপটিক গ্রেগরিয়ান ক্যালেন্ডার ব্যবহার করেন । টিএল; ডিআর: 1752-তে হারিয়ে যাওয়া দিনের মতো বিশেষ কোনও মামলা নেই । ইনপুটটিতে খ্রিস্টাব্দে তারিখগুলি অন্তর্ভুক্ত থাকবে
  • সময়ের যাত্রীরা দিবালোকের সঞ্চয়কে উপেক্ষা করে।
  • লিপ সেকেন্ডের জন্য অ্যাকাউন্টটির প্রয়োজন নেই প্রোগ্রামটি, তবে এটি হতে পারে।

আউটপুট

প্রোগ্রাম (বা ফাংশন) অবশ্যই একটি অনুভূমিক-ভিত্তিক 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
আমি ধরে নিয়েছি যে দিবালোকের সঞ্চয়গুলি উপেক্ষা করা হবে, যেহেতু কোনও মানকযুক্ত ফর্ম নেই?
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
এই সংস্করণটি শীর্ষে রাখতে আমাকে একটি নতুন ভাষা শিখতে হয়েছিল ... এটি খুব সংক্ষিপ্ত!
রেক্স্রনি

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

আমার পাইথ কোডটি আমার আগের অজগর উত্তরটির কাছাকাছি ভিত্তিক। মন্তব্যগুলির সাথে বর্ণহীন সংস্করণটি এখানে:

"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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.