Usa letras para acortar los números

9

Desafío

Tome un número y emítalo con 4 dígitos o menos usando letras y números. Por ejemplo; 270,030se convertiría en 270K.

Llave

Mil millones -> B

Millones -> M

Mil -> K

Reglas

  • Puede elegir aceptar números de entrada que incluyan comas que delimiten cada tres lugares decimales (como 123,456,789).
  • Redondear al más cercano, medio arriba.
  • Los números solo subirán 999,499,999,999.
  • La parte de mantisa de la respuesta debe ser al menos 1.
  • Todas las letras deben ser mayúsculas y como se especifica arriba.
  • Las salidas deben tener 4 o menos dígitos. (incluyendo cartas, tales como B, K, y M)
  • Las salidas deben ser tan matemáticamente precisas como sea posible. Ejemplo:
    • 15,480-> 20K NO ESTÁ BIEN
    • 15,480-> 15.5K BUENO
  • Si hay varias salidas con la misma precisión matemática, devuelva cualquiera de ellas. Ejemplo:
    • 1000-> 1000 BUENO
    • 1000-> 1K BUENO

Ejemplos:

1,234,567 -> 1.23M
999,500 -> 1M
999,499 -> 999K
102 -> 102
1000 -> 1K
1001 -> 1001
100,000 -> 100K
12,345,678,912 -> 12.3B
1,452,815,612 -> 1.45B

Envíos

zoecarver
fuente

Respuestas:

2

JavaScript, 84 79 bytes

i=>{I=i;for(x=-1;i>=999.5;x++)i/=1e3;return I<1e4?I:+i.toPrecision(3)+'KMB'[x]}

Pruébalo en línea!

(Toma entradas como números)

En casos especiales, el primero es si i < 1000, el número en sí mismo es siempre una de las formas más cortas, si no la única.

De lo contrario, lo divide por 1000 hasta que dividirlo haría que no tuviera cifras significativas por encima de 1, y elige un sufijo basado en cuántas divisiones se hicieron.

Artyer
fuente
El último caso debe ser 999.5M, o tal vez no, inseguro basado en especificaciones sueltas.
Magic Octopus Urn
Recuerda que necesitas soportar hasta un billón.
GarethPW
@GarethPW No hay forma de representar números superiores a 999,499,999,999 de acuerdo con la especificación (No T -> trillionen la clave), por lo que supuse que este era el límite superior. Preguntaré, pero es una pérdida de un byte de lo contrario.
Artyer
1

Python 3 , 127 bytes

def f(n):s=str(n);l=len(s)-4;return f"{round(n,~l):,}"[:4].replace(*",.").rstrip('.')+"KMBT"[l//3+(int(s[3])>4)]if n>9999else n

Pruébalo en línea!

GarethPW
fuente
un poco más corto:def f(n):l=len(str(n))-4;return[n,f"{round(n,~l):,}"[:4].replace(*",.").rstrip('.')+"KMBT"[-~l//3]][n>9999]
wrymug
1
@JonathanAllan Nada. Mi error.
Artyer
@rosslh Realicé esa alteración pero no pude mantenerla al corregir el error 999499 -> 999M.
GarethPW
1

JavaScript (ES7), 74 bytes

n=>n<1e4?n:(c=n.toExponential(2).split`e`).shift()*10**(c%3)+' KMB'[c/3|0]

JavaScript (ES6), 80 bytes

n=>n<1e4?n:(c=n.toExponential(2).split`e`).shift()*[1,10,100][c%3]+' KMB'[c/3|0]

Rick Hitchcock
fuente