任务很简单,但每个程序员都至少实现过一次。Stackoverflow有很多示例,但是它们足够短吗?
您是一个脾气暴躁的程序员,负责为用户实现文件大小输入。由于用户不使用字节,每个人只需输入"1M“、"1K”、"3G“、"3.14M”--但您需要字节!所以你写了一个程序来进行转换。
然后,您的经理会给您几十个用户报告,抱怨文件大小输入中奇怪的大数字。看来,您也需要对反向转换进行编码。
诀窍是:您应该在单个代码中实现双向转换。根据需要使用两个单独的函数?不,那太简单了-让我们做一个,短一个!
为了解决这个问题,“of”表示1024字节,“of”表示1024*1024 = 1048576字节,“G”表示1024*1024*1024 = 1073741824字节。
Input -> Output
5 -> 5
1023 -> 1023
1024 -> 1K
1K -> 1024
1.5K -> 1536
1536 -> 1.5K
1048576 -> 1M
1M -> 1048576 BCMath )外,不要使用任何外部库(例如math.h)。发布于 2015-10-23 00:50:07
l:" KMG"Fi1,4Ia>=Y1024x:(a/:y).l@ix|aR`.+([KMG])`_*y**(l@?B)从命令行获取输入(分配给a变量)并输出到stdout。
l : " KMG"
Y 1024
F i 1,4
I a>=y {
a /: y
x : a . l@i
}
x | a R `.+([KMG])` {a*y**(l@?b)}i,从1到3:a >= 1024,这是一个字节值,需要转换为更大的单位:。a除以1024x设置为与当前单元连接的a的当前值x是由上一步设置的,则输出它。否则,a小于1024 (带有可能的单位后缀),因此:a上执行正则表达式替换,如果它的末尾有一个KMG:将字母转换为适当的1024幂,并将该数字乘以结果。发布于 2015-10-23 04:18:11
这是愚蠢的,但只要您有几十as的RAM,它就能工作(忽略十进制精度问题)。不要运行它,否则,您的机器可能会冻结和锁定。它所做的第一件事就是分配一个2GB的整数数组。
n,bn={'K':2**10,'M':2**20,'G':2**30},range(2**30+1)
for i in bn:
for j in 'KMG':
if i>=n[j]: bn[i]=str(float(i/n[j]))+j
def f(i):
if i[-1] in 'KMG': return n[i[-1]]*float(i[:-1])
return bn[int(i)]https://codegolf.stackexchange.com/questions/61509
复制相似问题