Use letras para diminuir os números

9

Desafio

Pegue um número e imprima-o com 4 dígitos ou menos usando letras e números. Por exemplo; 270,030iria se transformar 270K.

Chave

Bilhões -> B

Milhões -> M

Milhares -> K

Regras

  • Você pode optar por aceitar números de entrada que incluem vírgulas que delimitam a cada três casas decimais (como 123,456,789).
  • Arredonde para o mais próximo, pela metade.
  • Os números só aumentam 999,499,999,999.
  • A parte mantissa da resposta deve ser pelo menos 1.
  • Todas as letras devem estar em maiúsculas e conforme especificado acima.
  • As saídas devem ter 4 ou menos dígitos. (incluindo cartas, tais como B, Ke M)
  • As saídas devem ser matematicamente precisas quanto possível. Exemplo:
    • 15,480-> 20K NÃO está OK
    • 15,480-> 15.5K BOM
  • Se houver várias saídas com a mesma precisão matemática, retorne uma delas. Exemplo:
    • 1000-> 1000 BOM
    • 1000-> 1K BOM

Exemplos:

1.234.567 -> 1,23M
999.500 -> 1 milhão
999.499 -> 999K
102 -> 102
1000 -> 1K
1001 -> 1001
100.000 -> 100.000
12.345.678.912 -> 12,3B
1.452.815.612 -> 1,45B

Submissões

zoecarver
fonte

Respostas:

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]}

Experimente online!

(Toma entradas como números)

Casos especiais, o primeiro onde i < 1000, se , o próprio número é sempre uma das maneiras mais curtas, se não a única maneira mais curta.

Caso contrário, ele será dividido por 1000 até que a divisão não tenha números significativos acima de 1 e escolha um sufixo com base em quantas divisões foram feitas.

Artyer
fonte
O último caso deve ter 999,5M, ou talvez não, com base em especificações soltas.
Magic Octopus Urn
Lembre-se de que você precisa suportar até um trilhão.
GarethPW
@GarethPW Não há como representar números acima de 999.499.999.999, de acordo com a especificação (Não T -> trillionna chave), então presumi que esse fosse o limite superior. Vou perguntar, mas de outra forma é uma perda de um byte.
Artyer 19/07
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

Experimente online!

GarethPW
fonte
um pouco mais curto:def f(n):l=len(str(n))-4;return[n,f"{round(n,~l):,}"[:4].replace(*",.").rstrip('.')+"KMBT"[-~l//3]][n>9999]
wrymug 19/07/19
11
@JonathanAllan Nothing. Meu erro.
Artyer 19/07
@rosslh Eu fiz essa alteração, mas não consegui mantê-la ao consertar o bug 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
fonte