我是一个时光旅行者,我迷恋时间的流逝。我特别喜欢钟针经过12时,翻动日历的下一页或所有人大喊“新年快乐”的那一刻。
请为我编写一个程序,以进度条的形式显示我从最后一刻到下一刻的距离。例如,如果我告诉它时间是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为基础(请参见下文)。
无效和超出范围的输入无需处理。
根据程序员的判断,输入可能只有一个尾随换行符。
进度条数学
程序与给定输入中的最低和第二最低有效单位有关。例如,如果输入具有日级精度(例如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的方式,通过腊和2016-12-02
是1 / 31,等等。
同样地,2016-01
是一月的第0天的第0毫秒,所以在计算中它是0 / 12,该装置2016-12
是11 / 12。
是的,这意味着几个月和几天永远不会完全填满进度栏。
不同的月份持续时间和leap年
不同的月份有不同的天数,并且输出必须反映出这一点,包括leap年。2017年2月6日的进度条将与2016年2月6日(或两年的1月6日)的进度条不同。
杂
- 时光旅行者使用阳历阳历。TL; DR:没有特殊的情况,例如1752年失踪的日子。输入内容将包含公元0年的日期
- 时间旅行者忽略了夏令时。
- 该程序不需要考虑leap秒,但可以。
输出量
程序(或函数)必须打印(或以字符串形式返回)水平方向的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