मानव पढ़ने योग्य प्रारूप में दिए गए बाइट्स की संख्या को प्रारूपित करें


16

चुनौती और मूल

स्टैक ओवरफ्लो पर एक लोकप्रिय प्रश्न है: बाइट का आकार जावा में मानव पठनीय प्रारूप में कैसे बदला जाए? सबसे अधिक वोट किए गए उत्तर के पास ऐसा करने के लिए एक अच्छा तरीका है, लेकिन यह कोडगोल्फ है और हम बेहतर कर सकते हैं, क्या हम नहीं कर सकते?

आपकी चुनौती एक ऐसी विधि या कार्यक्रम लिखना है जो दिए गए बाइट्स की संख्या को सही मानव पठनीय प्रारूप में शामिल करता है और परिणाम को आपकी भाषा के मानक से प्रिंट करता है। *

* अधिक स्पष्टीकरण के लिए नियम देखें!

इनपुट

इनपुट हमेशा अधिकतम (2 ^ 31) -1 के साथ बाइट्स की एक सकारात्मक संख्या होगी।

उत्पादन

आप चुन सकते हैं यदि आप अंतर्राष्ट्रीय प्रणाली इकाइयों या बाइनरी नोटेशन को आउटपुट के रूप में पसंद करते हैं (एसआई नोटेशन शायद आपको कुछ बाइट्स बचाता है)।

SI:      B, kB,  MB,  GB  
Binary:  B, KiB, MiB, GiB

नोट: प्रतिबंधित इनपुट रेंज के कारण GB या GiB से अधिक इकाइयां पॉसिबल नहीं हैं।

उदाहरण आउटपुट

इकाइयों की अंतर्राष्ट्रीय प्रणाली:

Input       Output
0           0.0     B
999         999.0   B
1000        1.0     kB
1023        1.0     kB
1024        1.0     kB
1601        1.6     kB
160581      160.6   kB
4066888     4.1     MB
634000000   634.0   MB
2147483647  2.1     GB

बाइनरी:

Input       Output
0           0.0     B
999         999.0   B
1000        1000.0  B
1023        1023.0  B
1024        1.0     KiB
1601        1.6     KiB
160581      156.8   KiB
4066888     3.9     MiB
634000000   604.6   MiB
2147483647  2.0     GiB

नियम

  • बाइट स्वरूपण के लिए बिल्ड-फ़ंक्शंस की अनुमति नहीं है!
  • आउटपुट हमेशा एक ही अंकन मानक में होना चाहिए, आप एसआई या बाइनरी मिश्रण नहीं कर सकते हैं;
  • आउटपुट हमेशा सबसे बड़ी इकाई में होना चाहिए जहां परिणामी संख्या अभी भी अधिक या एक के बराबर है;
  • आउटपुट में हमेशा एक दशमलव संख्या होनी चाहिए, लेकिन जब परिणाम आउटपुट बाइट्स (बी) में होता है, तो आप एक पूर्णांक संख्या प्रिंट करना चुन सकते हैं;
  • आप चुन सकते हैं कि क्या आप संख्या और इकाई के बीच एक स्थान, टैब या कुछ भी जोड़ना चाहते हैं;
  • इनपुट STDIN या फ़ंक्शन मापदंडों के माध्यम से प्राप्त होता है;
  • आउटपुट कंसोल पर मुद्रित होता है या स्ट्रिंग (या समान वर्ण कंटेनर) के रूप में वापस आ जाता है;
  • यह कोड गोल्फ है, इसलिए सबसे छोटा उत्तर जीतता है। मज़े करो!

संपादित करें: और भी अधिक स्पष्टीकरण

कुछ नंबरों में 999950 नंबर की तरह दिलचस्प गोल व्यवहार होता है। अधिकांश कोड कार्यान्वयन 1.0 एमबी के बजाय 1000.0 kB वापस आ जाएंगे। क्यों? क्योंकि 999950/1000 का मूल्यांकन 999.950 है जो जावा में String.format (अधिकांश अन्य भाषाओं में भी) का उपयोग करते समय प्रभावी रूप से 1000.0 तक गोल है। इस तरह के मामलों को संभालने के लिए कुछ अतिरिक्त जाँच की आवश्यकता होती है।

