Skróćmy te liczby! Teraz odwrócić?

11

Wprowadzenie:

Podobnie jak Twitter, Instagram i inne, chciałem wyświetlać liczby takie jak 1.2Ki 3.8 Mzamiast 1,222lub 3,823,456.

Ale to nie wszystko! Jak wszyscy wiemy, mogą istnieć istoty ludzkie, które bez wątpienia nie polubią tych skrótów i będą próbowały je odwrócić. Tak 1.2księ stanie 1,200i 3.8 Mstanie się 3,800,000.

Zadanie:

  • Twoim zadaniem jest napisanie programu lub funkcji, która konwertuje listę liczb ( które są podane jako ciągi znaków ) na ich pary skrótowe i odwrotnie.

Na przykład, jeśli lista wejściowa (lub dowolna STDIN) była ['1.4k', '1,234,567', '7.99M'], to powinieneś wypisać:

['1,400', '1.2M', '7,990,000']

Możesz zastosować następny schemat dla skrótów:

  • 10 3 -> jeden kilogram -> K.
  • 10 6 -> jeden milion -> M
  • 10 9 -> miliard -> B

Twój kod może przyjmować wszystkie małe i wielkie litery, mieszane lub nieokreślone litery i używać dowolnego z nich do wyświetlania, ale powinien być spójny.

Zasady i ograniczenia:

  • możesz napisać program lub funkcję, przyjmując dane wejściowe za pomocą STDIN(lub najbliższej alternatywy), argumentu wiersza polecenia lub argumentu funkcji i wypisując wynik za pomocą STDOUT(lub najbliższej alternatywy), wartości zwracanej funkcji lub parametru funkcji ( wyjściowej ).
  • dane wejściowe mogą być w dowolnym dogodnym formacie listy lub ciągu. Możesz założyć, że są one mniejsze niż każdy i że lista zawiera co najmniej jeden element.ai231
  • każda skrócona liczba będzie zawierać tylko jeden, . podczas gdy normalna liczba będzie zawierać tyle, , ile to konieczne (możesz założyć, że te liczby nie zostaną zmienione).
  • ty NIE MOŻE wprowadzić numer jako '123456'raczej123,456
  • obowiązują standardowe zasady .

Przypadki testowe:

Input: ['1.5M', '77.6k', '123,456,789']         Output: ['1,500,000', '77,600', '123.4M']
Input: ['3,000,000,000', '581k', '2b']          Output: ['3B', '581,000', '2,000,000,000']
Input: ['0.1k']                                 Output: ['100']
Input: ['888', '33']                            Output: ['0.888k', '0.033k']

Wyjaśnienia:

  • dla liczb <1000 po kropce dziesiętnej na wyjściu skrótu powinieneś mieć tyle cyfr, ile jest to wymagane, aby uzyskać poprawny wynik. (np .: 2-> stanie się 0.002k) - oznacza to co najwyżej 3 miejsca po przecinku ; dla liczb> 1000 możesz mieć maksymalnie 1 miejsce po przecinku .
  • skrót może być pisany zarówno małymi, jak i dużymi literami
  • Usunąłem ograniczenie wbudowane zgodnie z sugestiami w komentarzach

Najkrótszy kod w bajtach wygrywa!

Grajdeanu Alex.
źródło
1
Prośby o wyjaśnienie: ile cyfr po przecinku generuje skrót? jak skracać liczby <1000? wielkie czy małe litery czy oba na wejściu i wyjściu?
edc65,
1
Nie powinienem '123,456,789' -> '123.4M'? Nie wyjaśnia to również, ile liczb dziesiętnych należy zastosować. Z pewnością coś poniżej 1000 nie powinno i tak być skracane.
Kade
1
@ anonimowy2 przeczytaj trzecią zasadę.
Grajdeanu Alex.
4
„nie wolno używać żadnego wbudowanego modułu / funkcji” Jakaś wbudowana funkcja?
Alex Howansky
1
Twoje użycie „kilograma” sugeruje prefiksy SI i takie byłyby ["k", "M", "G"]. Co oznacza, że ​​„chociaż normalna liczba będzie zawierać tyle, ile to konieczne ”, w moim kraju użycie jakiegokolwiek błędu byłoby błędem.
Angs,

