गोल्फ स्ट्रिंग्स


22

मैं हमेशा चुनौतियों के लिए एक उत्तर देने में विफल रहा हूं जिन्हें स्ट्रिंग संपीड़न की आवश्यकता होती है, इसका मुख्य कारण यह है कि मुझे स्ट्रिंग संपीड़न उपकरणों का प्रभावी ढंग से उपयोग करने की आवश्यकता नहीं है ।

इस कारण से, मैंने यह प्रश्न पोस्ट किया है। मेरे अन्य सुझावों के विपरीत, यह भाषा विशिष्ट अर्थ नहीं है कि यदि आप अपनी भाषा में किसी भी सुझाव के बारे में सोच सकते हैं, तो आप इसे पोस्ट कर सकते हैं (यह प्रदान करते हुए कि आप भाषा निर्दिष्ट करते हैं)। सामान्य सुझावों की भी सराहना की जाती है।

तो, मैं उनकी अधिकतम प्रभावशीलता के लिए स्ट्रिंग संपीड़न उपकरणों का उपयोग कैसे कर सकता हूं?

जवाबों:


9

आधार रूपांतरण (CJam)

ASCII स्ट्रिंग्स को एनकोड बाइट से शुरू न करने का एक आसान तरीका बेस 128 से पूर्णांक में बदलना है, फिर बेस 256 से:

128b256b:c              e# Prints encoded string.
128b256b:c`"256b128b:c" e# Prints encoded string with decoder.

यह प्रत्येक ASCII वर्ण को एनकोड करने के लिए 7 बिट्स का उपयोग करता है।

मूल स्ट्रिंग केवल की, जैसे, छोटे अक्षरों होते हैं, और एक साथ नहीं शुरू होता है, तो एक है, हम मानचित्रण द्वारा शुरू कर सकते हैं "a...z"करने के लिए [0 ... 25]है, तो इसके बाद के संस्करण के रूप में आगे बढ़ना:

'afm26b256b:c               e# Prints encoded string.
'afm26b256b:c`"256b26b'af+" e# Prints encoded string with decoder.

अंत में, यदि मूल स्ट्रिंग में केवल कुछ विशिष्ट अक्षर (ASCII कला में आम) हैं, तो आमतौर पर वर्णमाला को स्पष्ट रूप से निर्दिष्ट करना बेहतर होता है।

उदाहरण के लिए:

" +-/\|"f#6b256b:c                       e# Prints encoded string.
" +-/\|"f#6b256b:c`"256b6b"" +-/\|"`"f=" e# Prints encoded string with decoder.

अंगूठे के नियम के रूप में, आप चाहते हैं कि मूल स्ट्रिंग का पहला वर्ण वर्णमाला का दूसरा वर्ण हो, मूल स्ट्रिंग का अगला विशिष्ट वर्ण वर्णमाला का पहला वर्ण हो, मूल स्ट्रिंग का अगला विशिष्ट वर्ण वर्णमाला का तीसरा वर्ण हो, मूल तार का अगला विशिष्ट वर्ण वर्णमाला का चौथा वर्ण हो, आदि।

अंतिम उदाहरण के एनकोडर निम्नानुसार काम करते हैं:

" +-/\|"f# e# Replace each character by its index in that string.
6b256b     e# Convert from base 6 (length of the alphabet) to base 256.
:c         e# Cast each digit to character.

अंतिम उदाहरण के डिकोडर निम्नानुसार काम करते हैं:

256b6b     e# Convert from base 256 to base 6.
" +-/\|"f= e# Replace each digit by the corresponding character of the alphabet.

2
मैं और अधिक विशिष्ट होगा: अंगूठे के एक नियम के रूप में आप चाहते हैं कि मूल स्ट्रिंग का पहला वर्ण वर्णमाला का दूसरा वर्ण हो, मूल स्ट्रिंग का अगला विशिष्ट वर्ण वर्णमाला का पहला वर्ण हो, ...
पीटर टेलर

