2011-03-20 14 views
6

यह जावास्क्रिप्ट फ़ंक्शन संख्याओं की संख्या (0-255 में) लेता है और बेस 64-एन्कोडेड स्ट्रिंग में परिवर्तित होता है, फिर लंबे समय तक टूट जाता है यदि आवश्यक हो तो लाइनें:बाइट मानों की सरणी को बेस 64 एन्कोडेड स्ट्रिंग में परिवर्तित करें और लंबी लाइनों को तोड़ें, जावास्क्रिप्ट (कोड गोल्फ)

function encode(data) 
{ 
    var str = ""; 
    for (var i = 0; i < data.length; i++) 
    str += String.fromCharCode(data[i]); 

    return btoa(str).split(/(.{75})/).join("\n").replace(/\n+/g, "\n").trim(); 
} 

क्या आप कम कोड में वही काम कर सकते हैं? क्या आप इसे कर सकते हैं तो यह तेजी से चलता है? पोर्टेबिलिटी नो ऑब्जेक्ट, यदि आप चाहें तो ब्रांड नई भाषा सुविधाओं का उपयोग करें, लेकिन जावास्क्रिप्ट में होना चाहिए। फ़ायरफ़ॉक्स 3.6.13 में

+0

क्या ब्राउज़र (ओं) में तेजी से चलाता है? जहां तक ​​मुझे पता है, 'btoa' केवल गीको और वेबकिट ब्राउज़र द्वारा समर्थित है। – Gabe

+0

ऐसा होने पर, यह फ़ायरफ़ॉक्स एक्सटेंशन का एक बहुत छोटा टुकड़ा है, लेकिन अगर आपके पास कुछ अन्य ब्राउज़र के जेएस का उपयोग करने के लिए एक चालाक तरीका है तो मुझे यह भी देखकर खुशी होगी। – zwol

+0

अहम ... http://codegolf.stackexchange.com/ – jessegavin

उत्तर

13

मैं एक प्रविष्टि है:

function encode(data) 
{ 
    var str = String.fromCharCode.apply(null,data); 
    return btoa(str).replace(/.{76}(?=.)/g,'$&\n'); 
} 

न्यूनतम, 88 वर्ण:

function e(d){return btoa(String.fromCharCode.apply(d,d)).replace(/.{76}(?=.)/g,'$&\n')} 

या आप अनुगामी नई-पंक्तियों, 85 वर्ण चाहते हैं:

function e(d){return btoa(String.fromCharCode.apply(d,d)).replace(/.{1,76}/g,'$&\n')} 
+1

ओह, बहुत अच्छा! हालांकि मैं 'लागू' के उपयोग के बारे में 100% निश्चित नहीं हूं। किसी भी फ़ंक्शन (फ़ायरफ़ॉक्स में, वैसे भी) के लिए 2 ** 1 9 तर्कों की कुछ कठोर सीमा है और मुझे लगता है कि इसे तर्क क्षेत्र में सरणी को अनपॅक करने के लिए थोड़ा अतिरिक्त काम करना पड़ सकता है। मुझे उम्मीद नहीं है कि मेरे सरणी * * लंबे समय तक हों, और छोटीता अच्छी है। – zwol

+0

मैंने अभी परीक्षण किया है (फायरबग में), यह यहां लगभग 12 * 2 ** 20 संख्या तक काम करता है। और यह भी एक कठिन सीमा नहीं थी, यह सिर्फ रिपोर्ट की गई कि स्क्रिप्ट स्टैक स्पेस कोटा समाप्त हो गया था। – Anomie

+0

इसमें कितना समय लगता है? क्या आप बड़े बाइट एरे के साथ हमारी विभिन्न विधियों का समय ले सकते हैं? – Gabe

2

काम करता है:

function encode(data) 
{ 
    var str = data.reduce(function(a,b){ return a+String.fromCharCode(b) },''); 
    return btoa(str).replace(/.{76}(?=.)/g,'$&\n'); 
} 
+0

क्या आपको वहां 'ट्रिम' की आवश्यकता है? – Gabe

+0

