Dar formato a la reputación

13

Probablemente sepa que los diferentes niveles de reputación en Stack Exchange tienen un formato diferente cuando se ven desde la página de preguntas / una publicación. Existen todas las reglas de formateo de repeticiones:

  • si un usuario tiene 1 a 999 (uno a tres dígitos) rep, se deja como está.
  • Si un usuario tiene 1000 a 9999 repeticiones (cuatro dígitos), recibe la coma como separador: 9,999
  • si un usuario tiene de 10000 a 99999 repeticiones (cinco dígitos), se acorta y se redondea. Es decir, 16741 rep está formateado como 16.7k, observe el separador de puntos a diferencia de la coma para el rep inferior (punto anterior).

    1. 16750 ya resultará 16.8k(ya que esto parece estar solucionado )

    2. 16941 da como resultado 16.9k, 16950 redondea hasta 17k, al igual que 17014, por ejemplo.

    3. 99941 redondea a 99.9k, 99950 redondea a 100k(esto es algo que realmente odio con el redondeo de repeticiones en SE, porque 100,000 es un hito y 99950 no está cerca).

  • Si un usuario tiene 100000 a 999999 repeticiones, se redondea de esta manera:

    1. 100100 redondea hacia abajo 100k, 100500 redondea hasta 101k. La cuestión es que el redondeo está hecho, pero la parte decimal se elimina (a diferencia del representante de cuatro dígitos).

    2. 100450 se redondea hacia abajo 100k, no hay paso para redondear 450 a 500. Tampoco 100499, sigue siendo 100k.

    3. 279843 redondea hacia arriba 280ky 399999 redondea hacia 400k.

Como entrada, se le da la reputación bruta y la emite como formateada.

Puede considerar que la entrada no recibirá números / no números no válidos, o números con ceros a la izquierda, es decir 0001234.

Debido a que Jon Skeet no parece llegar a 1,000,000 pronto, su código debe ser lo más breve posible , no necesita manejar el representante mayor de un millón (es decir, no hay casos especiales para 999500 y superiores).

nicael
fuente
77
"Porque Jon Skeet no parece estar llegando a 1,000,000 pronto" [cita requerida]
Milo Brandt
@Milo Easy : ganó 93k para 2015. Le quedan 163,685 hasta 1,000,000, por lo que le llevará más de 1,5 años (casi 2, diría). Con esto, también debe tener en cuenta que su reputación anual está disminuyendo con cada año, desde 2011. 2011: 134.7k, 2012: 131.8k, 2013: 116.8k, 2014: 104.3k, 2015: 94.3k.
nicael
Una explicación larga, pero en general, es la forma en que el redondeo se realiza
habitualmente
@Edc Ver esta respuesta de Peter Taylor.
nicael
2
Creo que la explicación podría acortarse diciendo " Si el representante está en el rango de 10000 a 994999 (ambos incluidos), se redondea a 3 cifras significativas usando la regla de mitad arriba, dividido entre 1000 y se muestra con .un punto decimal y con un sufijo k; sujeto a la advertencia de que si la tercera cifra significativa está 0y está a la derecha del punto decimal, entonces el valor se muestra solo a 2 cifras significativas " . Los valores de corte específicos se podrían mover a una sola lista de prueba casos al final de la publicación, que es más conveniente para copiar y pegar en un marco de prueba.
Peter Taylor

Respuestas:

4

Japt, 50 48 bytes

Primer intento; Puede haber un mejor método.

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

Pruébalo en línea!

Cómo funciona

          // 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
ETHproductions
fuente
7

JavaScript (ES6), 76 68 bytes

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

Otro primer intento. Gracias a Dios por eso .toLocaleString(), la alternativa más corta que pude encontrar es 21 bytes más larga ...

Esto separa miles entre uno ,u otro ., según el país en el que viva. Para cinco dos bytes más, puede hacer que siempre use una coma:

x=>x<1e4?x.toLocaleString`en`:(x<1e5?(x/1e2+.5|0)/10:(x/1e3+.5|0))+"k"
ETHproductions
fuente
Su ubicación funciona bien para usted, pero aquí en Italia obtengo 1.234 (punto en lugar de coma)
edc65
@ edc65 Ahora ese es un problema que nunca pensé que me encontraría con un código de golf. ¿Funciona ahora?
ETHproductions
Perfecto. Realmente no pensé que fuera factible. E intenté solo 'en' y parece funcionar también
edc65
No creo que necesite ajustar la configuración regional, porque no necesita ser portátil.
geokavel
1
Básicamente, si funciona en su computadora, creo que es lo suficientemente bueno.
geokavel
3

JavaScript (ES6), 71

Vencer a @ETHProductions mientras no ve mi pista. El lo vió.

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

Prueba

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>

Prueba

edc65
fuente
1
¿Quizás debería actualizar su línea de "batir ETHproductions" ...?
Conor O'Brien el
@ CᴏɴᴏʀO'Bʀɪᴇɴ hecho.
edc65
2

ES6, 68 62 bytes

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

Editar: guardado 6 bytes cuando me di cuenta de que ["1", "001"]stringifica a "1,001".

Editar: ¡Se guardaron 2 bytes para arreglar el comentario de @ Mwr247!

Neil
fuente
16950da en 16.9klugar de17k
Mwr247
@ Mwr247 ¡Gracias, la solución me ahorra dos bytes más!
Neil
1

Python 2.7, 58 bytes

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

Tuve que usar (x+.5)para lidiar con el 16950->17kcaso ...

TFeld
fuente