इस चुनौती के लिए दोनों शैलियों, 1000.0 केबी और 1.0 एमबी को स्वीकार किया जाता है, हालांकि अंतिम शैली को पसंद किया जाता है।

छद्म कोड / जावा परीक्षण कोड:


public static String bytesToSI(long bytes){
      if (bytes < 1000){
          return bytes + ".0 B";
      }
      //Without this rounding check:
      //999950    would be 1000.0 kB instead of 1.0 MB
      //999950000 would be 1000.0 MB instead of 1.0 GB
      int p = (int) Math.ceil(Math.log(bytes) / Math.log(1000));
      if(bytes/Math.pow(1000, p) < 0.99995){
          p--;
      }
      //Format
      return String.format("%.1f %sB", bytes/Math.pow(1000, p), "kMGTPE".charAt(p-1));
}


1
तकनीकी रूप से, एसआई किलोबाइट का उपयोग करना चाहिए kB(नोट लोअरकेस के)
SuperJedi224

अच्छी बात है, तय!
रॉल्फ R

1
मैं ज्यादा सीमित नहीं करना चाहता, इसलिए मैं कहूंगा कि रिक्ति असंगत हो सकती है। लेकिन इस नियम के साथ: अलग-अलग वैध इनपुट के लिए अंतरिक्ष और टैब वर्णों में अंतर 10. से अधिक नहीं हो सकता है (यह सब "मानव पठनीय" रखने के लिए)
रॉल्फ The

2
के लिए उम्मीद उत्पादन क्या है 999999और 1000000? 160581प्रदर्शन गोलाई, तो यह होना चाहिए 1000.0kBऔर 1.0MB?
Sp3000

3
@ Sp3000 यह एक अच्छा सवाल है, सबसे अच्छा समाधान 1.0 एमबी प्रदर्शित करने के लिए 999999 के लिए होगा। लेकिन इस चुनौती के लिए मैं कहूंगा कि 1000.0 KB और इसी तरह के गोलाई के मामले भी ठीक हैं।
रॉल्फ ツ

जवाबों:


10

टीआई-बेसिक, 44

नौकरी के लिए सही उपकरण होगा यदि TI-BASIC में आधा सभ्य स्ट्रिंग हेरफेर हुआ (मुझे इकाई के साथ इंजीनियरिंग नोटेशन में प्रदर्शित संख्या के घातांक को ओवरराइट करने का सहारा लेना पड़ा)। जैसा कि यह दौर है और सही ढंग से आउटपुट देता है, लेकिन यह जीतने वाली प्रविष्टियों के करीब भी नहीं है। शायद एक अलग कैलकुलेटर भाषा यह एक जीत सकता है?

Fix 1
Eng
ClrHome
Disp Ans
Output(1,15,sub(" kMG",1+iPart(log(Ans+.5)/3),1)+"B

[number]:[program name]होमस्क्रीन पर फॉर्म में इनपुट ।

दिए गए परीक्षण मामलों:

Input       Output (leading spaces intentional; screen clear before each output)
0                      0.0 B
999                  999.0 B
1000                   1.0kB
1023                   1.0kB
1024                   1.0kB
1601                   1.6kB
160581               160.6kB
4066888                4.1MB
634000000            634.0MB
2147483647             2.1GB

मुझे बिलकुल भी अंदाजा नहीं था कि TI-BASIC इतनी बहुमुखी है
बीटा डेके

1
TI-BASIC बहुमुखी नहीं है, लेकिन इसकी कुछ कमियों के लिए अक्सर अजीबोगरीब तरीके होते हैं।
lirtosiast

6

सीजेएम, 35 27 बाइट्स

ri{_e-3_i}g;1mOo]," kMG"='B

8 बाइट्स निकालने के लिए धन्यवाद डेनिस।