@Gabe: मैंने इसे पिछली स्ट्रिंग से बचने के लिए रखा है जब बेस 64-एन्कोडेड स्ट्रिंग लाइन लाइन की सटीक एकाधिक होती है जबकि अन्यथा लाइनबैक की कमी होती है। लेकिन जब आपको जवाब में लिखा गया, मैंने सोचा "क्या फ़ायरफ़ॉक्स का जावास्क्रिप्ट रेगेक्स इंजन शून्य-चौड़ाई सकारात्मक दिखने वाला समर्थन करता है?"। और यह करता है! संपादित। – Anomie

+0

ओह, क्या वस्तु यहां न्यूनतम वर्ण है? इसे 116 वर्णों या 113 तक सीमित किया जा सकता है यदि आप चाहते हैं कि प्रत्येक आउटपुट में पिछली नई लाइन हो (रेगेक्स को '/। {1,76}/g' में बदलें)। – Anomie

1

मैं फ़ायरफ़ॉक्स काम नहीं है, तो मैं इसे बाहर की कोशिश नहीं कर सकते, लेकिन एक सामान्य स्ट्रिंग से निपटने के नजरिए से यह है कि आपने कुछ कमरा है लग रहा है सुधार करने के लिए। आप जो कर रहे हैं, हर बाइट के लिए, एक नया स्ट्रिंग एक वर्ण बना रहा है जो आपके पिछले एक से अधिक लंबा है। यह एक ओ (एन^2) ऑपरेशन है। कुछ तरीकों का उपयोग एन कटौती करने ताकि आपके एल्गोरिथ्म के पास रेखीय समय में चलता है:

  1. लंबाई 57 को तार (यह एक 76-चार Base64 परिणाम निकलेगा) बनाएँ, तो एक btoa पर प्रदर्शन यह परिणामस्वरूप स्ट्रिंग को अपने आउटपुट

  2. बस # 1 की तरह ही, केवल लाइनों की एक सरणी बनाएं और अंतिम आउटपुट स्ट्रिंग बनाने के लिए join पर कॉल करें।

  3. 1-वर्ण तारों की एक सरणी बनाने के लिए map का उपयोग करें, फिर उस पर join पर कॉल करें।

यहाँ प्रत्येक विधि के लिए कुछ अपरीक्षित कोड है:

function encode(data) 
{ 
    var output = ""; 
    var str = ""; 
    for (var i = 0; i < data.length; i++) 
    { 
    str += String.fromCharCode(data[i]); 
    // the "&& i != data.length - 1" clause 
    // keeps the extra \n off the end of the output 
    // when the last line is exactly 76 characters 
    if (str.length == 57 && i != data.length - 1) 
    { 
     output += btoa(str) + "\n"; 
     str = ""; 
    } 
    } 
    return output + btoa(str); 
} 

function encode(data) 
{ 
    var output = []; 
    var str = ""; 
    for (var i = 0; i < data.length; i++) 
    { 
    str += String.fromCharCode(data[i]); 
    if (str.length == 57) 
    { 
     output[output.length] = btoa(str); 
     str = ""; 
    } 
    } 
    if (str != "") 
    output[output.length] = btoa(str); 
    return output.join("\n"); 
} 

function encode(data) 
{ 
    var str = data.map(function (d) { return String.fromCharCode(d) }).join(""); 
    return btoa(str).replace(/.{76}(?=.)/g,'$&\n'); 
} 

और यहाँ पिछले एक, न्यूनतम किया गया (116 वर्ण) है:

function e(b){return btoa(b.map(function(d){return 
String.fromCharCode(d)}).join("")).replace(/.{76}(?=.)/g,'$&\n')} 
+0

एक बंद करने की आवश्यकता है, क्योंकि नक्शा 3 कार्यों (सरणी तत्व, अनुक्रमणिका, और सरणी वस्तु) के साथ अपने फ़ंक्शन को आमंत्रित करता है और स्ट्रिंग.फॉमकारकोड एकाधिक-एकाधिक वर्ण स्ट्रिंग को वापस करने के लिए तर्क के रूप में एकाधिक कोड बिंदु ले सकता है। संयोग से, मैंने आपको पोस्ट करने से पहले याद किया और महसूस किया कि मैं उस तथ्य का लाभ उठा सकता हूं। – Anomie

+0

मुझे 'btoa' को खिलाने के लिए एक समय में 57 बाइट्स को तोड़ने का विचार पसंद है। – zwol

संबंधित मुद्दे