レピュテーションをフォーマットする


13

質問ページ/投稿から見ると、Stack Exchangeのさまざまなレピュテーションレベルの形式が異なることをご存じでしょう。すべてのrep-formattingルールがあります:

  • ユーザーの担当者が1〜999(1〜3桁)の場合、そのままです。
  • ユーザーが1000〜9999担当者(4桁)の場合、コンマを区切り記号として受け取ります。 9,999
  • ユーザーの担当者が10000〜99999(5桁)の場合、短縮および丸められます。すなわち、16741担当者はとしてフォーマットされ16.7kます。下の担当者(前のポイント)のコンマとは異なり、ドット区切りに注意してください。

    1. 16750はすでに発生します16.8kこれは修正されいるようです

    2. 16941ので結果16.9kまで16950回、17kならびに、例えば、17014を行います。

    3. 99941ラウンド99.9k、99950ラウンド100k(これは、SEの担当者による丸めでは実際に嫌いなものです。100,000はそのようなマイルストーンであり、99950はどこにも近くないためです)。

  • ユーザーの担当者が100000〜999999の場合、次のように丸められます。

    1. 100100 100kは切り捨て、100500は切り上げ101kます。問題は、丸めは行われますが、小数部分は取り除かれることです(4桁の繰り返しとは異なります)。

    2. 100450は切り捨てられますが100k、450から500に切り捨てるステップはありません。100499も切り捨てません100k

    3. 279843はに切り上げ280k、399999はに切り上げ400kます。

入力として、生の評判が与えられ、フォーマットされたものとして出力されます。

入力、無効な数字/非数字、または先行ゼロのある数字、つまりを受け取らないと考えることができ0001234ます。

Jon Skeetはすぐに1,000,000に到達しないようですので、コードはできるだけ短くする必要があります。100万を超える担当者を処理する必要はありません(つまり、999500以上の特別なケースはありません)。


7
「ジョンスキートはすぐに1,000,000に到達していないようです」[要出典]
ミロブラント

@Milo 簡単に -彼は1,000,000まで左163685を持っているので、この方法は、それが(ほぼ2、私が言うと思います)以上の1,5年に彼がかかります2015年のための93Kを獲得しました。これにより、2011年以降、彼の毎年の担当者が毎年減少していることも考慮する必要があります。2011年:134.7k、2012:131.8k、2013:116.8k、2014:104.3k、2015:94.3k。
ニカエル

長い説明ですが、全体として、それは丸めが通常行われる方法です-edc65
1

@Edc この回答を見る Peter Taylorによる。
ニカエル

2
担当者の範囲が10000〜994999(両方を含む)の場合、ハーフアップルールを使用して有効数字3桁に丸められ、1000で除算さ.れ、小数点付きで表示されます。接尾辞を付けてk、3番目の有効数字が0小数点の右側にある場合、値は2つの有効数字のみに表示されるという警告があります。「特定のカットオフは、単一のテストリストに移動できます。ポストの最後のケース。テストフレームワークへのコピーアンドペーストに便利です。
ピーターテイラー

回答:


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バイト長いです...

これは、あなたが住んでいる国に応じて、,またはのいずれか.で数千を区切ります。さらに2バイトを5つ増やす場合は、常にカンマを使用するようにできます。

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

ロケールは正常に機能しますが、ここイタリアでは1.234(コンマではなくドット)を取得します
-edc65

@ edc65これは、私がコードゴルフで出くわすとは思わなかった問題です。今は機能しますか?
ETHproductions

パーフェクト。本当にそうだとは思いませんでした。そして、私はちょうど「en」を試してみましたが、それも
うまく

移植性を必要としないため、ロケールを調整する必要はないと思います。
-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
おそらく、あなたは「ビートETHproductions」ラインを更新する必要があります...?
コナーオブライエン

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

2

ES6、68の 62バイト

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

編集:["1", "001"]文字列化することに気付いたときに6バイトを保存しました"1,001"

編集:@ Mwr247のコメントを修正するために2バイトを保存しました!


1695016.9k代わりに与える17k
-Mwr247

@ Mwr247おかげで、この修正によりさらに2バイト節約できます!
ニール

1

Python 2.7、58バイト

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

私は事件(x+.5)に対処するために使用しなければなりませんでした16950->17k..

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.