@PeterTaylor जोड़ा गया। धन्यवाद!
डेनिस

9

कुछ संरचना के साथ बड़ा कोलमोगोरोव जटिलता का सवाल है, लेकिन कोई सरल सूत्र (जैसे गीत के बोल) आम तौर पर व्याकरण-आधारित दृष्टिकोण से लाभान्वित होंगे। संक्षेप में, आप बार-बार सब्सट्रेटिंग निकालते हैं और उन्हें किसी तरह एनकोड करते हैं। व्याकरण के एक काफी प्रतिबंधित वर्ग का उपयोग करते हुए यह लेम्पेल-ज़िव करता है; यदि आप अधिक सामान्य व्याकरणों का उपयोग करते हैं तो आपको यह पता लगाना होगा कि नियमों को कैसे एनकोड करना है। उदाहरण के लिए एक दृष्टिकोण यहाँ "ऑफसेट एन्कोडिंग", जहां नियम (की संख्या से प्रत्येक स्रोत बाइट ऑफसेट है n), असाइन बाइट्स 1के लिए nनियमों के, का उपयोग 0अलग नियमों के बाइट, और बार बार बाइट की जगह iका मूल्यांकन नियम के साथ i। अंत में आप nप्रत्येक बाइट से घटाकर ऑफसेट को पूर्ववत करें ।

मैंने वास्तव में एक जावा प्रोग्राम लिखा है जो विभिन्न तरीकों को लागू करता है:

अधिकांश दृष्टिकोण दो-चरण प्रक्रिया का पालन करते हैं। पहले चरण में स्ट्रिंग को एक व्याकरण में परिवर्तित किया जाता है जो इसे उत्पन्न करता है; दूसरे चरण में, व्याकरण को गोल्फस्क्रिप्ट प्रोग्राम में बदल दिया जाता है। पहले चरण के कार्यान्वयन मोटे तौर पर चरिकर, लेहमैन, लियू, पाणिग्रही, प्रभाकरन, सहाय, और शेलट (2005) पर आधारित हैं । सबसे छोटी व्याकरण की समस्या , सूचना सिद्धांत, IEEE लेनदेन, 51 (7), 2554-2576।

इसमें एक लेम्पेल-ज़िव अप्रोच, एक बेस एन्कोडिंग दृष्टिकोण और एक रनरलोक-एन्कोडिंग दृष्टिकोण भी शामिल है, और जो सबसे छोटा प्रोग्राम देता है, उसकी पहचान करता है।


0

Stax

में Stax कोड गोल्फ भाषा, वहाँ एक उपयोगी छोटे बुलाया उपकरण है स्ट्रिंग शाब्दिक कंप्रेसर । मैं नहीं पता है कि यह कैसे काम करता है, वास्तव में, लेकिन वहाँ एक और मैं कहाँ है है पता है कि यह कैसे काम करता है। यह स्ट्रिंग्स को संख्याओं में परिवर्तित करता है, फिर बेस 256 में। यह CP437 है , जिसमें 0x00 और 0xFF को कॉपी करने के लिए परिवर्तित किया गया है। यह पैक्डस्टैक्स है। आप स्ट्रिंग स्ट्रिंग शाब्दिक कंप्रेसर के साथ अपने तार बदल सकते हैं, फिर इसे पैक करें, कुछ अच्छे संपीड़न के लिए।

इस प्रक्रिया का उपयोग करते हुए स्ट्रिंग "यह स्ट्रिंग बत्तीस बाइट्स है" को v * "A] में बदला जा सकता है - | W4]} 3"% (संपीड़ित स्ट्रिंग आमतौर पर बैकटिक्स से घिरा होता है, जो Stax में एक सामान्य स्ट्रिंग के बीच का अंतर बताता है। ) और अंत में thanvìë! [uqJu ▓ aα के लिए एक संपीड़न / 18 बाइट्स की कमी, आधे से अधिक।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.