यह ऑनलाइन दुभाषिया.0 में प्रिंट नहीं करता है । लेकिन जैसे डेनिस ने बताया है , यह जावा दुभाषिया में ठीक काम करता है।

व्याख्या

ri         e# Read the input as an integer.
{          e# Do:
    _e-3   e#   Make a copy and divide by 1000.
           e#   This will generate one more item in the stack for each iteration.
    _i     e#   Make a copy and truncate to integer.
}g         e# until the integer part is 0.
;          e# Discard the final value with integer part 0.
1mOo       e# Output the number before it with the correct format.
],         e# Count the number of iterations - 1.
" kMG"=    e# Select a character according to the number of iterations.
'B         e# Output B.

ri{_e-3XmO_i}g;o]," kMG"='B(27 बाइट्स)
डेनिस

@ डेनिस के लिए धन्यवाद 1mO। लेकिन यह कोड काम नहीं करता 1149999...
jimmy23013

ri{_e-3_i}g;1mOo]," kMG"='Bऐसा करना चाहिए।
डेनिस

स्क्रैच कि, कि अन्य कीड़े है।
डेनिस

999999बन जाता है 1000kB। प्रश्न को फिर से पढ़ना, मुझे यकीन नहीं है कि 1000kBवास्तव में गलत होगा।
डेनिस

5

पायथ, 29 27 बाइट्स

p@" kMG"Js.lQK^T3.RcQ^KJ1\B

प्रदर्शन। दोहन ​​परीक्षण।

स्पष्टीकरण:

p@" kMG"Js.lQK^T3.RcQ^KJ1\B
                                 Implicit: Q = eval(input())
p                                print, in the order 2nd arg then 1st arg:
             K^T3                K = 10^3 = 1000
          .lQK                   log of Q base K
         s                       Floored
        J                        Store to J
 @" kMG"J                        The Jth character of ' kMG'
                     ^KJ         K^J
                   cQ            Q/K^J (Floating point division)
                 .R     1        Round to 1 decimal place.
                         \B      Print a trailing 'B'.

3

सीजेएम, 28

