Lassen Sie uns diese Zahlen abkürzen! Jetzt umgekehrt?

11

Einführung:

Wie Twitter und Instagram und andere wollte ich Zahlen wie 1.2Kund 3.8 Manstelle von 1,222oder anzeigen 3,823,456.

Aber das ist nicht alles! Wie wir alle wissen, könnte es einige Menschen geben, die diese Abkürzungen zweifellos nicht mögen und versuchen werden, sie umzukehren. Also 1.2kwird 1,200und 3.8 Mwird 3,800,000.

Die Aufgabe:

  • Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die eine Liste von Zahlen ( die als Zeichenfolgen angegeben werden ) in ihre Abkürzungspaare konvertiert und umgekehrt.

Wenn beispielsweise die Eingabeliste (oder eine beliebige STDIN) vorhanden war ['1.4k', '1,234,567', '7.99M'], sollten Sie Folgendes ausgeben:

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

Sie können dem nächsten Schema für Abkürzungen folgen:

  • 10 3 -> ein Kilo -> K.
  • 10 6 -> eine Million -> M.
  • 10 9 -> eine Milliarde -> B.

Ihr Code kann für die Eingabe nur Kleinbuchstaben, Großbuchstaben, Misch- oder undefinierte Groß- und Kleinschreibung annehmen und diese für die Ausgabe verwenden, sollte jedoch konsistent sein.

Regeln und Einschränkungen:

  • Sie können ein Programm oder eine Funktion schreiben, indem Sie Eingaben über STDIN(oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument vornehmen und das Ergebnis über STDOUT(oder die nächstgelegene Alternative), den Funktionsrückgabewert oder den Funktionsparameter (out) ausgeben .
  • Die Eingabe kann in einem beliebigen Listen- oder Zeichenfolgenformat erfolgen. Sie können davon ausgehen, dass die Werte kleiner als die einzelnen sind und dass die Liste mindestens ein Element enthält.ai231
  • Jede abgekürzte Nummer enthält nur eine, . während eine normale Nummer so viele , wie nötig enthält (Sie können davon ausgehen, dass diese Nummern nicht geändert werden).
  • Sie dürfen keine Nummer als eingeben '123456', sondern123,456
  • Es gelten die Standardregeln für .

Testfälle:

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

Erläuterungen:

  • Für Zahlen <1000 nach dem Dezimalpunkt in der Abkürzungsausgabe sollten Sie so viele Ziffern wie erforderlich haben, um das richtige Ergebnis zu erhalten. (zB: 2-> wird 0.002k) - das bedeutet höchstens 3 Dezimalstellen ; Für Zahlen> 1000 können Sie maximal 1 Dezimalstelle verwenden .
  • Die Abkürzung kann sowohl in Klein- als auch in Großbuchstaben angegeben werden
  • Ich habe die eingebaute Einschränkung entfernt, wie in den Kommentaren vorgeschlagen

Der kürzeste Code in Bytes gewinnt!

Grajdeanu Alex.
quelle
1
Bitte um Klarstellung: Wie viele Stellen nach dem Dezimalpunkt in der Abkürzungsausgabe? wie man Zahlen <1000 abkürzt? Groß- oder Kleinbuchstaben oder beides in Eingabe und Ausgabe?
edc65
1
Sollte nicht '123,456,789' -> '123.4M'? Dies verdeutlicht auch nicht, wie viele Dezimalstellen verwendet werden sollen. Sicherlich sollte alles unter 1000 sowieso nicht abgekürzt werden müssen.
Kade
1
@ anonym2 lies die dritte Regel.
Grajdeanu Alex.
4
"Sie dürfen kein eingebautes Modul / keine eingebaute Funktion verwenden" Eine eingebaute Funktion?
Alex Howansky
1
Ihre Verwendung von "Kilo" schlägt SI-Präfixe vor, und diese wären ["k", "M", "G"]. Was bedeutet "während eine normale Zahl so viele wie nötig enthält ", dass es in meinem Land ein Fehler wäre, eine zu verwenden.
Angs

Antworten:

2

PHP, 234 224 213 201 205 Bytes

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 Bytes, die von insertusernamehere gespeichert wurden, 4 Bytes, die davon inspiriert wurden.


  • Nimmt Eingaben von Befehlszeilenargumenten entgegen und druckt die Ergebnisse mit einem nachgestellten Trennzeichen durch Leerzeichen
  • erwartet Abkürzung in Kleinbuchstaben
  • laufen mit -r

-2 Bytes, wenn der Unterstrich als Trennzeichen in Ordnung ist: Ersetzen " "durch _.
-1 Byte, wenn die korrekte Rundung in Ordnung ist: Ersetzen ($y*10|0)/10durch round($y,1).
-17 Bytes für PHP 7.1: Ersetzen substr($x,strlen($x)-1)durch $x[-1].


80 (63) Bytes zum Erweitern nur eines Arguments:

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

Datei speichern, dann auszuführen (oder ersetzen <?=mit echo+ Raum und läuft mit -r.

Titus
quelle
Ihr zweites Beispiel wird nicht kompiliert.
Alex Howansky
1
Sie haben unausgeglichene Eltern.
Alex Howansky
1
-4 Bytes: for($j=1;$x=$argv[$j++];) - anstelle vonforeach($argv as$i=>$x)if($i)
insertusernamehere
1
-2 Bytes: kmb[$i] - statt "kmb"[$i].
Fügen Sie den Benutzernamen hier
1
@insertusernamehere Negative String-Indizes kommen in PHP 7.1; und das ist RC (noch). Danke für die anderen Bytes!
Titus
2

JavaScript, 545 524 522 518 514 508 504 498 494 214 Bytes

Vielen Dank an @ETHproductions für die Einsparung von 180 Bytes!

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``)

So rufen Sie die Funktion auf:

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

Ausgaben als alert, wobei jede alertein anderes Element der Eingabe enthält

Lesbare Version:

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 ``)

Zusammenfassung der Änderungen: Konvertierte Funktion in eine Pfeilfunktion

  • Semikolons entfernt ';'
  • entfernt var
  • in eine Pfeilfunktion umgewandelt
  • verwendete Map, um die einzelnen Elemente des Arrays zu durchlaufen
  • verwendet |0anstelle von Boden
  • Regex zum Testen verwendet
  • verwendete ternäre Operatoren anstelle von if-else-Anweisungen
  • enthielt eine separate Funktion für .reverse().join''
user41805
quelle
3
Hier sind einige Möglichkeiten, wie Sie Golf spielen können. Fühlen Sie sich frei, Fragen zu stellen, die Sie haben könnten :-)
ETHproductions