Định dạng danh tiếng


13

Bạn có thể biết rằng các mức độ danh tiếng khác nhau trên Stack Exchange được định dạng khác nhau khi nhìn từ trang câu hỏi / bài đăng. Có tất cả các quy tắc định dạng lại:

  • nếu người dùng có từ 1 đến 999 (một đến ba chữ số), thì nó vẫn như cũ.
  • nếu người dùng có 1000 đến 9999 rep (bốn chữ số), nó sẽ nhận được dấu phẩy dưới dạng dấu phân cách: 9,999
  • nếu người dùng có 10000 đến 99999 đại diện (năm chữ số), nó sẽ được rút ngắn và làm tròn. Tức là, đại diện 16741 được định dạng là 16.7k, chú ý dấu phân cách dấu chấm không giống như dấu phẩy cho đại diện thấp hơn (điểm trước).

    1. 16750 sẽ có kết quả 16.8k(vì điều này dường như đã được sửa )

    2. 16941 kết quả 16.9k, 16950 vòng lên đến 17k, cũng như 17014, ví dụ.

    3. 99941 vòng tới 99.9k, 99950 vòng tới 100k(đây là điều tôi thực sự ghét với vòng lặp lại trên SE, bởi vì 100.000 là một cột mốc như vậy, và 99950 không ở đâu cả).

  • Nếu người dùng có 100000 đến 999999 đại diện, thì nó được làm tròn theo cách này:

    1. 100100 vòng xuống 100k, 100500 vòng lên tới 101k. Điều này là, làm tròn được thực hiện, nhưng phần thập phân bị tước (không giống như đại diện bốn chữ số).

    2. 100450 vòng xuống 100k, không bước tới vòng 450 đến 500. Cũng không 100499 - vẫn vậy 100k.

    3. 279843 vòng tới 280k, và 399999 vòng tới 400k.

Là đầu vào, bạn được cung cấp danh tiếng thô và xuất nó dưới dạng định dạng.

Bạn có thể xem xét rằng đầu vào sẽ không nhận được bất kỳ số / số không hợp lệ hoặc số nào có số 0 đứng đầu, tức là 0001234.

Vì Jon Skeet dường như không đạt được 1.000.000 sớm, mã của bạn phải càng ngắn càng tốt, bạn không cần phải xử lý đại diện lớn hơn một triệu (tức là không có trường hợp đặc biệt nào cho 999500 trở lên).


7
"Bởi vì Jon Skeet dường như không đạt được 1.000.000 sớm" [cần dẫn nguồn]
Milo Brandt

@Milo Easy - anh ta kiếm được 93 nghìn cho năm 2015. Anh ta còn lại 163.685 cho đến 1.000.000, vì vậy cách này sẽ khiến anh ta mất hơn 1,5 năm (gần 2, tôi muốn nói). Với điều này, bạn cũng nên tính đến việc đại diện hàng năm của anh ấy đang giảm dần theo từng năm, kể từ năm 2011 2011: 134,7k, 2012: 131,8k, 2013: 116,8k, 2014: 104,3k, 2015: 94,3k.
nicael

Một lời giải thích dài, nhưng tất cả, đó chỉ là cách làm tròn được thực hiện một cách bình thường
edc65

@Edc Xem câu trả lời này của Peter Taylor.
nicael

2
Tôi nghĩ rằng lời giải thích có thể được rút ngắn bằng cách nói " Nếu đại diện nằm trong phạm vi 10000 đến 994999 (bao gồm cả hai), nó được làm tròn thành 3 con số quan trọng bằng cách sử dụng quy tắc nửa, chia cho 1000 và hiển thị với .dấu thập phân và với một hậu tố k, tùy theo lời cảnh báo rằng nếu con số đáng kể thứ ba 0nằm ở bên phải dấu thập phân thì giá trị chỉ được hiển thị thành 2 con số quan trọng. "Sau đó, các điểm cắt cụ thể có thể được chuyển sang một danh sách kiểm tra duy nhất trường hợp ở cuối bài, thuận tiện hơn cho việc sao chép vào khung kiểm tra.
Peter Taylor

Câu trả lời:


4

Japt, 50 48 byte

Nỗ lực đầu tiên; có thể có một phương pháp tốt hơn

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

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

          // 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 byte

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

Một nỗ lực đầu tiên. Cảm ơn chúa vì sự tiện dụng đó .toLocaleString(), sự thay thế ngắn nhất tôi có thể tìm thấy là dài hơn 21 byte ...

Điều này phân tách hàng ngàn bởi một trong hai ,hoặc ., tùy thuộc vào quốc gia bạn sống. Để thêm năm hai byte, bạn có thể làm cho nó luôn sử dụng dấu phẩy:

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

Địa điểm của bạn hoạt động tốt cho bạn, nhưng ở đây tại Ý tôi nhận được 1,234 (dấu chấm thay vì dấu phẩy)
edc65

@ edc65 Bây giờ đó là một vấn đề tôi không bao giờ nghĩ rằng tôi sẽ gặp phải với một mã golf. Nó có hoạt động bây giờ không?
Sản phẩm ETH

Hoàn hảo. Thực sự tôi đã không nghĩ rằng đó là có thể làm được. Và tôi đã thử chỉ 'en' và nó dường như cũng hoạt động
edc65

Tôi không nghĩ bạn cần điều chỉnh cho miền địa phương, vì nó không cần phải di động.
geokavel

1
Về cơ bản, nếu nó hoạt động trên máy tính của bạn, tôi nghĩ nó đủ tốt.
geokavel

3

JavaScript (ES6), 71

Đánh bại @ETHSản phẩm trong khi anh ta không thấy gợi ý của tôi. Anh ấy đã thấy nó.

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

Kiểm tra

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>

Kiểm tra


1
Có lẽ bạn nên cập nhật dòng "đánh bại ETHproductions" của mình ...?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ đã xong.
edc65

2

ES6, 68 62 byte

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

Chỉnh sửa: Đã lưu 6 byte khi tôi nhận ra rằng ["1", "001"] chuỗi "1,001".

Chỉnh sửa: Đã lưu 2 byte để sửa nhận xét của @ Mwr247!


16950đưa ra 16.9kthay vì17k
Mwr247

@ Mwr247 Cảm ơn, bản sửa lỗi giúp tôi tiết kiệm thêm hai byte!
Neil

1

Python 2.7, 58 byte

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

Tôi đã phải sử dụng (x+.5)để giải quyết 16950->17kvụ án ..

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.