それらの数字を短縮しましょう!今逆ですか?


11

前書き:

同様に、TwitterやInstagramのと他の人が、私は次のように番号を表示したい1.2Kと3.8 Mの代わりに、1,222または3,823,456。

しかし、それだけではありません!誰もが知っているように、これらの略語を間違いなく嫌い、逆にしようとする人間がいる可能性があります。だから、1.2kとなります1,200と3.8 Mなります3,800,000。

タスク:

  • あなたの仕事は、数字のリスト(文字列として与えられる)を短縮ペアに、またはその逆に変換するプログラムまたは関数を書くことです。

たとえば、入力リスト(またはany STDIN)がの['1.4k', '1,234,567', '7.99M']場合、出力する必要があります:

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

略語については、次のスキーマに従うことができます。

  • 10 3- > 1キロ-> K
  • 10 6- > 100万-> M
  • 10 9- > 10 億-> B

コードでは、入力にすべて小文字、すべて大文字、大文字小文字の混在、または未定義の大文字小文字を想定し、これらのいずれかを出力に使用できますが、一貫性が必要です。

規則と制限:

  • STDIN(または最も近い代替)、コマンドライン引数または関数引数を介して入力を取得し、STDOUT(または最も近い代替)、関数の戻り値または関数(出力)パラメーターを介して結果を出力するプログラムまたは関数を作成できます。
  • 入力は、任意の便利なリスト形式または文字列形式です。がそれぞれよりも小さく、リストに少なくとも1つの要素が含まれていると仮定できます。ai231
  • 各省略番号には1つしか 含まれません.が、通常の番号には必要な数だけが含まれ ます(この番号は変更されないと想定できます)。,
  • として番号を入力することはできませんが、'123456'むしろ123,456
  • 標準の規則が適用されます。

テストケース:

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

明確化:

  • 略語の出力で小数点以下の数字が1000未満の場合、正しい結果を得るために必要な桁数が必要です。(例:2->はになります0.002k)- これは、最大で3桁の10進数を意味します。1000を超える数値の場合、最大1桁の小数を使用できます。
  • 略語は小文字でも大文字でもかまいません
  • コメントで提案されている組み込みの制限を削除しました

バイト単位の最短コードが勝ちです!


1
明確化の要求:略語出力の小数点以下の桁数は?1000未満の数字を短縮する方法は?大文字と小文字、または入力と出力の両方?
— edc65

1
すべきではない'123,456,789' -> '123.4M'?また、これは使用する小数の数を明確にしません。確かに、1000未満のものはとにかく短縮する必要はありません。
— ケード

1
@ anonymous2は3番目のルールを読み取ります。
— グレイデアヌアレックス。

4
「あなたは、任意の組み込みのモジュール/機能を使用することを許可されていない」どれが内蔵された機能?
— アレックスハワンスキー

1
「kilo」の使用は、SIプレフィックスを提案し、それらはになります["k", "M", "G"]。「通常の番号には必要なだけ含まれる」とはどういう意味ですか、私の国ではanyを使用するのは間違いです。
— アンズ

回答:


2

PHP、234の 224 213 201 205バイト

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]," ";}

insertusernamehereによって6バイトが節約され、4バイトがそれに触発されました。


  • コマンドライン引数から入力を取り、スペースで区切られた結果を末尾のセパレータで出力します
  • 小文字の略語が必要です
  • と走る -r

セパレータとして下線がOKであれば-2バイト:交換" "と_。
正しい丸めがOKであれば-1バイト:交換してください($y*10|0)/10とround($y,1)。
PHP 7.1のために-17バイト:交換してくださいsubstr($x,strlen($x)-1)と$x[-1]。


1つの引数のみを展開する場合は80(63)バイト:

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

実行し、ファイルに保存(または交換<?=をechoして+スペースと実行-r。


2番目の例はコンパイルされません。
— アレックスハワンスキー

1
不均衡な括弧があります。
— アレックスハワンスキー

1
-4バイト: for($j=1;$x=$argv[$j++];) –ではなくforeach($argv as$i=>$x)if($i)
— insertusernamehere

1
-2バイト: kmb[$i] –の代わりに"kmb"[$i]。
— ユーザー名をここに挿入します

1
@insertusernamehere負の文字列インデックスはPHP 7.1で導入されています。そして、それはRC(まだ)です。他のバイトをありがとう!
— タイタス

2

JavaScriptを、545 524 522 518 514 508 504 498 494 214バイト

180バイトを節約してくれた@ETHproductionsに感謝します!

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

関数を呼び出すには:

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

として出力しますalert。それぞれalertには、入力の異なる要素が含まれます。

読み取り可能なバージョン:

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

編集の概要:関数を矢印関数に変換

  • セミコロン「;」を削除
  • 削除された var
  • 矢印関数に変換
  • mapを使用して、配列の個々の要素を反復処理します
  • |0床の代わりに使用
  • テストに正規表現を使用
  • if-elseステートメントの代わりに三項演算子を使用しました
  • 個別の機能が含まれています .reverse().join''

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.