Sformatuj reputację

13

Prawdopodobnie wiesz, że różne poziomy reputacji na Stack Exchange są różnie sformatowane, gdy są widoczne na stronie pytań / postu. Istnieją wszystkie reguły formatowania powtórzeń:

  • jeśli użytkownik ma od 1 do 999 powtórzeń (od jednej do trzech cyfr), pozostaje niezmieniony.
  • jeśli użytkownik ma 1000 do 9999 powtórzeń (cztery cyfry), otrzymuje przecinek jako separator: 9,999
  • jeśli użytkownik ma od 10000 do 99999 powtórzeń (pięć cyfr), zostanie skrócony i zaokrąglony. To znaczy, powtórzenie 16741 jest sformatowane jako 16.7k, zwróć uwagę na separator kropki w przeciwieństwie do przecinka dla niższego powtórzenia (poprzedni punkt).

    1. 16750 już spowoduje 16.8k(ponieważ wydaje się to naprawione )

    2. 16941 powoduje 16.9k, 16950 zaokrągla w górę 17k, a także 17014, na przykład.

    3. 99941 rund do 99.9k, 99950 rund do 100k(jest to coś, czego tak naprawdę nienawidzę zaokrąglaniem powtórzeń na SE, ponieważ 100 000 to taki kamień milowy, a 99950 nie jest w pobliżu).

  • Jeśli użytkownik ma 100000 do 999999 powtórzeń, jest zaokrąglany w ten sposób:

    1. 100100 zaokrągla w dół do 100k, 100500 zaokrągla w górę do 101k. Chodzi o to, że zaokrąglanie jest zakończone, ale część dziesiętna jest usuwana (w przeciwieństwie do czterocyfrowego powtórzenia).

    2. 100450 zaokrągla w dół do 100k, nie ma kroku, aby zaokrąglić 450 do 500. Ani 100499 - nadal jest 100k.

    3. 279843 zaokrągla w górę 280ki 399999 zaokrągla do 400k.

Jako dane wejściowe otrzymujesz surową reputację i wyprowadzasz ją w formacie sformatowanym.

Możesz wziąć pod uwagę, że dane wejściowe nie otrzymają żadnych niepoprawnych liczb / nieliczb lub liczb z zerami wiodącymi, tj 0001234.

Ponieważ Jon Skeet nie wydaje się wkrótce osiągać 1 000 000, twój kod musi być tak krótki, jak to możliwe , nie musisz zajmować się powtórzeniem większym niż milion (tj. Nie ma specjalnych przypadków dla 999500 i wyższych).

Nicość
źródło
7
„Ponieważ Jon Skeet nie wydaje się wkrótce osiągać 1 000 000” [potrzebne źródło]
Milo Brandt
@Milo Easy - zarobił 93 tys. W 2015 r. Zostało mu 163 685 do 1 000 000, więc w ten sposób zajmie mu to ponad 1,5 roku (powiedziałbym, że prawie 2 lata). W związku z tym należy również wziąć pod uwagę, że jego roczny przedstawiciel spada z każdym rokiem, od 2011 r. 2011: 134,7 tys., 2012: 131,8 tys., 2013: 116,8 tys., 2014: 104,3 tys., 2015: 94,3 tys.
nicael
Długie wyjaśnienie, ale w sumie jest to po prostu sposób, w jaki zaokrąglanie jest zwykle wykonywane
edc65
@Edc Zobacz tę odpowiedź Peter Taylor.
nicael
2
Myślę, że wyjaśnienie można skrócić, mówiąc: „ Jeśli powtórzenie mieści się w zakresie od 10000 do 994999 (oba włącznie), jest zaokrąglane do 3 znaczących cyfr przy użyciu reguły połowicznego podziału, podzielonej przez 1000, i wyświetlane z .przecinkiem oraz z przyrostkiem k; z zastrzeżeniem, że jeśli trzecia znacząca cyfra jest 0i jest po prawej stronie przecinka dziesiętnego, wówczas wartość jest wyświetlana tylko do 2 cyfr znaczących. ”Określone wartości odcięcia można następnie przenieść na pojedynczą listę testów przypadki na końcu postu, co jest wygodniejsze w przypadku wklejania kopii do środowiska testowego.
Peter Taylor,

Odpowiedzi:

4

Japt, 50 48 bajtów

Pierwsze podejscie; może być lepsza metoda.

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

Wypróbuj online!

Jak to działa

          // 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
ETHprodukcje
źródło
7

JavaScript (ES6), 76 68 bajtów

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

Kolejna pierwsza próba. Dzięki Bogu za to przydatne .toLocaleString(), najkrótsza alternatywa, jaką mogłem znaleźć, to 21 bajtów dłużej ...

Dzieli to tysiące według jednego ,lub ., w zależności od kraju, w którym mieszkasz. Aby uzyskać pięć dwóch bajtów więcej, możesz zawsze używać przecinka:

x=>x<1e4?x.toLocaleString`en`:(x<1e5?(x/1e2+.5|0)/10:(x/1e3+.5|0))+"k"
ETHprodukcje
źródło
Twoje ustawienia regionalne działają dobrze, ale tutaj we Włoszech dostaję 1,234 (kropka zamiast przecinka)
edc65
@ edc65 To jest problem, o którym nigdy nie myślałem, że wpadnę na golfa kodowego. Czy to działa teraz?
ETHprodukcje
Doskonały. Naprawdę nie sądziłem, że to wykonalne. Próbowałem tylko „en” i wydaje się, że to też działa
edc65
Nie sądzę, że musisz dostosować się do ustawień regionalnych, ponieważ nie musi być przenośny.
geokavel
1
Zasadniczo, jeśli działa na twoim komputerze, myślę, że jest wystarczająco dobry.
geokavel
3

JavaScript (ES6), 71

Pokonanie @ETHProductions, gdy nie widzi mojej wskazówki. On to widział.

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

Test

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>

Test

edc65
źródło
1
Być może powinieneś zaktualizować linię „pokonując ETHproductions” ...?
Conor O'Brien
@ CᴏɴᴏʀO'Bʀɪᴇɴ gotowe.
edc65
2

ES6, 68 62 bajtów

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

Edycja: ["1", "001"]Zapisałem 6 bajtów, kiedy zdałem sobie sprawę, że to oznacza "1,001".

Edycja: Zapisano 2 bajty, aby naprawić komentarz @ Mwr247!

Neil
źródło
16950daje 16.9kzamiast17k
Mwr247
@ Mwr247 Dzięki, poprawka oszczędza mi jeszcze dwa bajty!
Neil
1

Python 2.7, 58 bajtów

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

Musiałem użyć, (x+.5)aby załatwić 16950->17ksprawę.

TFeld
źródło