Abrégons ces chiffres! Maintenant inversé?

11

Introduction:

Comme Twitter et Instagram et d'autres, je voulais afficher des nombres comme 1.2Ket 3.8 Mau lieu de 1,222ou 3,823,456.

Mais ce n'est pas tout! Comme nous le savons tous, il pourrait y avoir des êtres humains qui sans aucun doute n'aimeront pas ces abréviations et essaieront de les inverser. Alors, 1.2kdeviendra 1,200et 3.8 Mdeviendra 3,800,000.

La tâche:

  • votre tâche consiste à écrire un programme ou une fonction qui convertit une liste de nombres ( qui sont donnés sous forme de chaînes ) en leurs paires abrégées et vice-versa.

Par exemple, si la liste d'entrées (ou n'importe quelle autre STDIN) l'était ['1.4k', '1,234,567', '7.99M'], alors vous devriez sortir:

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

Vous pouvez suivre le schéma suivant pour les abréviations:

  • 10 3 -> un kilo -> K
  • 10 6 -> un million -> M
  • 10 9 -> un milliard -> B

Votre code peut prendre en minuscules, en majuscules, en majuscules ou en minuscules pour l'entrée et utiliser n'importe lequel de ces éléments pour la sortie, mais il doit être cohérent.

Règles et restrictions:

  • vous pouvez écrire un programme ou une fonction, en prenant l'entrée via STDIN(ou l'alternative la plus proche), l'argument de ligne de commande ou l'argument de la fonction et en sortant le résultat via STDOUT(ou l'alternative la plus proche), la valeur de retour de la fonction ou le paramètre de la fonction (out).
  • l'entrée peut être dans n'importe quel format de liste ou de chaîne. Vous pouvez supposer que le sont inférieurs à chacun et que la liste contient au moins un élément.ai231
  • chaque numéro abrégé n'en contiendra qu'un seul . tandis qu'un numéro normal en contiendra autant , que nécessaire (vous pouvez supposer que ce nombre ne sera pas modifié).
  • vous NE POUVEZ PAS entrer un nombre '123456'mais plutôt123,456
  • les règles de standard s'appliquent.

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

Clarifications:

  • pour les nombres <1000 après la virgule décimale dans la sortie des abréviations, vous devez avoir autant de chiffres que nécessaire pour obtenir le résultat correct. (par exemple: 2-> deviendra 0.002k) - cela signifie 3 décimales au maximum ; pour les nombres> 1000, vous pouvez avoir au maximum 1 décimale .
  • l'abréviation peut être en minuscule ou en majuscule
  • J'ai supprimé la restriction intégrée comme suggéré dans les commentaires

Le code le plus court en octets gagne!

Grajdeanu Alex.
la source
1
Demandes de clarification: combien de chiffres après la virgule décimale dans la sortie de l'abréviation? comment abréger des nombres <1000? majuscule ou minuscule ou les deux en entrée et en sortie?
edc65
1
Non '123,456,789' -> '123.4M'? De plus, cela ne précise pas le nombre de décimales à utiliser. De toute façon, tout ce qui est inférieur à 1000 ne devrait pas être abrégé.
Kade
1
@ anonymous2 a lu la troisième règle.
Alex Grajdeanu.
4
"vous n'êtes pas autorisé à utiliser un module / fonction intégré" Une fonction intégrée?
Alex Howansky
1
Votre utilisation de "kilo" suggère des préfixes SI et ceux-ci le seraient ["k", "M", "G"]. Que signifie "alors qu'un nombre normal en contiendra autant que nécessaire ", dans mon pays, ce serait une erreur d'en utiliser.
Angs

Réponses:

2

PHP, 234 224 213 201 205 octets

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 octets enregistrés par insertusername ici, 4 octets inspirés par cela.


  • prend l'entrée des arguments de la ligne de commande, affiche les résultats séparés par des espaces avec un séparateur de fin
  • attend une abréviation en minuscules
  • courir avec -r

-2 octets si le trait de soulignement comme séparateur est correct: remplacer " "par _.
-1 octet si l'arrondi correct est correct: remplacer ($y*10|0)/10par round($y,1).
-17 octets pour PHP 7.1: remplacer substr($x,strlen($x)-1)par $x[-1].


80 (63) octets pour développer un seul argument:

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

enregistrer dans un fichier, puis exécuter (ou remplacer <?=par echo+ espace et exécuter avec -r.

Titus
la source
Votre deuxième exemple ne se compile pas.
Alex Howansky
1
Vous avez des parens déséquilibrées.
Alex Howansky
1
-4 octets: for($j=1;$x=$argv[$j++];) - au lieu deforeach($argv as$i=>$x)if($i)
insertusernamehere
1
-2 octets: kmb[$i] - au lieu de "kmb"[$i].
insertusernamehere
1
@insertusernamehere Les index de chaîne négatifs arrivent en PHP 7.1; et c'est un RC (encore). Merci pour les autres octets!
Titus
2

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

Merci à @ETHproductions pour avoir économisé 180 octets!

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

Pour appeler la fonction:

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

Sorties comme alert, où chacune alertcontient un élément différent de l'entrée

Version lisible:

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

Résumé des modifications: fonction convertie en fonction flèche

  • suppression des points-virgules »;»
  • supprimé var
  • converti en fonction de flèche
  • carte utilisée pour parcourir les éléments individuels du tableau
  • utilisé |0au lieu du plancher
  • expression régulière utilisée pour les tests
  • utilisé des opérateurs ternaires au lieu d'instructions if-else
  • inclus une fonction distincte pour .reverse().join''
user41805
la source
3
Voici quelques façons de jouer au golf. N'hésitez pas à poser toutes vos questions :-)
ETHproductions