设置声誉


13

您可能确实知道,从问题页面/帖子中查看时,Stack Exchange上不同的信誉级别的格式是不同的。有所有的rep格式规则:

  • 如果用户有1到999(一到三位数)的代表,则保留原样。
  • 如果用户有1000至9999个代表(四位数),则它将逗号作为分隔符: 9,999
  • 如果用户具有10000至99999 rep(五位数),则将其缩短并四舍五入。即,16741 rep的格式为16.7k,请注意点分隔符与较低rep(上一个点)的逗号不同。

    1. 已经产生了16750 16.8k(因为这似乎是固定的

    2. 例如,16941结果为16.9k,16950向上舍入为17k,以及17014 向上舍入。

    3. 99941 舍入为99.9k,99950 100k舍入为(这实际上是我对SE上的rep- round所讨厌的,因为100,000是一个里程碑,而99950距离不远)。

  • 如果用户的代表为100000至999999,则按以下方式四舍五入:

    1. 100100向下100k舍入到100500向上舍入到101k。事实是,四舍五入已经完成,但是小数部分被去掉了(与四位数字表示不同)。

    2. 100450会四舍五入到150,四舍五入到100k450到500。100499也不会-仍然是100k

    3. 279843舍入为280k,和399999舍入为400k

作为输入,您将获得原始信誉,并将其输出为格式化格式。

您可以认为输入不会收到任何无效数字/非数字或带有前导零的数字,即0001234

由于Jon Skeet似乎不会很快达到1,000,000,因此您的代码必须尽可能短,并且您不需要处理超过100万的代表(即,对于999500及更高版本,没有特殊情况)。


7
“因为乔恩·斯基特(Jon Skeet)似乎不会很快达到1百万” [需要引用]
米洛·勃兰特

@Milo Easy-他在2015年的收入为93k。在100万之前,他还剩下163,685,因此,这将花费他超过1.5年的时间(我想说将近2年)。因此,您还应该考虑到,自2011年以来,他的年度代表每年都在减少。2011:134.7k,2012:131.8k,2013:116.8k,2014:104.3k,2015:94.3k。
nicael

详细的说明,但总的来说,这只是通常舍入的方式
edc65

@Edc参见Peter Taylor的回答
nicael

2
我认为可以通过以下方式来缩短解释:“ 如果代表在10000到994999(包括两端)范围内,则使用上半部规则将其四舍五入为3个有效数字,除以1000,并显示.小数点并带有后缀k;请注意,如果第三个有效数字位于0小数点右边,则该值仅显示为2个有效数字。 “然后可以将特定的临界值移动到单个测试列表中案例末尾的案例,这对于将副本粘贴到测试框架中更为方便。
彼得·泰勒

Answers:


4

Japt,50 48字节

第一次尝试; 可能有更好的方法。

U<A³?U:U<L²?Us i1', :(U<1e5?Ue2n)r /A:Ue3n)r)+'k

在线尝试!

怎么运行的

          // Implicit: U = input integer, A = 10, L = 100
U<A³?U    // If U is less than A³ (10³ = 1000), return U.
:U<L²?    // Else, if U is less than L² (100² = 10000), return:
Us i1',   //  U.toString, with a comma inserted at position 1.
:(        // Else, return:
U<1e5?    //  If U is less than 1e5:
Ue2n)     //   U * (10 to the power of -2), 
r /A      //   rounded and divided by 10.
:Ue3n)r)  //  Else: U * (10 to the power of -3), rounded.
+'k       //  Either way, add a "k" to the end.
          // Implicit: output last expression

7

JavaScript(ES6),76 68字节

x=>x<1e4?x.toLocaleString():(x<1e5?(x/1e2+.5|0)/10:(x/1e3+.5|0))+"k"

另一个第一次尝试。谢天谢地,这样方便.toLocaleString(),我能找到的最短替代方法是长21个字节...

这取决于您居住的国家/地区,以,或分隔成千上万.。对于另外五个两个字节,您可以使其始终使用逗号:

x=>x<1e4?x.toLocaleString`en`:(x<1e5?(x/1e2+.5|0)/10:(x/1e3+.5|0))+"k"

您的语言环境适合您,但在意大利,我得到1.234(点号而不是逗号)
edc65

@ edc65现在这是我从来没有想到过会碰上代码高尔夫的问题。现在可以用吗?
ETHproductions 2016年

完善。真的我不认为那是可行的。而且我只尝试了“ en”,它似乎也可以工作
edc65

我认为您不需要针对语言环境进行调整,因为它不需要具有可移植性。
geokavel

1
基本上,如果它可以在您的计算机上运行,​​我认为它已经足够了。
geokavel

3

JavaScript(ES6),71

击败@ETHProductions,而他没有看到我的提示。他看到了。

x=>x<1e3?x:x<1e4?(x+='')[0]+','+x.slice(1):(x/1e3).toFixed(x<99950)+'k'

测试

f=x=>x<1e3?x:x<1e4?(x+='')[0]+','+x.slice(1):(x/1e3).toFixed(x<99950)+'k'

function test() { n=+I.value, O.textContent = n + ' -> ' + f(n) }

test()
<input id=I type=number value=19557 oninput=test()>
<pre id=O></pre>

测试


1
也许您应该更新您的“ beating ETHproductions”行...?
科纳·奥布莱恩,2016年

@CᴏɴᴏʀO'Bʀɪᴇɴ做完了。
edc65 '16

2

ES6,68 62个字节

x=>x<1e4?`${x}`.split(/(?=...)/)+"":x.toPrecision(3)/1e3+"k"

编辑:当我意识到将["1", "001"]字符串化为时,保存了6个字节"1,001"

编辑:保存2个字节以修复@ Mwr247的注释!


16950给出16.9k的,而不是17k
Mwr247

@ Mwr247谢谢,此修复程序为我节省了另外两个字节!
尼尔

1

Python 2.7,58个字节

lambda x:['%.3g'%((x+.5)/1e3)+'k','{:,}'.format(x)][x<1e4]

我不得不用来(x+.5)处理这个16950->17k案子。

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.