स्ट्रिंग Arrays संपीड़ित
अद्यतन: इस टिप में चित्रित उपकरण तब से फिर से लिखे, सुधारे गए और मेरे जाप दुभाषिया में एकीकृत किए गए हैं । सर्वोत्तम परिणामों के लिए यह अनुशंसा की जाती है कि आप उस कंप्रेसर का उपयोग नीचे दिए गए लिंक में से किसी एक पर करें। जब मेरे पास कुछ और समय होगा तो मैं इस टिप को फिर से लिखूंगा और इसे नए कंप्रेसर के साथ फिर से लिखूंगा।
परिचय
यदि आपके पास अपने कोड में स्ट्रिंग्स की एक सरणी है, तो इसे संपीड़ित करने का सबसे स्पष्ट तरीका व्यक्तिगत रूप से प्रत्येक स्ट्रिंगOc
को चलाना होगा । इस टिप के प्रयोजनों के लिए, हम सरणी के साथ काम करेंगे ["lollipop","marshmallow","nougat","oreo"]
, जिसका वजन शुरुआत में 42 बाइट्स पर होता है। प्रत्येक तार के माध्यम Oc
से हमें देता है:
[`lo¥ipop`,`Ú\hÚaow`,`Í`,`eo`]
यह अब 33 बाइट्स है, एक सभ्य बचत है।
चरण 1
लेकिन , हम बेहतर कर सकते हैं। अगर हम सरणी को एक नईलाइन से अलग स्ट्रिंग में शामिल करते हैं, तो हम अपने सरणी को प्राप्त करने के लिए कोष्ठक, अल्पविराम, और बाहरी बैकटिक्स से छुटकारा पा सकते हैं और न्यूलाइन पर विभाजित हो सकते हैं। हमारे उदाहरण सरणी पर लागू करने से हमें निम्नलिखित मिलता है:
`lo¥ipop
Ú\hÚaow
Í
eo`·
नीचे अब 26 बाइट्स हैं।
चरण 2
लेकिन , हम अभी भी बेहतर कर सकते हैं! हम एक न्यूलाइन के बजाय स्ट्रिंग्स को डिलीट करने के लिए एक लोअरकेस लेटर का उपयोग कर सकते हैं, जो सम्पीडन में शामिल हो सकता है। z
हमारे किसी भी तार का उपयोग नहीं किया जाता है ताकि हम उसे छोड़ दें और देखें कि हम कैसे प्राप्त करते हैं।
`lo¥ipopzÚ\hÚaowzÍzeo`qz
आह, नट - वहां कोई सुधार नहीं; हमारी बाइट की गिनती एक-एक करके बढ़ गई है! एक और पत्र हो सकता है जिसका आप उपयोग कर सकते हैं, लेकिन आपके तार के आधार पर, बहुत कुछ करने की कोशिश की जा सकती है - हमारे उदाहरण में 11 हैं b,c,d,f,j,k,q,v,x,y,z
:। प्रत्येक की कोशिश करना बहुत थकाऊ होगा, जो इस काम के उपकरण में आता है; इसे अपनी नई लाइन से अलग तार खिलाएं और यह प्रत्येक अक्षर के साथ तारों को परिसीमित करने की कोशिश करेगा जो उनमें से किसी में भी शामिल नहीं है:
- सबसे छोटी संकुचित स्ट्रिंग,
- यह उपयोग करता है, और
- इसकी लंबाई।
इसके माध्यम से हमारे सैंपल स्ट्रिंग्स को चलाने से पता चलता है कि b
सर्वोत्तम परिणाम मिलते हैं:
`lo¥ipáæqrÚaowbÍÞo`qb
और आपके पास यह है, हम सिर्फ 24 बाइट्स के लिए नीचे हैं।
चरण 3
लेकिन , हम और भी बेहतर कर सकते हैं ! यदि आपके एरे में तार का क्रम मायने नहीं रखता है, तो हो सकता है कि एक अलग-अलग परिसीमन के साथ एक अलग क्रमबद्धता हो जो कम से कम काम कर सके। प्रत्येक संभावना की कोशिश बहुत अधिक थकाऊ होने जा रही है, हालांकि। हमारे 4 स्ट्रिंग्स के साथ, 24 अलग-अलग क्रमांकन करने की कोशिश की जा रही है। 11 संभावित पत्रों में से प्रत्येक 264 हो जाता है! यहीं से यह उपकरण चलन में आता है। फिर से, इसे अपनी नईलाइन को अलग किए गए तार से खिलाएं और यह हर क्रमचय और हर परिसीमन पत्र, आउटपुट के हर संयोजन की कोशिश करेगा:
- कम से कम संकुचित स्ट्रिंग में तार का क्रम
- संकुचित स्ट्रिंग,
- सीमांकक इसका उपयोग करता है, और,
- इसकी लंबाई।
इसके माध्यम से हमारे नमूना तार रनिंग पता चलता है कि "nougat","oreo","lollipop","marshmallow"
के साथ b
एक परिसीमक सबसे अच्छा परिणाम देता है के रूप में, केवल 23 के अंतिम बाइट गिनती के साथ:
`ÍÞo½o¥ipáæqrÚaow`qb
बोनस टिप: पूर्णांक सरणी संपीड़न
आप एक ही सिद्धांत को पूर्णांक के सरणियों में लागू कर सकते हैं, पहले प्रत्येक को एक उच्च आधार पर परिवर्तित करके। इस नमूने का उपयोग करते हुए, 36 बाइट सरणी:
[588181,156859,595676,475330,680474]
हम इसे 29 बाइट्स तक प्राप्त कर सकते हैं, पहले इसे आधार के 32 तारों की एक सरणी में परिवर्तित करके और फिर इसे पहले संपीड़न कार्यक्रम के माध्यम से चला सकते हैं:
`huclt4p5r5ÛÊg62tkogq`qt mnH
या दूसरे कार्यक्रम का उपयोग करते हुए 27 बाइट्स जितना कम:
`4p5Ïcl5ÛÊg62tkogq`qt mnH
हो सकता है कि पूर्णांक रूपांतरण को आप पहले से चला रहे विधि में पूर्णांक रूपांतरण को स्थानांतरित करके उस पर एक और बाइट या 2 बचा सकें।
टिप्पणियाँ
- 1 या 2 अतिरिक्त बाइट की
q<letter>(<space>)
लागत से अधिक कारक को मत भूलना ·
। हालाँकि, आप अपने सीमांकक के आधार पर एक बाइट वापस पाने के लिए यूनिकोड शॉर्टकट्स में से एक का उपयोग करने में सक्षम हो सकते हैं ( qÊ
यह उसी तरह हैql<space>
उदाहरण के लिए ) के ।
- अंतिम उपकरण का उपयोग करते समय सावधानी का एक शब्द: आपके पास जितने अधिक तार होंगे, उतने अधिक क्रमपरिवर्तन होंगे और कार्यक्रम धीमा हो जाएगा, जब तक कि यह अंततः बाहर नहीं निकलता। जैसा कि ऊपर विस्तृत है, हमारे 4 सैंपल स्ट्रिंग्स और कोशिश करने के लिए 11 संभावित अक्षरों के साथ, 264 संभावित संयोजन हैं, एक ही 11 अक्षरों के साथ स्ट्रिंग्स की संख्या केवल 1 बढ़ाएं और हमारे पास कोशिश करने के लिए पहले से ही 1320 संयोजन हैं। (आप चाहें तो संयोजनों की संख्या की गणना करने के लिए इस उपकरण का उपयोग कर सकते हैं)।
क्रेडिट
- इस टिप में पाए गए उपकरण बनाने की प्रेरणा के लिए ओलिवर।
- प्रूफरीडिंग के लिए ETHproductions।