让我们缩写那些数字!现在反向吗?


11

介绍:

像Twitter和Instagram等,我想显示诸如1.2K3.8 M而不是1,222或的数字3,823,456

但这还不是全部!众所周知,某些无疑会不喜欢这些缩写,并会尝试将其缩写。因此,1.2k将成为1,200并且3.8 M将成为3,800,000

任务:

  • 您的任务是编写一个程序或函数,将一个数字列表(以字符串形式给出)转换为它们的缩写对,反之亦然。

例如,如果输入列表(或任何STDIN)为['1.4k', '1,234,567', '7.99M'],则应输出:

['1,400', '1.2M', '7,990,000']

您可以遵循下一个缩写形式:

  • 10 3- >一公斤-> K
  • 10 6- >一百万-> M
  • 10 9- > 10 亿-> B

您的代码可以假定所有小写,全部大写,混合大小写或未定义大小写作为输入,并使用其中的任何一个作为输出,但应保持一致。

规则和限制:

  • 您可以编写程序或函数,通过STDIN(或最接近的替代方法),命令行自变量或函数自变量获取输入,并通过STDOUT(或最接近的替代方法),函数返回值或函数(输出)参数输出结果。
  • 输入可以是任何方便的列表或字符串格式。您可以假设小于个,并且列表包含至少一个元素。ai231
  • 每个缩位号码将包含只有一个 .,而一个正常的数字将包含尽可能多的 , 必要的(你可以假设,这个数字将不会改变)。
  • 可能不输入数字'123456'而是123,456
  • 适用标准规则。

测试用例:

Input: ['1.5M', '77.6k', '123,456,789']         Output: ['1,500,000', '77,600', '123.4M']
Input: ['3,000,000,000', '581k', '2b']          Output: ['3B', '581,000', '2,000,000,000']
Input: ['0.1k']                                 Output: ['100']
Input: ['888', '33']                            Output: ['0.888k', '0.033k']

说明:

  • 对于缩写输出中小数点后的<1000的数字,您应该具有所需的位数以获取正确的结果。(例如:2->将变为0.002k)- 表示最多3个小数;对于> 1000的数字,最多可以有1个小数
  • 缩写可以是大写或小写
  • 我删除了注释中建议的内置限制

以字节为单位的最短代码胜出!


1
要求澄清:缩写输出中小数点后几位数?如何缩写<1000?输入和输出都是大写还是小写?
edc65 '16

1
不应该'123,456,789' -> '123.4M'吗 同样,这也无法说明要使用多少个小数。当然,1000以下的任何东西都不必缩写。
卡德

1
@ anonymous2阅读了第三条规则。
Grajdeanu Alex。

4
“你不允许使用任何内置模块/功能” 任何内置的功能?
Alex Howansky '16

1
您对“ kilo”的使用会建议使用SI前缀,而这些前缀应该是["k", "M", "G"]。“正常数量将包含尽可能多的数字”的意思是,在我国,使用任何数字都是错误的。
2016年

Answers:


2

PHP,234个 224 213 201 205字节

for(;$x=$argv[++$n];){$y=str_replace(",","",$x)/1e3;for($i=0;$y>999;$i++)$y=($y|0)/1e3;echo(A<$c=substr($x,strlen($x)-1))?number_format($x*[k=>1e3,m=>1e6,b=>1e9][$c]):($i?($y*10|0)/10:$y).kmb[$i]," ";}

在此,insertusername保存了6个字节,由此启发了4个字节。


  • 从命令行参数获取输入,打印结果,并在结果后用空格分隔
  • 要求小写缩写
  • -r

如果可以使用下划线作为分隔符,则为-2字节:替换" "_
如果可以正确舍入,则为-1字节:替换($y*10|0)/10round($y,1)
PHP 7.1的-17个字节:替换substr($x,strlen($x)-1)$x[-1]


80(63)个字节,仅用于扩展一个参数:

<?=number_format(($x=$argv[1])*[K=>1e3,M=>1e6,B=>1e9][substr($x,strlen($x)-1)]);

保存到文件,然后执行(或替换<?=echo+ space并运行-r


您的第二个示例未编译。
Alex Howansky '16

1
您的parens不平衡。
Alex Howansky '16

1
-4个字节: for($j=1;$x=$argv[$j++];) –而不是foreach($argv as$i=>$x)if($i)
insertusername此处,2016年

1
-2个字节: kmb[$i] –代替"kmb"[$i]
insertusername此处,2016年

1
@insertusernamehere负字符串索引来自PHP 7.1;那是RC(尚未)。感谢其他字节!
泰特斯

2

JavaScript,545 524 522 518 514 508 504 498 494 214字节

感谢@ETHproductions节省了180个字节!

d=F=>F.map(f=>1/f.slice(-1)?f=(f=f.replace(/,/g,""))[9]?(f/1e8|0)/10+"B":f[6]?(f/1e5|0)/10+"M":f/1e3+"k":R(R(f.slice(0,-1)+"e"+' kMB'.indexOf(f.substr(-1))*3-0+"").match(/.{1,3}/g)+""),R=x=>[...x].reverse().join``)

调用函数:

d(["1.5M","1,500,000"]) //["1,500,500","1.5M"]

输出为alert,其中每个alert包含输入的不同元素

可读版本:

d = F => F.map(f => 1 / f.slice(-1) ? f = (f = f.replace(/,/g, ""))[9] ? (f / 1e8 | 0) / 10 + "B" : f[6] ? (f / 1e5 | 0) / 10 + "M" : f / 1e3 + "k" : R(R(f.slice(0, -1) + "e" + ' kMB'.indexOf(f.substr(-1)) * 3 - 0 + "").match(/.{1,3}/g) + ""), R = x => [...x].reverse().join ``)

编辑摘要:将函数转换为箭头函数

  • 删除分号';'
  • 已移除 var
  • 转换为箭头功能
  • 使用map遍历数组的各个元素
  • 用于|0代替地板
  • 使用正则表达式进行测试
  • 使用三元运算符代替if-else语句
  • 包括一个单独的功能 .reverse().join''

3
这里有一些打高尔夫球的方法。随时问您可能有任何问题:-)
ETHproductions
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.