Format reputasi

13

Anda mungkin tahu bahwa level reputasi yang berbeda di Stack Exchange diformat secara berbeda ketika dilihat dari halaman pertanyaan / posting. Sudah ada semua aturan format ulang:

  • jika pengguna memiliki 1 hingga 999 (satu hingga tiga digit) rep, itu dibiarkan apa adanya.
  • jika pengguna memiliki 1000 hingga 9999 rep (empat digit), ia menerima koma sebagai pemisah: 9,999
  • jika pengguna memiliki 10.000 hingga 99999 rep (lima digit), itu dipersingkat dan dibulatkan. Yaitu, 16741 rep diformat sebagai 16.7k, perhatikan pemisah titik tidak seperti koma untuk rep yang lebih rendah (titik sebelumnya).

    1. 16750 sudah akan menghasilkan 16.8k(karena ini tampaknya sudah diperbaiki )

    2. 16941 menghasilkan 16.9k, 16950 putaran hingga 17k, serta 17014, misalnya.

    3. 99941 putaran ke 99.9k, 99950 putaran ke 100k(ini adalah sesuatu yang saya benar-benar benci dengan putaran ulang di SE, karena 100.000 adalah tonggak sejarah, dan 99950 tidak ada di dekat sini).

  • Jika pengguna memiliki 100000 hingga 999999 rep, itu dibulatkan dengan cara ini:

    1. 100100 putaran ke bawah 100k, 100500 putaran hingga 101k. Masalahnya adalah, pembulatan dilakukan, tetapi bagian desimal dilucuti (tidak seperti rep empat digit).

    2. 100450 putaran ke bawah 100k, tidak ada langkah ke putaran 450 hingga 500. Juga tidak 100499 - itu masih 100k.

    3. 279843 putaran hingga 280k, dan 399999 putaran hingga 400k.

Sebagai input, Anda diberikan reputasi mentah, dan output sebagai diformat.

Anda dapat mempertimbangkan bahwa input tidak akan menerima angka / non-angka yang tidak valid, atau angka dengan nol awal, yaitu 0001234.

Karena Jon Skeet tampaknya tidak akan mencapai 1.000.000 segera, kode Anda harus sesingkat mungkin sehingga Anda tidak perlu menangani perwakilan lebih dari satu juta (yaitu, tidak ada kasing khusus untuk 999500 atau lebih).

nicael
sumber
7
"Karena Jon Skeet tampaknya tidak akan mencapai 1.000.000 segera" [rujukan?]
Milo Brandt
@ Moilo Easy - dia mendapat 93 ribu untuk 2015. Dia memiliki 163.685 tersisa hingga 1.000.000, jadi dengan cara ini dia akan membutuhkan lebih dari 1,5 tahun (hampir 2 tahun, menurut saya). Dengan ini, Anda juga harus mempertimbangkan bahwa perwakilan tahunannya berkurang setiap tahun, sejak 2011. 2011: 134.7k, 2012: 131.8k, 2013: 116.8k, 2014: 104.3k, 2015: 94.3k.
nicael
Penjelasan yang panjang, tapi secara keseluruhan, ini hanya cara pembulatan yang biasa dilakukan
edc65
@Edc See jawaban ini oleh Peter Taylor.
nicael
2
Saya pikir penjelasannya dapat dipersingkat dengan mengatakan " Jika rep berada di kisaran 10.000 hingga 994999 (keduanya inklusif), itu dibulatkan menjadi 3 angka signifikan menggunakan aturan setengah naik, dibagi dengan 1000, dan ditampilkan dengan .titik desimal dan dengan akhiran k; tunduk pada peringatan bahwa jika angka signifikan ketiga adalah 0dan di sebelah kanan titik desimal maka nilainya ditampilkan hanya untuk 2 angka signifikan. "Cutoff spesifik kemudian dapat dipindahkan ke satu daftar tes kasus di akhir posting, yang lebih nyaman untuk copy-paste ke dalam kerangka uji.
Peter Taylor

Jawaban:

4

Japt, 50 48 byte

Percobaan pertama; mungkin ada metode yang lebih baik.

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

Cobalah online!

Bagaimana itu bekerja

          // 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
Produksi ETH
sumber
7

JavaScript (ES6), 76 68 byte

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

Upaya pertama lainnya. Syukurlah untuk yang praktis .toLocaleString(), alternatif terpendek yang bisa saya temukan adalah 21 byte lebih lama ...

Ini memisahkan ribuan dengan salah satu ,atau ., tergantung pada negara tempat Anda tinggal. Untuk lima dua byte lebih, Anda dapat membuatnya selalu menggunakan koma:

x=>x<1e4?x.toLocaleString`en`:(x<1e5?(x/1e2+.5|0)/10:(x/1e3+.5|0))+"k"
Produksi ETH
sumber
Lokal Anda berfungsi dengan baik untuk Anda, tetapi di sini di Italia, saya mendapatkan 1,234 (titik alih-alih koma)
edc65
@ edc65 Nah, itu masalah saya tidak pernah berpikir saya akan bertemu dengan kode golf. Apakah ini berfungsi sekarang?
ETHproduk
Sempurna. Sungguh saya tidak berpikir itu bisa dilakukan. Dan saya mencoba hanya 'en' dan sepertinya berhasil juga
edc65
Saya tidak berpikir Anda perlu menyesuaikan untuk lokal, karena tidak harus portabel.
geokavel
1
Pada dasarnya, jika bekerja di komputer Anda, saya pikir itu cukup baik.
geokavel
3

JavaScript (ES6), 71

Mengalahkan @ETHProductions sementara dia tidak melihat petunjuk saya. Dia melihatnya.

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

Uji

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>

Uji

edc65
sumber
1
Mungkin Anda harus memperbarui jalur "mengalahkan produk ETH" ...?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ selesai.
edc65
2

ES6, 68 62 byte

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

Sunting: Disimpan 6 byte ketika saya menyadari bahwa ["1", "001"]stringify to"1,001" .

Sunting: Disimpan 2 byte untuk memperbaiki komentar @ Mwr247!

Neil
sumber
16950memberi 16.9kbukannya17k
Mwr247
@ Mwr247 Terima kasih, perbaikannya menyelamatkan saya dua byte lagi!
Neil
1

Python 2.7, 58 byte

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

Saya harus menggunakan (x+.5)untuk menangani 16950->17kkasus ini ..

TFeld
sumber