时间差
* * * *
拉格朗日计划
* * * *
时间差

给定一串数字,表示秒数,将其转换为可读的形式并输出,具体而言:

0表示当前时刻,对应的输出是now。

正数表示将来的时刻,转换后的内容之前应该添加介词in (比如 in XXX minutes)。

负数表示过去的时刻,转换后的内容之后应该添加副词ago (比如 XXX minutes ago)。

可用的时间单位包括年、月、周、日、时、分、秒,对应单词year、month、week、day、hour、minute、second,其中月按30日计、年按365日计。

转换时按上述顺序找到可以使用的最大单位并向零舍入。

输出时应注意各单位的单复数,此外,当数字为1时应输出不定冠词a或an,比如一个月/一小时对应的输出分别是a month/an hour而非1 month 1 hour,其他数字可以直接输出。

本题难度:



解答

需要注意负数的舍入,不能直接用//运算符,这里的处理是用浮点数除法后取整,其他单复数、前后缀和冠词都可以用字符串乘法处理。

最终代码有四行。

代码长度:276字节 vs. 全站第一:224字节。

import sys,bisect as b
d=86400
t=[1,60,3600,d,d*7,d*30,d*365]
for s in map(int,sys.argv[1:]):k=b.bisect(t,abs(s))-1;n=abs(int(s/t[k]));print(["in "*(s>0)+[str(n),"a"+"n"*(k==2)][n==1]+" "+"second minute hour day week month year".split()[k]+"s"*(n>1)+" ago"*(s<0),"now"][s==0])