Odpowiedzi:

2

PHP, 234 224 213 201 205 bajtów

for(;$x=$argv[++$n];){$y=str_replace(",","",$x)/1e3;for($i=0;$y>999;$i++)$y=($y|0)/1e3;echo(A<$c=substr($x,strlen($x)-1))?number_format($x*[k=>1e3,m=>1e6,b=>1e9][$c]):($i?($y*10|0)/10:$y).kmb[$i]," ";}

6 bajtów zapisanych przez inserttusernamehere, 4 bajty zainspirowane tym.


  • pobiera dane wejściowe z argumentów wiersza poleceń, wyświetla wyniki rozdzielone spacjami za pomocą separatora końcowego
  • oczekuje skrótu małych liter
  • Biegnij z -r

-2 bajtów jeśli podkreślenia jako separator jest w porządku: Zastąpienie " "w _.
-1 bajt, jeśli były zaokrąglania ok Wymienić ($y*10|0)/10z round($y,1).
-17 bajtów PHP 7,1: Zastąpienie substr($x,strlen($x)-1)w $x[-1].


80 (63) bajtów dla rozwinięcia tylko jednego argumentu:

<?=number_format(($x=$argv[1])*[K=>1e3,M=>1e6,B=>1e9][substr($x,strlen($x)-1)]);

zapisać do pliku, a następnie wykonać (lub wymienić <?=z echo+ spacja i biegać z -r.

Tytus
źródło
Twój drugi przykład się nie kompiluje.
Alex Howansky
1
Masz niezrównoważone pareny.
Alex Howansky
1
-4 bajty: for($j=1;$x=$argv[$j++];) - zamiastforeach($argv as$i=>$x)if($i)
inserttusernamehere
1
-2 bajty: kmb[$i] - zamiast "kmb"[$i].
inserttusernamehere
1
@insertusernamehere W PHP 7.1 pojawiają się ujemne indeksy łańcuchowe; i to jest RC (jeszcze). Dzięki za inne bajty!
Tytus
2

JavaScript, 545 524 522 518 514 508 504 498 494 214 bajtów

Dzięki @ETHproductions za oszczędność 180 bajtów!

d=F=>F.map(f=>1/f.slice(-1)?f=(f=f.replace(/,/g,""))[9]?(f/1e8|0)/10+"B":f[6]?(f/1e5|0)/10+"M":f/1e3+"k":R(R(f.slice(0,-1)+"e"+' kMB'.indexOf(f.substr(-1))*3-0+"").match(/.{1,3}/g)+""),R=x=>[...x].reverse().join``)

Aby wywołać funkcję:

d(["1.5M","1,500,000"]) //["1,500,500","1.5M"]

Wyprowadza jako alert, gdzie każdy alertzawiera inny element danych wejściowych

Wersja do odczytu:

d = F => F.map(f => 1 / f.slice(-1) ? f = (f = f.replace(/,/g, ""))[9] ? (f / 1e8 | 0) / 10 + "B" : f[6] ? (f / 1e5 | 0) / 10 + "M" : f / 1e3 + "k" : R(R(f.slice(0, -1) + "e" + ' kMB'.indexOf(f.substr(-1)) * 3 - 0 + "").match(/.{1,3}/g) + ""), R = x => [...x].reverse().join ``)

Podsumowanie edycji: funkcja przekonwertowana na funkcję strzałki

  • usunięto średniki ”;”
  • oddalony var
  • przekształcony w funkcję strzałki
  • mapa używana do iteracji poszczególnych elementów tablicy
  • używane |0zamiast podłogi
  • użył wyrażenia regularnego do testowania
  • używano operatorów trójskładnikowych zamiast instrukcji if-else
  • zawiera osobną funkcję dla .reverse().join''
user41805
źródło