Abbreviamo quei numeri! Adesso al contrario?


11

Introduzione:

Come Twitter, Instagram e altri, volevo visualizzare numeri come 1.2Ke 3.8 Minvece di 1,222o 3,823,456.

Ma non è tutto! Come tutti sappiamo, potrebbero esserci alcuni esseri umani che indubbiamente non apprezzeranno queste abbreviazioni e proveranno a invertirle. Quindi, 1.2kdiventerà 1,200e 3.8 Mdiventerà 3,800,000.

L'obiettivo:

  • il tuo compito è scrivere un programma o una funzione che converta un elenco di numeri ( che sono indicati come stringhe ) nelle loro coppie abbreviate e viceversa.

Ad esempio, se l'elenco di input (o qualsiasi STDIN) era ['1.4k', '1,234,567', '7.99M'], quindi dovresti produrre:

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

Puoi seguire lo schema seguente per le abbreviazioni:

  • 10 3 -> un chilo -> K
  • 10 6 -> un milione -> M
  • 10 9 -> un miliardo -> B

Il codice può assumere tutte le lettere minuscole, tutte maiuscole, maiuscole o minuscole per l'input e utilizzare una di queste per l'output, ma dovrebbe essere coerente.

Regole e restrizioni:

  • è possibile scrivere un programma o una funzione, prendendo l'input tramite STDIN(o l'alternativa più vicina), l'argomento della riga di comando o l'argomento della funzione e producendo il risultato tramite STDOUT(o l'alternativa più vicina), il valore di ritorno della funzione o il parametro della funzione (out).
  • l'input può essere in qualsiasi elenco o formato stringa conveniente. Si può presumere che siano inferiori a ciascuno e che l'elenco contenga almeno un elemento.ai231
  • ogni numero abbreviato conterrà solo uno . mentre un numero normale conterrà tutti i numeri , necessari (si può presumere che questi numeri non vengano modificati).
  • si NON POTREBBE inserire un numero come '123456', ma piuttosto123,456
  • si applicano le regole standard del .

Casi test:

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

chiarimenti:

  • per i numeri <1000 dopo il punto decimale nell'output delle abbreviazioni dovresti avere tutte le cifre necessarie per ottenere il risultato corretto. (es .: 2-> diventerà 0.002k) - ciò significa al massimo 3 decimali ; per numeri> 1000 puoi avere un massimo di 1 decimale .
  • l'abbreviazione può essere sia in minuscolo che maiuscolo
  • Ho rimosso la restrizione integrata come suggerito nei commenti

Vince il codice più breve in byte!


1
Richieste di chiarimento: quante cifre dopo la virgola nell'output dell'abbreviazione? come abbreviare i numeri <1000? maiuscolo o minuscolo o entrambi in input e output?
edc65,

1
Non dovrebbe '123,456,789' -> '123.4M'? Inoltre, questo non chiarisce quanti decimali usare. Sicuramente nulla sotto i 1000 non dovrebbe essere abbreviato comunque.
Kade,

1
@ anonymous2 leggi la terza regola.
Grajdeanu Alex.

4
"Non ti è permesso usare nessun modulo / funzione incorporato" Qualche funzione integrata?
Alex Howansky,

1
L'uso di "chilo" suggerisce i prefissi SI e quelli sarebbero ["k", "M", "G"]. Cosa significa "mentre un numero normale conterrà tanti, se necessario ", nel mio paese sarebbe un errore usarne uno.
Angs,

Risposte:


2

PHP, 234 224 213 201 205 byte

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 byte salvati da insertusernamehere, 4 byte ispirati da quello.


  • accetta input dagli argomenti della riga di comando, stampa i risultati separati da spazio con un separatore finale
  • si aspetta l'abbreviazione minuscola
  • Corri con -r

-2 byte se il carattere di sottolineatura come separatore è corretto: sostituire " "con _.
-1 byte se l'arrotondamento corretto è corretto: sostituire ($y*10|0)/10con round($y,1).
-17 byte per PHP 7.1: sostituire substr($x,strlen($x)-1)con $x[-1].


80 (63) byte per espandere un solo argomento:

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

salva su file, quindi esegui (o sostituisci <?=con echo+ spazio ed esegui con -r.


Il tuo secondo esempio non viene compilato.
Alex Howansky,

1
Hai genitori sbilanciati.
Alex Howansky,

1
-4 byte: for($j=1;$x=$argv[$j++];) - invece diforeach($argv as$i=>$x)if($i)
insertusernamehere

1
-2 byte: kmb[$i] - invece di "kmb"[$i].
insertusernamehere

1
@inserireusernamehere Gli indici di stringa negativi stanno arrivando in PHP 7.1; e quello è un RC (ancora). Grazie per gli altri byte!
Tito

2

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

Grazie a @ETHproductions per il risparmio di 180 byte!

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

Per chiamare la funzione:

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

Output come alert, dove ognuno alertcontiene un diverso elemento dell'input

Versione leggibile:

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

Riepilogo delle modifiche: funzione convertita in una funzione freccia

  • punto e virgola rimossi ";"
  • rimosso var
  • convertito in una funzione freccia
  • mappa utilizzata per scorrere i singoli elementi dell'array
  • usato al |0posto del pavimento
  • usato regex per i test
  • usato operatori ternari invece di istruzioni if-else
  • inclusa una funzione separata per .reverse().join''

3
Ecco alcuni dei modi per giocare a golf. Sentiti libero di porre qualsiasi domanda tu possa avere :-)
ETHproductions
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.