私はタイムトラベラーであり、時間の経過に夢中です。時計の針が12を過ぎたとき、カレンダーの次のページに移動したとき、または「Happy New Year!」と大声で叫んだときが特に気に入っています。
プログレスバーの形で、そのような最後の瞬間から次の瞬間までの距離を示すプログラムを書いてください。たとえば、時間が09:12であると伝えると、次のように出力されます。
09:00 ####---------------- 10:00
月が1982年5月であると言うと、次のように印刷されます。
1982-01 #######------------- 1983-01
私はタイムトラベラーだと言いましたか?0 ADの最初のミリ秒から9999 ADの最後のミリ秒まで移動するため、プログラムはその範囲の日付と時刻を処理する必要があります。
入力
入力は次のいずれかの形式になります。
YYYY-MM-DDThh:mm:ss.sss
YYYY-MM-DDThh:mm:ss
YYYY-MM-DDThh:mm
YYYY-MM-DDThh
YYYY-MM-DD
YYYY-MM
これらは、処理が必要な唯一の形式です。各部分には正確に表示される桁数があります。つまり、小数秒には末尾のゼロが含まれる場合があります(例:
.120
never.12
)。T
時間から日付を区切るリテラル文字「T」です。時間は24時間制です。月と日は1から始まります(これについては後で詳しく説明します)。
無効で範囲外の入力を処理する必要はありません。
プログラマーの裁量により、入力には単一の末尾改行が含まれる場合があります。
プログレスバーの数学
プログラムは、指定された入力の最下位および2番目に重要な単位に関係しています。たとえば、入力が日レベルの精度(例:)である2016-12-14
場合、進行状況バーは、入力された月の残りの日に対する経過した日数の割合を示します。
プログレスバーは、20単位(文字)を有するであろうと表される割合が最も近い増分に丸められます1 / 20。例えば、所与2016-12-14T12:28
、プログレスバーが表示されるラウンド(28 / 60 ×20)9 = 20の単位を"充填します"。
1から始まる月と日
(たとえば)12月1日は01
に2016-12-01
ありますが、切り捨てられた単位はその日の0時の0分の0ミリ秒を意味するため、計算の目的では月の0日になります。換言すれば、2016-12-01
ある0 / 31 Decemberまでの道のと2016-12-02
ある1 / 31、及びオンになります。
同様に、2016-01
その計算にそれは、1月の0日目の0ミリ秒0 / 12その手段、2016-12
である11 / 12。
はい、それは月と日が進行状況バーを完全に埋めることがないことを意味します。
異なる月の期間とうるう年
異なる月には異なる日数があり、出力にはこれを反映する必要があります(うるう年を含む)。2017年2月6日の進行状況バーは、2016年2月6日(または両方の年の1月6日)の進行状況バーとは異なります。
その他
- タイムトラベラーは、予言的なグレゴリオ暦を使用します。TL; DR:1752年の日がなくなったような特別なケースはありません。入力には、西暦0年の日付が含まれます
- 時間旅行者は夏時間を無視します。
- プログラムはうるう秒を考慮する必要はありませんが、そうすることはできます。
出力
プログラム(または関数)は、水平方向の20文字のプログレスバーを印刷(または文字列として返す)する必要があります。このバーは、経過した時間を「塗りつぶし」、残りの時間を「開く」必要があります。左から右に「埋める」必要があります。
進行状況バーの左側には、カウントされる期間の開始を示すラベルがあり、右側には次の期間の開始を示すラベルが入力と同じ形式である必要があります(ただし、精度は2単位のみ表示されます)。この例の2016-12-14
有効な出力は次のとおりです。
12-01 #########----------- 01-01
可能な各期間の有効なラベル形式は次のとおりです。
- 月:
YYYY-MM
- 日々:
MM-DD
- 営業時間:
DDThh
- 議事録:
hh:mm
- 秒:
mm:ss
- ミリ秒:
ss.sss
ラベルに追加のユニットを含めることはできず、省略することもできません。
出力ノート
- 進行状況バーの「塗りつぶされた」単位は、
#
文字で表されます。「オープン」ユニットはで表され-
ます。 - 進行状況バーと各ラベルの間には、正確に1つのスペースが必要です。
- 先頭または末尾のスペースおよび/または単一の末尾の改行が許可されます。
勝ち
これはcode-golfです。バイト単位の最短コードが優先されます。標準ルールが適用されます。標準的な抜け穴は禁止されています。
例
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