Formatieren Sie den Ruf


13

Sie wissen wahrscheinlich, dass die verschiedenen Reputationsebenen in Stack Exchange von der Fragenseite / einem Beitrag aus unterschiedlich formatiert sind. Es gibt alle Regeln für die Neuformatierung:

  • Wenn ein Benutzer 1 bis 999 (ein bis drei Ziffern) Wiederholungen hat, bleibt er unverändert.
  • Wenn ein Benutzer 1000 bis 9999 Wiederholungen (vier Ziffern) hat, erhält er das Komma als Trennzeichen: 9,999
  • Wenn ein Benutzer 10000 bis 99999 Wiederholungen (fünf Stellen) hat, wird er gekürzt und gerundet. Dh 16741 Wiederholung ist formatiert als 16.7k, beachten Sie das Punkttrennzeichen im Gegensatz zum Komma für die untere Wiederholung (vorheriger Punkt).

    1. 16750 wird sich schon ergeben 16.8k(da dies behoben zu sein scheint )

    2. 16941 ergibt 16.9k, 16950 rundet auf 17k, ebenso wie beispielsweise 17014.

    3. 99941 Runden auf 99.9k, 99950 Runden auf 100k(das ist etwas, was ich bei der Rundung auf SE eigentlich hasse, weil 100.000 so ein Meilenstein sind und 99950 bei weitem nicht in der Nähe sind).

  • Wenn ein Benutzer 100000 bis 999999 Mitarbeiter hat, wird dies folgendermaßen gerundet:

    1. 100k100100 runden auf , 100500 runden auf 101k. Die Sache ist, die Rundung wird durchgeführt, aber der Dezimalteil wird entfernt (im Gegensatz zur vierstelligen Wiederholung).

    2. 100450 rundet auf 100k, kein Schritt auf 450 bis 500. 100499 auch nicht - es ist immer noch 100k.

    3. 279843 runden auf 280kund 399999 runden auf 400k.

Als Eingabe erhalten Sie die unformatierte Reputation und geben sie als formatiert aus.

Sie können prüfen , dass die Eingabe nicht ungültige Nummern / Nicht-Nummern empfangen oder Zahlen mit führenden Nullen, dh 0001234.

Da Jon Skeet nicht in Kürze 1.000.000 zu erreichen scheint, muss Ihr Code so kurz wie möglich sein, und Sie müssen nicht mehr als eine Million Wiederholungen ausführen (dh keine Sonderfälle für 999500 und höher).


7
"Weil Jon Skeet nicht bald 1.000.000 zu erreichen scheint"
Milo Brandt

@Milo Easy - er hat 93.000 für 2015 verdient. Er hat 163.685 bis 1.000.000 übrig, so dass er mehr als 1,5 Jahre brauchen wird (fast 2, würde ich sagen). Berücksichtigen Sie dabei auch, dass sein jährlicher Repräsentant seit 2011 mit jedem Jahr abnimmt. 2011: 134,7 Tsd., 2012: 131,8 Tsd., 2013: 116,8 Tsd., 2014: 104,3 Tsd., 2015: 94,3 Tsd..
Nicoleel

Eine lange Erklärung, aber alles in allem ist es nur die Art und Weise, wie normalerweise gerundet wird
edc65

@Edc Siehe diese Antwort von Peter Taylor.
Nicoleel

2
Ich denke, die Erklärung könnte verkürzt werden, indem gesagt wird: " Wenn die Wiederholung im Bereich von 10000 bis 994999 (beide einschließlich) liegt, wird sie unter Verwendung der Halbierungsregel, dividiert durch 1000, auf 3 signifikante Stellen gerundet und mit .einem Dezimalpunkt angezeigt und mit einem Suffix k; vorbehaltlich der Einschränkung, dass, wenn die dritte signifikante Ziffer 0rechts vom Dezimalpunkt liegt und liegt, der Wert nur auf 2 signifikante Ziffern angezeigt wird. "Die spezifischen Grenzwerte könnten dann in eine einzelne Testliste verschoben werden Fälle am Ende des Beitrags, was für das Einfügen in ein Testframework bequemer ist.
Peter Taylor

Antworten:


4

Japt, 50 48 Bytes

Erster Versuch; Möglicherweise gibt es eine bessere Methode.

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

Probieren Sie es online!

Wie es funktioniert

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

Ein weiterer erster Versuch. Gott sei Dank für das Handy .toLocaleString(), die kürzeste Alternative, die ich finden konnte, ist 21 Bytes länger ...

Dies trennt Tausende entweder durch ,oder ., abhängig davon, in welchem ​​Land Sie leben. Bei fünf oder zwei Bytes mehr können Sie dafür immer ein Komma verwenden:

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

Ihr Gebietsschema funktioniert gut für Sie, aber hier in Italien erhalte ich 1.234 (Punkt statt Komma)
edc65

@ edc65 Nun, das ist ein Problem, mit dem ich nie gerechnet hätte. Funktioniert es jetzt?
ETHproductions

Perfekt. Wirklich dachte ich nicht, dass das machbar war. Und ich habe es einfach mit 'en' versucht und es scheint auch zu funktionieren
edc65

Ich glaube nicht, dass Sie das Gebietsschema anpassen müssen, da es nicht portabel sein muss.
Geokavel

1
Grundsätzlich, wenn es auf Ihrem Computer funktioniert, denke ich, dass es gut genug ist.
Geokavel

3

JavaScript (ES6), 71

@ETHProductions schlagen, während er meinen Hinweis nicht sieht. Er sah es.

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

Prüfung

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>

Prüfung


1
Vielleicht sollten Sie Ihre "beating ETHproductions" -Linie aktualisieren ...?
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ erledigt.
EDC65

2

ES6, 68 62 Bytes

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

Bearbeiten: 6 Bytes ["1", "001"]gespeichert, als ich merkte, dass dies zu Zeichenfolgen führt "1,001".

Bearbeiten: 2 Bytes gespeichert, um den Kommentar von @ Mwr247 zu korrigieren!


16950gibt 16.9kstatt17k
Mwr247

@ Mwr247 Danke, das Update erspart mir zwei Bytes mehr!
Neil

1

Python 2.7, 58 Bytes

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

Ich musste verwenden (x+.5), um mit dem 16950->17kFall umzugehen ..

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.