จัดรูปแบบชื่อเสียง


13

คุณอาจรู้ว่าระดับชื่อเสียงที่แตกต่างกันในการแลกเปลี่ยนแบบกองมีรูปแบบแตกต่างกันเมื่อเห็นจากหน้าคำถาม / โพสต์ มีกฎการจัดรูปแบบตัวแทนทั้งหมด:

  • หากผู้ใช้มีตัวแทน 1 ถึง 999 (หนึ่งถึงสามหลัก) ตัวแทนจะเหลือตามที่เป็น
  • หากผู้ใช้มีตัวแทน 1,000 ถึง 9999 (สี่หลัก) ผู้ใช้จะได้รับเครื่องหมายจุลภาคเป็นตัวคั่น: 9,999
  • หากผู้ใช้มีตัวแทน 10,000 ถึง 99999 (ห้าหลัก) มันจะสั้นและกลม เช่น, 16741 ตัวแทนจัดรูปแบบเป็น16.7kสังเกตเห็นตัวคั่นจุดที่แตกต่างจากเครื่องหมายจุลภาคสำหรับตัวแทนที่ต่ำกว่า (จุดก่อนหน้า)

    1. 16750 จะส่งผลให้16.8k(เนื่องจากสิ่งนี้ดูเหมือนจะได้รับการแก้ไข )

    2. 16941 ผลลัพธ์ใน16.9k, 16,950 รอบสูงสุด17kเช่นเดียวกับ 17014 เช่น

    3. 99941 รอบไป99.9k, 99950 รอบถึง100k(นี่คือสิ่งที่ฉันเกลียดจริง ๆ กับตัวแทนรอบใน SE เพราะ 100,000 เป็นเหตุการณ์สำคัญและ 99950 ไม่มีที่ใกล้เคียง)

  • หากผู้ใช้มีตัวแทน 100000 ถึง 999999 มันจะถูกปัดเศษด้วยวิธีนี้:

    1. 100100 รอบลงไป100k, 100,500 101kรอบขึ้นไป สิ่งนั้นคือการปัดเศษเสร็จ แต่ส่วนทศนิยมถูกถอด (ไม่เหมือนตัวแทนสี่หลัก)

    2. 100,450 รอบลงไปที่100kขั้นตอนไม่มีรอบ 450 ถึง 500 100499 หรือไม่ - 100kก็ยังคง

    3. 279,843 รอบขึ้นไป280kและ 399,999 400kรอบ

ในฐานะที่เป็นอินพุทคุณจะได้รับชื่อเสียงดิบและส่งออกตามรูปแบบ

คุณสามารถพิจารณาการป้อนข้อมูลที่จะไม่ได้รับตัวเลขใด ๆ ที่ไม่ถูกต้อง / 0001234หมายเลขไม่ใช่หรือตัวเลขด้วยศูนย์ชั้นนำเช่น

เนื่องจาก Jon Skeet ดูเหมือนจะไม่ถึง 1,000,000 ในไม่ช้ารหัสของคุณจะต้องสั้นที่สุดคุณไม่จำเป็นต้องจัดการตัวแทนมากกว่าหนึ่งล้านคน (เช่นไม่มีกรณีพิเศษสำหรับ 999500 ขึ้นไป)


7
"เพราะ Jon Skeet ดูเหมือนจะไม่ถึง 1,000,000 ในไม่ช้า"
Milo Brandt

@Milo Easy - เขามีรายได้ 93k ในปี 2558 เขามีเหลือ 163,685 คนจนถึง 1,000,000 ดังนั้นวิธีนี้จะพาเขาไปนานกว่า 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
ฉันคิดว่าคำอธิบายอาจสั้นลงโดยพูดว่า " ถ้าตัวแทนอยู่ในช่วง 10,000 ถึง 994999 (รวมทั้งสองอย่าง) มันจะถูกปัดเศษเป็นตัวเลข 3 ตัวที่สำคัญโดยใช้กฎครึ่งตัวหารด้วย 1,000 และแสดงด้วย.ทศนิยม และมีการ suffixed k; ภายใต้ข้อแม้ที่ว่าถ้าตัวเลขที่มีนัยสำคัญที่สามคือ0และเป็นไปทางขวาของจุดทศนิยมแล้วค่าจะปรากฏเฉพาะ 2 ตัวเลขที่สำคัญ. "เฉพาะเจาะจงแต่งตัวสามารถแล้วถูกย้ายไปยังรายการเดียวของการทดสอบ กรณีในตอนท้ายของการโพสต์ซึ่งสะดวกกว่าสำหรับการคัดลอกการวางลงในกรอบการทดสอบ
Peter Taylor

คำตอบ:


4

Japtap, 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

สมบูรณ์ จริง ๆ แล้วฉันไม่คิดว่าจะทำได้ และฉันก็ลอง '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
บางทีคุณควรอัปเดตรายการ "การตี ETHproductions" ของคุณ ...
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴเรียบร้อยแล้ว
edc65

2

ES6, 68 62 ไบต์

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

แก้ไข: บันทึกไว้ 6 ไบต์เมื่อฉันตระหนักว่า["1", "001"]stringifies "1,001"ไป

แก้ไข: บันทึก 2 ไบต์เพื่อแก้ไขความคิดเห็นของ @ Mwr247!


16950ให้16.9kแทน17k
Mwr247

@ Mwr247 ขอบคุณการแก้ไขช่วยฉันอีกสองไบต์!
Neil

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.