r_dA@,(3/:X3*#/1mO" kMG"X='B

इसे ऑनलाइन आज़माएं

नोट: यह ऑनलाइन दुभाषिया के साथ ".0" नहीं दिखाता है, लेकिन आधिकारिक जावा दुभाषिया के साथ ऐसा करता है ।

स्पष्टीकरण:

r_          read and duplicate
dA          convert to double and push 10
@           bring the initial string to the top
,(          get the length and decrement
3/          divide by 3 (for thousands)
:X3*        store in X and multiply by 3 again
#           raise 10 to that power
/           divide the original number by it
1mO         round to 1 decimal
" kMG"X=    convert X from 0/1/2/3 to space/k/M/G
'B          add a 'B'

के लिए backtick क्या है?
डेनिस

@ डेनिस ऑनलाइन इंटरप्रेटर में .0 दिखा रहा है
एडिट्स ने छोड़ दिया क्योंकि एसई ईवीआईएल

यह backtick के बिना जावा दुभाषिया में ठीक काम करता है, इसलिए मुझे नहीं लगता कि आपको इसकी आवश्यकता है।
डेनिस

3

पायथन 2 - 76 बाइट्स

इंटर्नेशन सिस्टम ऑफ यूनिट्स का उपयोग करता है, सिर्फ इसलिए कि यह आपके सिर में करना आसान है;)

n=input();m=0;f=1e3
while n>=f:n/=f;m+=2
print"%.1f%s"%(n,'B kBMBGB'[m:m+2])

यह मेरे लिए ठीक नहीं लगता है, यह पूछे जाने वाले प्रारूपण का सम्मान नहीं करता है, अगर मैं "2147483647" सबमिट करता हूं तो मुझे छूट मिल जाएगी। "
डायटनर

1
इसके अलावा, इस के अनुसार 79 बाइट्स है इसयह 75 बाइट्स है। मुझे विश्वास नहीं है कि यह निर्दिष्ट किया गया था कि संख्या और इकाई के बीच एक स्थान होना चाहिए।
केड

आप f=1e3
mbomb007

@ mbomb007 वास्तव में इसने 2 बाइट्स बचाए क्योंकि 1e3 एक फ्लोट है
बीटा

मुझे पता था कि यह एक फ्लोट था। मुझे लगता है कि मैं अभी गिनती नहीं कर सकता ...
mbomb007

2

PowerShell, 190

$x=Read-Host
function f($a,$b){"$x`t"+[math]::Round($x/$a,1).ToString("F1")+"`t$b"}
if(1KB-gt$x){f 1 "B"}elseif(1MB-gt$x){f 1KB KiB}
elseif(1GB-gt$x){f 1MB MiB}elseif(1TB-gt$x){f 1GB GiB}

प्रयोग

PS C:\> .\makehum.ps1
1601
1601    1.6     KiB
PS C:\> .\makehum.ps1
4066888
4066888 3.9     MiB
PS C:\> .\makehum.ps1
160581
160581  156.8   KiB
PS C:\> .\makehum.ps1
634000000
634000000       604.6   MiB
PS C:\> .\makehum.ps1
2147483647
2147483647      2.0     GiB
PS C:\>

2

हास्केल, 119

मैं दुख की बात है कि हास्केल में 1 दशमलव स्थान सुनिश्चित करने के लिए फ्लोट्स में एक छोटा सा रास्ता नहीं मिला, लेकिन मैं पोस्टिंग के लिए पोस्ट कर रहा हूं।

import Text.Printf
a#n|p>=1=(a+1)#p|1<2=(a,n)where p=n/1000
m n=let(a,b)=0#n in printf"%.1f"b++["B","kB","MB","GB"]!!a

उपयोग:

> m 160581
"160.6kB"

मामूली रूप से कम गोल्फ वाला संस्करण:

import Text.Printf

countThousands :: Int -> Float -> (Int, Float)
countThousands count num
 |nextNum >= 1 = countThousands (count+1) nextNum
 |otherwise    = (count,num)
 where nextNum = num/1000

printHuman :: Float -> String
printHuman n = let (a,b) = countThousands 0 n in 
  (printf "%.1f" b) ++ (["B","kB","MB","GB"]!!a)

2

जावा, 106 बाइट्स

यह एक विधि है जो एक संख्या लेती है और एक स्ट्रिंग लौटाती है।

String f(int n){int k=0;for(;n>1e3;k++)n/=1e3;return(int)(10*n)/10.0+new String[]{"","k","M","G"}[k]+"B";}

आपको एक कार्यक्रम को पूर्ण कार्यक्रम के बजाय एक स्ट्रिंग लौटने की अनुमति है, यह आपको कुछ बाइट्स बचा सकता है;)
रॉल्फ

तीन बातें: आप एक डबल वैसे भी करने के लिए एक परिवर्तित कर रहे हैं (मैं अगर यह आवश्यक है पता नहीं है), तो आप उपयोग कर सकते हैं 1e3के लिए 1000; आपको लगता है कि में बदल सकते हैं while()एक करने के लिए for()और अर्धविराम का उपयोग करें; और मुझे नहीं पता कि यह काम करता है क्योंकि यह सभी दशमलव अंकों को प्रदर्शित करता है, न कि केवल एक दशमलव स्थान को।
lirtosiast

@ThomasKwa: अंतिम बार मैंने जाँच की, यह प्रश्न स्पष्ट रूप से निर्दिष्ट नहीं किया गया था। लेकिन मुझे लगता है कि यह अब करता है।
SuperJedi224

1

पायथन 2, 127 बाइट्स

ISU का उपयोग करना। स्निपेट एक फ़ंक्शन 'C' घोषित करता है जो संख्या को तर्क के रूप में परिवर्तित करने में लेता है।

C=lambda v:min(['%.1f %sB'%(x,u)for x,u in[(v/1000.0**i,'bkMG'[i])for i in range(4)]if x>=1]).replace('.0 b',' ')if v else'0 B'

कुछ परीक्षण कोड:

    print 'Input\tOutput'
