Użyj liter, aby skrócić liczby

9

Wyzwanie

Weź liczbę i wyślij ją 4 cyframi lub mniej, używając liter i cyfr. Na przykład; 270,030zamieniłby się w 270K.

Klucz

Miliardy -> B

Milion -> M

Tysiąc -> K

Zasady

  • Możesz zaakceptować liczby wejściowe zawierające przecinki rozdzielane co trzy miejsca dziesiętne (np. 123,456,789).
  • Zaokrąglić do najbliższego, w połowie.
  • Liczby wzrosną tylko do 999,499,999,999.
  • Część mantysy odpowiedzi powinna wynosić co najmniej 1.
  • Wszystkie litery muszą być wielkie i jak określono powyżej.
  • Wyjścia muszą składać się z 4 lub mniej cyfr. (w tym takich jak litery B, Ki M)
  • Wyniki muszą być możliwie matematycznie dokładne. Przykład:
    • 15,480-> 20K NIE OK
    • 15,480-> 15.5K DOBRY
  • Jeśli istnieje wiele wyników o tej samej matematycznej precyzji, zwróć jedno z nich. Przykład:
    • 1000-> 1000 DOBRY
    • 1000-> 1K DOBRY

Przykłady:

1 234 567 -> 1,23 mln
999 500 -> 1 mln
999,499 -> 999 tys
102 -> 102
1000 -> 1 tys
1001 -> 1001
100 000 -> 100 tys
12 345 678,912 -> 12,3B
1 452 815 612 -> 1,45 B.

Zgłoszenia

zoecarver
źródło

Odpowiedzi:

2

JavaScript, 84 79 bajtów

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

Wypróbuj online!

(Pobiera dane wejściowe jako liczby)

Przypadki szczególne - pierwszy, w którym jeśli i < 1000sam numer jest zawsze jednym z najkrótszych sposobów, jeśli nie jedynym.

W przeciwnym razie dzieli ją przez 1000, dopóki jej podział nie sprawi, że nie będzie miała znaczących cyfr powyżej 1, i wybierze sufiks na podstawie liczby podziałów.

Artyer
źródło
Ostatni przypadek powinien wynosić 999,5 mln, a może nie, niepewny w oparciu o luźną specyfikację.
Magic Octopus Urn
Pamiętaj, że musisz wesprzeć nawet bilion.
GarethPW
@GarethPW Nie ma możliwości reprezentowania liczb powyżej 999,499,999,999 zgodnie ze specyfikacją (nr T -> trillionw kluczu), więc założyłem, że to był górny limit. Zapytam, ale w przeciwnym razie jest to utrata jednego bajtu.
Artyer,
1

Python 3 , 127 bajtów

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

Wypróbuj online!

GarethPW
źródło
trochę krótszy:def f(n):l=len(str(n))-4;return[n,f"{round(n,~l):,}"[:4].replace(*",.").rstrip('.')+"KMBT"[-~l//3]][n>9999]
wrymug
1
@JathanathanAllan Nic. Mój błąd.
Artyer,
@rosslh Dokonałem tej zmiany, ale nie mogłem jej zachować podczas naprawy błędu 999499 -> 999M.
GarethPW
1

JavaScript (ES7), 74 bajty

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

JavaScript (ES6), 80 bajtów

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

Rick Hitchcock
źródło