首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >人类讨厌战俘,程序员讨厌人类--让我们把它们连接起来!

人类讨厌战俘,程序员讨厌人类--让我们把它们连接起来!
EN

Code Golf用户
提问于 2015-10-22 22:55:02
回答 3查看 519关注 0票数 11

背景

任务很简单,但每个程序员都至少实现过一次。Stackoverflow有很多示例,但是它们足够短吗?

问题故事

您是一个脾气暴躁的程序员,负责为用户实现文件大小输入。由于用户不使用字节,每个人只需输入"1M“、"1K”、"3G“、"3.14M”--但您需要字节!所以你写了一个程序来进行转换。

然后,您的经理会给您几十个用户报告,抱怨文件大小输入中奇怪的大数字。看来,您也需要对反向转换进行编码。

你需要做什么?

诀窍是:您应该在单个代码中实现双向转换。根据需要使用两个单独的函数?不,那太简单了-让我们做一个,短一个!

为了解决这个问题,“of”表示1024字节,“of”表示1024*1024 = 1048576字节,“G”表示1024*1024*1024 = 1073741824字节。

测试数据

代码语言:javascript
复制
Input   -> Output  
5       -> 5  
1023    -> 1023  
1024    -> 1K  
1K      -> 1024  
1.5K    -> 1536  
1536    -> 1.5K  
1048576 -> 1M  
1M      -> 1048576  

规则

  • 测试值不超过2*1024*1024*1024或2G
  • 用户使用下列后缀:K表示千字节,M用于兆字节,G用于G
  • 代码不需要使用负数。
  • 除了捆绑库(如BCMath )外,不要使用任何外部库(例如math.h)。
  • 不允许有标准的漏洞
  • 代码不应在stderr上产生任何内容。
  • 您的程序可以使用标准方法获取输入并产生输出。(http://meta.codegolf.stackexchange.com/questions/2447/default-for-code-golf-input-output-methods)
EN

回答 3

Code Golf用户

发布于 2015-10-23 00:50:07

Pip,60字节

代码语言:javascript
复制
l:" KMG"Fi1,4Ia>=Y1024x:(a/:y).l@ix|aR`.+([KMG])`_*y**(l@?B)

从命令行获取输入(分配给a变量)并输出到stdout。

Ungolfed版本:

代码语言:javascript
复制
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除以1024
      • x设置为与当前单元连接的a的当前值

  • 如果x是由上一步设置的,则输出它。否则,a小于1024 (带有可能的单位后缀),因此:
    • a上执行正则表达式替换,如果它的末尾有一个KMG:将字母转换为适当的1024幂,并将该数字乘以结果。
    • 对于没有后缀的小于1024的值,此值将保持不变。
票数 2
EN

Code Golf用户

发布于 2015-10-23 04:18:11

Python2 199字节

这是愚蠢的,但只要您有几十as的RAM,它就能工作(忽略十进制精度问题)。不要运行它,否则,您的机器可能会冻结和锁定。它所做的第一件事就是分配一个2GB的整数数组。

代码语言:javascript
复制
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)]
票数 0
EN

Code Golf用户

发布于 2020-05-15 16:43:45

C (gcc),114个字节

代码语言:javascript
复制
*i=L"KMG",d;c;main(S){float f;for(scanf(S="%f%c",&f,&c);c?f*=1024,c-*i++:f>1023?f/=1024,d=*i++:0;);printf(S,f,d);}

在网上试试!

感谢ceilingcat的-11字节

票数 0
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/61509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档