for v in [0,999,1000,1023,1023,1601,160581,4066888,634000000,2147483647]:
 print v,C(v)

आप 1e3इसके बजाय का उपयोग कर सकते हैं1000.0
mbomb007

1

जावास्क्रिप्ट ( ईएस 6 ), 71

एसआई इकाइयों का उपयोग करना - अनुरोधित स्ट्रिंग को वापस करने वाला एक फ़ंक्शन।

f=(a,b=3)=>+(r=eval('a/1e'+b*3).toFixed(1))[0]?r+' kMG'[b]+'B':f(a,b-1)

यह छोटा नियम विशेष रूप से 3 और 4 का अनुसरण करता है

  • आउटपुट हमेशा सबसे बड़ी इकाई में होना चाहिए जहां परिणामी संख्या अभी भी अधिक है या एक के बराबर है तो 995 => 1.0kB
  • आउटपुट में हमेशा एक दशमलव संख्या होनी चाहिए, लेकिन आप एक पूर्णांक संख्या को प्रिंट करने के लिए चुन सकते हैं जब परिणामी आउटपुट बाइट्स में होता है (बी) मैं नहीं चुनता हूं, इसलिए 10 => 10.0 बी

काश, इस तरह, परिणाम उदाहरणों से मेल नहीं खाते।

उदाहरणों का मिलान करने के लिए, यहाँ छोटी संख्याओं के लिए एक विशेष आवरण है (82 बाइट्स)

f=(a,b=3)=>a<1e3?a+'B':+(r=eval('a/1e'+b--*3).toFixed(1))[0]?r+'kMG'[b]+'B':f(a,b)

परीक्षण करने के लिए स्निपेट चलाएँ (केवल EcmaScript 6, फ़ायरफ़ॉक्स)


1

पायथन, 61 बाइट्स

f=lambda n,i=0:"%.1f%cB"%(n," kMG"[i])*(n<1e3)or f(n/1e3,i+1)

जैसे बुलाओ f(999)। ध्यान दें कि 1e3एक फ्लोट है, इसलिए यह पायथन 2 और पायथन 3 दोनों के साथ काम करता है।


1

PHP4.1, 63 62 बाइट्स

सबसे अच्छा गोल्फ नहीं है, लेकिन निश्चित रूप से काफी कम है।

<?for($S=kMG;$B>1e3;$I++)$B/=1e3;printf("%.1f{$S[$I-1]}B",$B);

इसका उपयोग करने के लिए, POST / GET पर पहुंचें या कुंजी में एक मान सेट करें B

अहम को छोड़ दो I!


1

SpecBAS - 100 बाइट्स

ISU सम्मेलन का उपयोग करना।

मैंने महसूस किया कि 1e3 के लिए एक वैरिएबल सेट (जिसमें इसे असाइन करने के लिए LET स्टेटमेंट की आवश्यकता है), और फिर वर्कआउट आउट में उस वैरिएबल का उपयोग करके, वास्तव में 1e3 को हार्डकोड करने की तुलना में अधिक वर्णों का उपयोग किया जहां इसकी आवश्यकता थी।

1 INPUT n: LET i=1
2 DO WHILE n>1e3: LET n=n/1e3: INC i: LOOP 
3 PRINT USING$("&.*0#",n);" kMG"(i);"B"

1

रूबी, 128 बाइट्स

c=->i{p i.to_s+'B'if i<1e3;p (i/1e3).to_s+'kB'if i>=1e3&&i<1e6;p (i/1e6).to_s+'MB'if i>=1e6&&i<1e9;p (i/1e9).to_s+'GB'if i>=1e9}

मैंने इसे लंबा किया, यह बहुत बुरा है।

उत्पादन

c[0] # => "0B"
c[999] # => "999B"
c[1000] # => "1.0kB" 
c[1023] # => "1.023kB"
c[1024] # => "1.024kB"
c[1601] # => "1.601kB"
c[160581] # => "160.581kB"
c[4066888] # => "4.066888MB"
c[634000000] # => "634.0MB"
c[2147483647] # => "2.147483647GB"

