使用字母使数字更短


9

挑战

取一个数字并使用字母和数字将其输出为4位或更少。例如; 270,030会变成270K

十亿-> B

百万-> M

千-> K

规则

  • 您可以选择接受包含逗号分隔的输入数字,该逗号以小数点后三位表示(例如123,456,789)。
  • 四舍五入到最接近的一半。
  • 数字只会增加到999,499,999,999
  • 答案的尾数部分应至少为1。
  • 所有字母都必须为大写字母,并且如上所述。
  • 输出必须为4位或更少的数字。(包括字母,例如BKM
  • 输出必须在数学上尽可能精确。例:
    • 15,480-> 20K 不好
    • 15,480-> 15.5K
  • 如果有多个输出具有相同的数学精度,则返回两个。例:
    • 1000-> 1000
    • 1000-> 1K

例子:

1,234,567-> 1.23M
999,500-> 1M
999,499-> 999K
102-> 102
1000-> 1K
1001-> 1001
100,000-> 100K
12,345,678,912-> 12.3B
1,452,815,612-> 1.45B

意见书

Answers:


2

JavaScript,84 79字节

i=>{I=i;for(x=-1;i>=999.5;x++)i/=1e3;return I<1e4?I:+i.toPrecision(3)+'KMB'[x]}

在线尝试!

(将输入作为数字)

特殊情况是第一个if i < 1000,数字本身始终是最短的方法之一,即使不是唯一的最短方法。

否则,将其除以1000,直到除以使其没有大于1的有效数字为止,然后根据完成的除法次数选择一个后缀。


根据宽松的规格,最后一种情况应该是999.5M,或者不确定。
魔术章鱼缸

请记住,您需要支持多达一万亿美元。
GarethPW

@GarethPW根据规范,无法表示大于999,499,999,999的数字(T -> trillion键中为No ),因此我认为这是上限。我会问,但否则会丢失一个字节。
Artyer

1

Python 3,127个字节

def f(n):s=str(n);l=len(s)-4;return f"{round(n,~l):,}"[:4].replace(*",.").rstrip('.')+"KMBT"[l//3+(int(s[3])>4)]if n>9999else n

在线尝试!


短一点:def f(n):l=len(str(n))-4;return[n,f"{round(n,~l):,}"[:4].replace(*",.").rstrip('.')+"KMBT"[-~l//3]][n>9999]
wrymug

1
@JonathanAllan没事。我的错。
Artyer

@rosslh我确实进行了更改,但是在修复999499-> 999M错误时无法保留。
GarethPW

1

JavaScript(ES7),74个字节

n=>n<1e4?n:(c=n.toExponential(2).split`e`).shift()*10**(c%3)+' KMB'[c/3|0]

JavaScript(ES6),80个字节

n=>n<1e4?n:(c=n.toExponential(2).split`e`).shift()*[1,10,100][c%3]+' KMB'[c/3|0]

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.