人間は足を嫌い、プログラマーは人間を嫌います-それらを接続しましょう!


8

バックグラウンド

タスクは単純ですが、すべてのプログラマーが少なくとも1回は実装しています。Stackoverflowには多くのサンプルがありますが、それらは勝つために十分短いですか?

問題の物語

あなたはユーザーのためにファイルサイズ入力を実装するタスクを与えられた不機嫌なプログラマーです。ユーザーはバイトを使用しないため、誰もが「1M」、「1K」、「3G」、「3.14M」と入力するだけですが、バイトが必要です。したがって、変換を行うプログラムを記述します。

次に、上司があなたに数十のユーザーレポートを渡して、ファイルサイズの入力に奇妙な多数が含まれているという苦情を受け取りました。逆変換もコーディングする必要があるようです。

あなたは何する必要があるの?

ここに秘訣があります。単一のコードで双方向変換を実装する必要があります。必要に応じて使用される2つの別個の関数?いや、それは単純すぎる-短いものを作ろう!

この課題では、「キロバイト」は1024バイト、「メガバイト」は1024 * 1024 = 1048576バイト、「ギガバイト」は1024 * 1024 * 1024 = 1073741824バイトを意味します。

テストデータ

Input   -> Output  
5       -> 5  
1023    -> 1023  
1024    -> 1K  
1K      -> 1024  
1.5K    -> 1536  
1536    -> 1.5K  
1048576 -> 1M  
1M      -> 1048576  

ルール

  • テスト値は2 * 1024 * 1024 * 1024または2Gを超えない
  • 次の接尾辞がユーザーによって使用されます:Kはキロバイト、Mはメガバイト、Gはギガバイト
  • 負の数を処理するためにコードは必要ありません
  • (例えば任意の外部ライブラリを使用しないでくださいBCMath同梱のもの以外にもPHPで)(例えばmath.h)
  • 標準の抜け穴は許可されていません
  • コードはstderrで何も生成すべきではありません
  • プログラムは、標準的な方法を使用して入力を取得し、出力を生成できます

1
通常、プログラムは変数の入出力を受け付けません...
— TheDoctor

7
1024はキロバイト(k)ではありません。それはキビバイト(KiB)です。同様に、1048576はメガバイト(M)ではありません。それはメビバイト(MiB)です。
— トッドリーマン、

5
おそらく実際の生活には役に立たないかもしれませんが、この課題は明確にされており、簡単な作業ではありません。言葉遣いをもう少し磨く必要があると私は思う。参考までに、@ kiler129、今後の課題については、最初にサンドボックスに投稿することで、これらすべてのよじれを事前に解決することができます。
— DLosc


4
10進数はいくつ必要ですか。1024 = 1k、1025 = 1.0 kまたは1k?1526398 = 1.45568656921 M ....
— 明るい

回答:


4

Python 2、204 190バイト

これは私の初めてのコードゴルフです。

s=raw_input()
p=' KMG'
if s[-1]<='9':
 e=0;r=int(s)
 while r>=1024:r/=1024.0;e+=1
else:
 e=p.index(s[-1]);r=eval(s[:-1])
 while e>0:r*=1024;e-=1
print(`r`if r%1!=0 else`int(r)`)+p[e].strip()

1

ピップ、60バイト

l:" KMG"Fi1,4Ia>=Y1024x:(a/:y).l@ix|aR`.+([KMG])`_*y**(l@?B)

コマンドラインから入力を受け取り(a変数に割り当て)、標準出力に出力します。

非ゴルフバージョン:

l : " KMG"
Y 1024
F i 1,4
 I a>=y {
  a /: y
  x : a . l@i
 }
x | a R `.+([KMG])` {a*y**(l@?b)}

アルゴリズム:

  • 以下のためのi1から3まで:
    • の場合a >= 1024、これはより大きな単位に変換する必要があるバイト値です。
      • a1024で除算
      • 現在の単位xとa連結された現在の値に設定されます
  • x前のステップで設定されている場合は、それを出力します。それ以外の場合は、a1024未満でした(可能な単位サフィックスを使用)。
    • 最後にaいずれかがある場合は、関数をオンにして正規表現の置換を行います。KMG文字を適切な1024の累乗に変換し、その数に結果を掛けます。
    • サフィックスのない1024未満の値の場合、これにより値は変更されません。

1

JavaScript、144 106バイト

n=>((G=(M=(K=2<<9)<<10)<<10),+n>0?n<K?n:n<M?n/K+'K':n<G?n/M+'M':n/G+'G':eval(n.replace(/[KMG]/,m=>'*'+m)))

これは間違いなく短くすることができ、後で行います。そこに醜いものを出したかっただけです;)


0

Python2 199バイト

これはばかげていますが、数十ギガバイトのRAMを持っている限り、(10進精度の質問を無視して)機能します。それ以外の場合は実行しないでください。マシンがフリーズしてロックアップする可能性があります。まず最初に、2ギガバイトの整数配列を割り当てます。

n,bn={'K':2**10,'M':2**20,'G':2**30},range(2**30+1)
for i in bn:
 for j in 'KMG':
  if i>=n[j]: bn[i]=str(float(i/n[j]))+j 
def f(i):
 if i[-1] in 'KMG': return n[i[-1]]*float(i[:-1])
 return bn[int(i)]

0

C 206 183バイト

できる限り取り除く。

#include<stdlib.h>
main(y,z)char**z;{char*i="KMG";float f=atof(*++z);while(*++*z)y=**z;if(y>57){do f*=1024;while(y!=*i++);y=0;}else while(f>1023)y=*i++,f/=1024;printf("%.1lf%c",f,y);}

出力

Input: 1023
Output: 1023.0

Input: 1M
Output: 1048576.0

Input: 1048576
Output: 1.0M

説明

#include <stdlib.h> //needed for atof()
main(y,z)char **z; //y will hold the size indicator
{
    char *i="KMG";//holds the characters for the size indicators
    float f=atof(*++z); //get the number from the string

    while(*++*z) //loops through the string
        y=**z;
    if(y>57) //57 is ASCII for 9
    {
        do f*=1024;
        while(y!=*i++); //loop through until we hit the correct size
        y=0;
    }
    else
        while(f>1023) //loop through until number is less than 1024
            y=*i++,f/=1024; 
    printf("%.1lf%c",f,y); //print number and size character 
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.