संपादित करें

अतिरिक्त 39 बाइट्स के लिए टीबी जोड़ा गया

c=->i{p i.to_s+'B'if i<1e3;p (i/1e3).to_s+'kB'if i>=1e3&&i<1e6;p (i/1e6).to_s+'MB'if i>=1e6&&i<1e9;p (i/1e9).to_s+'GB'if i>=1e9&&i<1e12;p (i/1e12).to_s+'TB'if i>=1e12}

आउटपुट:

c[1000000000000] # => "1.0TB"

1

सेड -r, 218 + 1

मैं SI इकाइयों का उपयोग कर रहा हूं; मुझे लगता है कि बाइनरी इकाइयों को चुनना एक साहसी नीति होगी । ;-)

s/(.)((...)+)$/\1z\2/;h;s/[^z]*z?//;s/.../k/g;s/kk/M/;s/Mk/G/;x;s/(z.)[5-9].*/\1c/;s/(z.c?).*/\1/;:;s/9c/c0/;s/zc/cz/;t;s/(^|0)c/1/;s/1c/2/;s/2c/3/;s/3c/4/;s/4c/5/;s/5c/6/;s/6c/7/;s/7c/8/;s/8c/9/;G;s/\n//;s/$/B/;y/z/./

पुन: स्वरूपित:

#!/bin/sed -rf

# Place decimal point (use z as shorthand for \.)
s/(.)((...)+)$/\1z\2/
h

# count thousands into hold space
s/[^z]*z?//
s/.../k/g
s/kk/M/;s/Mk/G/
x

# truncate to 1 decimal place
s/(z.)[5-9].*/\1c/
s/(z.c?).*/\1/

# propagate carry
:
s/9c/c0/
s/zc/cz/
t
s/(^|0)c/1/
s/1c/2/
s/2c/3/
s/3c/4/
s/4c/5/
s/5c/6/
s/6c/7/
s/7c/8/
s/8c/9/

# Append units
G;s/\n//
s/$/B/
y/z/./

उत्पादन

1 => 1B
9 => 9B
99 => 99B
999 => 999B
1000 => 1.0kB
9999 => 10.0kB
99949 => 99.9kB
99950 => 100.0kB
99999 => 100.0kB
999999 => 1000.0kB
9999999 => 10.0MB
9999999999 => 10.0GB
1000 => 1.0kB
10000 => 10.0kB
10005 => 10.0kB
10440 => 10.4kB
10450 => 10.5kB
10950 => 11.0kB

बदलाव

नियम थोड़े-थोड़े गोल-गोल लगते हैं, लेकिन मानव प्रदर्शन के लिए, मेरा मानना ​​है कि नीचे गिरना एक स्वीकार्य विकल्प है, और 123 बाइट्स (50% से बेहतर) बचाता है:

s/(.)((...)+)$/\1.\2/;h;s/[^\.]*\.?//;s/.../k/g;s/kk/M/;s/Mk/G/;x;s/(\..).*/\1/;G;s/\n//;s/$/B/

बड़ी इकाइयों के लिए प्राकृतिक विस्तार (अभी भी नीचे गोल, 130 + 1 बाइट्स):

s/(.)((...)+)$/\1.\2/;h;s/[^\.]*\.?//;s/.../k/g;s/kk/M/g;s/Mk/G/;s/MM/T/g;s/TT/Y/;s/TM/E/;s/TG/Z/;x;s/(\..).*/\1/;G;s/\n//;s/$/B/

विविधता उत्पादन:

1 => 1B
9 => 9B
99 => 99B
999 => 999B
1000 => 1.0kB
9999 => 9.9kB
99949 => 99.9kB
99950 => 99.9kB
99999 => 99.9kB
999999 => 999.9kB
9999999 => 9.9MB
9999999999 => 9.9GB
1000 => 1.0kB
10000 => 10.0kB
10005 => 10.0kB
10440 => 10.4kB
10450 => 10.4kB
10950 => 10.9kB
1000000000 => 1.0GB
1000000000000 => 1.0TB
1000000000000000 => 1.0MGB
1000000000000000000 => 1.0EB
1000000000000000000000 => 1.0ZB
1000000000000000000000000 => 1.0YB
999999999999999999999999999 => 999.9YB

