国际单位制
* * * *
拉格朗日计划
* * * *
国际单位制

国际单位制中有七个基本单位:

s (秒), m (米), kg (千克), A (安培), K (开尔文), mol (摩尔) and cd (坎德拉).

由这个七个单位组合,可得如下22个衍生单位,下表左边是衍生单位,右边是对应基本单位的公式。

"rad":  "1",
"sr":   "1",
"Hz":   "s^-1",
"N":    "kg m s^-2",
"Pa":   "kg m^-1 s^-2",
"J":    "kg m^2 s^-2",
"W":    "kg m^2 s^-3",
"C":    "A s",
"V":    "kg m^2 s^-3 A^-1",
"F":    "kg^-1 m^-2 s^4 A^2",
"Ω":    "kg m^2 s^-3 A^-2",
"S":    "kg^-1 m^-2 s^3 A^2",
"Wb":   "kg m^2 s^-2 A^-1",
"T":    "kg s^-2 A^-1",
"H":    "kg m^2 s^-2 A^-2",
"°C":  "K",
"lm":   "cd",
"lx":   "cd m^-2",
"Bq":   "s^-1",
"Gy":   "m^2 s^-2",
"Sv":   "m^2 s^-2",
"kat":  "mol s^-1".


此外,国际单位制中还定义了以下24个不同的前缀,用以表示不同的数量级,下表左边是前缀,右边是对应的10的幂值,例如前缀Q表示$10^{30}$。

"Q": 30,
"R": 27,
"Y": 24,
"Z": 21,
"E": 18,
"P": 15,
"T": 12,
"G": 9,
"M": 6,
"k": 3,
"h": 2,
"da": 1,
"d": -1,
"c": -2,
"m": -3,
"μ": -6,
"n": -9,
"p": -12,
"f": -15,
"a": -18,
"z": -21,
"y": -24,
"r": -27,
"q": -30.


本题的每组输入数据都由前缀和单位组成,其中前缀可能为空,将其转化为基本单位后输出。例如, GW (千兆瓦) 对应的输出是 10^9 kg m^2 s^-3。

此外,还有如下一些特例需要注意:

千克(kilogram)是自带前缀的基本单位,所有重量都应转化为千克,例如g对应10^-3 kg,Mg对应10^3 kg。

10^1和10^0的情况请分别输出10和1而无需输出指数形式。

rad和sr无需转化,例如Mrad对应的输出是10^6而非10^6 1。

尽管基本单位间并无绝对的先后顺序,但此处的输出应符合NIST定义的标注,例如C对应的输出应是A s而非s A。

μ (U+03BC) 是小写希腊字母MU (UTF-8: ce bc)。

Ω (U+03A9) 是大写希腊字母OMEGA (UTF-8: ce a9)。

° (U+00B0) 是度数标志 (UTF-8: c2 b0)。

本题难度:



解答

似乎并没有什么太好的手段,把单位和前缀各自的对应关系分别存入两个字典x,y再查找,此外,需要识别g和10的情况(其他特例可以在字典的定义中处置)单独处理格式。

最终代码行有四行。

代码长度:629字节 vs. 全站第一:368字节。

import sys
z="s m kg A K mol cd".split()
x,y=dict(zip("Hz N Pa J W C V F Ω S Wb T H °C lm lx Bq Gy Sv kat g".split(),"s^-1,kg m s^-2,kg m^-1 s^-2,kg m^2 s^-2,kg m^2 s^-3,A s,kg m^2 s^-3 A^-1,kg^-1 m^-2 s^4 A^2,kg m^2 s^-3 A^-2,kg^-1 m^-2 s^3 A^2,kg m^2 s^-2 A^-1,kg s^-2 A^-1,kg m^2 s^-2 A^-2,K,cd,cd m^-2,s^-1,m^2 s^-2,m^2 s^-2,mol s^-1,kg".split(",")))|dict(zip(z,z))|{"rad":"","sr":""},dict(zip("qryzafpnμm_kMGTPEZYRQ",range(-30,31,3)))|{"c":-2,"d":-1,"da":1,"h":2}
for a in sys.argv[1:]:print((["1 ","10^-3 "][a=="g"])*(a in x)+({v+u:"10"+("^"+str(z))*(z!=1)+" "+x[u]for u in x for v in y for z in[y[v]-3*(u=="g")]}|x)[a])