अच्छा काम! मुझे पसंद है कि आपने सभी विभिन्न विकल्पों के बारे में सोचा था!
रॉल्फ R

1

सी, 77 75

f(float l){char*u=" kMG";while((l/=1e3)>=1)++u;printf("%.1f%cB",l*1e3,*u);}

यह SI इकाइयों का उपयोग करता है और गोलाई के लिए 1000.0kB विकल्प लेता है।

विस्तारित कोड:

f(float l)
{
    char *u = " kMG";
    while ((l/=1000) >= 1)
        ++u;
    printf("%.1f%cB", l*1000, *u);
}

उत्पादन

9 => 9.0 B
9999 => 10.0kB
1023 => 1.0kB
1024 => 1.0kB
999990 => 1000.0kB
1048575 => 1.0MB
1048576 => 1.0MB
2147483647 => 2.1GB

वेरिएंट

यदि कोई गुणक है तो बाइनरी इकाइयों को पाने के 1000लिए 1024, iप्रारूप स्ट्रिंग में जोड़ें और बदलें । 4-अंकीय गोलाई से बचने के लिए, के >=.95बजाय तुलना करें >=1। बड़ी इकाइयों को स्वीकार करने के लिए, uस्ट्रिंग का विस्तार करें । इन सभी विकल्पों को मिलाकर, हमें यह मिलता है:

f(float l)
{
    char*u=" kMGTPEZY";
    while((l/=1024)>=.95)++u;
    printf(*u-' '?"%.1f%ciB":"%.0fB",l*1024,*u);
}

भिन्न उत्पादन

9 => 9B
9999 => 9.8kiB
1023 => 1.0kiB
1024 => 1.0kiB
999990 => 1.0MiB
1048575 => 1.0MiB
1048576 => 1.0MiB
2147483647 => 2.0GiB
1000000000 => 953.7MiB
1000000000000 => 931.3GiB
1000000000000000 => 909.5TiB
1000000000000000000 => 888.2PiB
1000000000000000000000 => 867.4EiB
1000000000000000000000000 => 847.0ZiB
999999999999999999999999999 => 827.2YiB
1176043059457204080886151645 => 972.8YiB

परीक्षण कार्यक्रम

कमांड-लाइन तर्कों के रूप में किसी भी संख्या में इनपुट पास करें:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
    while (*++argv) {
        printf("%s => ", *argv);
        f(strtod(*argv, 0));
        puts("");
    }
    return 0;
}

एक अच्छा;) अच्छी तरह से मार डाला!
रॉल्फ R

0

रूबी, 91 बाइट्स

n=gets.to_i;i=0;while n>1023;n/=1024.0;i+=1;end;puts "#{n.round 1} #{%w[B KiB MiB GiB][i]}"

मैं शायद थोड़ा और बेहतर कर सकता था अगर मैंने और कोशिश की लेकिन यहाँ जो मैंने अभी तक प्राप्त किया है।


के 1024.बजाय का उपयोग करें 1024.0
mbomb007

0

जावास्क्रिप्ट ईएस 5, 69 बाइट्स

यह अंतिम लक्ष्य तक पहुंचने के लिए एक अलग तरीके का उपयोग करता है जो @ edc65 का उत्तर है
वास्तव में, यह मेरे PHP उत्तर के बहुत करीब है ।

for(i=+prompt(z=0);i>1e3;z++)i/=1e3;alert(i.toFixed(1)+' kMG'[z]+'B')

बस स्टैक स्निपेट चलाएं या इसे अपने कंसोल पर पेस्ट करें।


0

रूबी, 90 बाइट्स

proc{|n|q=((1..3).find{|i|n<(1<<i*10)}||4)-1;[n*10/(1<<q*10)/10.0,%w[B kB MB GB][q]].join}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.