क्या सामान्यीकृत स्ट्रिंग रिवर्स फ़ंक्शन लिखना संभव है जो सभी स्थानीयकरणों और स्ट्रिंग प्रकारों के लिए काम करता है?


16

मैं सिर्फ देव-डेज़ से जॉन स्कीट (टोनी द पोनी के साथ) प्रस्तुति देख रहा था

यद्यपि "101 एक स्ट्रिंग रिवर्स फ़ंक्शन लिखें" साक्षात्कार कोडिंग 101 है - मुझे यकीन नहीं है कि यह वास्तव में सामान्य स्ट्रिंग रिवर्स फ़ंक्शन लिखना संभव है, निश्चित रूप से ऐसा नहीं है जो सभी स्थानीयकरणों और सभी स्ट्रिंग प्रकारों में काम करता है।

यह पता लगाने के अलावा कि इनपुट स्ट्रिंग एएससीआई, यूटीएफ 8, यूटीएफ 16 (निश्चित और परिवर्तनीय लंबाई) आदि
है या नहीं, 'जॉन ने अगले चरित्र के लिए उच्चारण लागू करें' (यू + 0301) कोड जो जॉन ने उजागर किया था। फिर ऐसे लिगचर हैं जिन्हें प्रदर्शित किया जा सकता है या नहीं किया जा सकता है, या उन्हें दोहरे वर्णों के रूप में एन्कोड किया जा सकता है।

लगता है कि "एक स्ट्रिंग रिवर्स" वास्तव में कठिन कंप्यूटर विज्ञान कार्यों में से एक है!


नाह, मुश्किल में कुछ एक कदम के लिए रुक समस्या का प्रयास करें, लेकिन लोगों को समझाने के लिए सरल।
जेबी किंग

एक nonsubjective, तकनीकी प्रश्न होने के नाते, मैं यह कहने के लिए उद्यम करूंगा कि यह StackOverflow पर बेहतर तरीके से फिट होगा (कृपया इसे वहां न भेजें, हालांकि, यदि लोग इसे यहां बंद करने के लिए मतदान करते हैं, तो यह स्वचालित हो जाएगा)।
पेटर तोरॉक

1
प्रोग्रामिंग भाषा पर निर्भर करता है। उदाहरण के लिए रूबी में यह उतना ही आसान है "stressed".reverse: पी
मार्सेलो

महान दार्शनिक प्रश्न। FWIW, जावा के
स्ट्रिंगबर्ल

2
"जावा का उपयोग करके इस स्ट्रिंग को उल्टा करें" एक अच्छा ट्रिक प्रश्न है। :)
स्कॉट सी विल्सन

जवाबों:


5

हाँ। यदि हमें एक स्ट्रिंग मिलती है तो हम निश्चित रूप से प्रत्येक वर्ण को उल्टा कर सकते हैं।

जॉन के रूप में समस्या यह बताती है कि क्या इसका उल्टा मतलब है और क्या यह भाषा और सांस्कृतिक नियमों, पात्रों और एन्कोडिंग के अनुरूप है। पानी गहरा हो जाता है तुम जाओ।

यदि आप C # में किसी भी प्रकार का स्ट्रिंग हेरफेर कर रहे हैं, तो लिखते और पढ़ते समय Invariant संस्कृति का उपयोग करें, इस तरह से आप उन्हें सुरक्षित रूप से हेरफेर कर सकते हैं। अन्यथा, तुर्की समर्थन कॉल विफलता के लिए तैयार करें।

ToUpper () इतनी मासूम लग रही है, लेकिन इसकी एक महाकाव्य असफल होने की प्रतीक्षा कर रही है।


2
दूसरा सवाल है - क्या कोई कभी भी साक्षात्कार (क्यू के अलावा) के लिए स्ट्रिंग रिवर्स का उपयोग करता है? मुझे केवल I / O पोर्ट्स के निम्न स्तर के बफर मैनिपुलेशन के लिए ही इसकी आवश्यकता है - और फिर भी लगभग कभी भी स्ट्रिंग्स के साथ नहीं
मार्टिन बेकेट

@ मर्तिन - सहमत। शायद एक अंग्रेजी भाषा कार्यक्रम के लिए palidromes खोजने के लिए? मुझे नहीं लगता कि मैंने क्विज़ प्रश्न हल करने के अलावा इसका उपयोग किया है।
जॉन रेन्नोर

@ मॉर्टिन सच। मुझे लगता है कि यह केवल विडंबना है। :)
स्कॉट सी विल्सन

2

सामान्य तौर पर, जब यह प्रश्न पूछा जाता है तो यह यूएस-एएससीआईआई मान रहा है। यूनिकोड के व्यक्ति के ज्ञान का परीक्षण करने के लिए बिंदु इतना अधिक नहीं है (हालांकि यह एक दिलचस्प अनुवर्ती होगा), यह देखने के लिए कि क्या वे समझते हैं कि संकेत कैसे काम करते हैं। एक आश्चर्यजनक संख्या में लोग इस तरह के सूचक अंकगणित नहीं कर सकते हैं।


2
"यह यूनिकोड के साथ कैसे विफल होगा?" एक अच्छा अनुवर्ती सवाल है
मार्टिन बेकेट

अच्छा लेकिन शायद कुछ हद तक उन्नत - आखिरकार, "इस स्ट्रिंग को जगह में उल्टा करें" एक प्रवेश स्तर का साक्षात्कार प्रश्न है। आप शायद किसी अनुभवी व्यक्ति से यह सरल नहीं पूछेंगे, जब तक कि शायद वे बहुत शर्मीले नहीं थे और आप उन्हें गर्म करने की कोशिश कर रहे थे।
स्कॉट सी विल्सन

1

एक साक्षात्कार प्रश्न के रूप में, यह आमतौर पर अपने आदेश को उलटने के लिए 8-बिट आइटमों के इन-प्लेस स्वैप करने के तकनीकी बिट्स के बारे में बस पूछा जाता है (इस बात की परवाह किए बिना कि कौन से वर्ण वास्तव में प्रतिनिधित्व कर सकते हैं)।

उसी समय, विशेषकर यदि आप किसी अपेक्षाकृत वरिष्ठ व्यक्ति का साक्षात्कार कर रहे हैं, तो आप कम से कम विनिर्देश के बारे में कुछ प्रश्न और इनपुट के सटीक रूप को सुनने की उम्मीद कर सकते हैं। यहां तक ​​कि अगर आप उन्हें केवल 8-बिट आइटमों की अदला-बदली के सरल मामले में वापस निर्देशित करते हैं, तो यह जानना कि वे व्यापक शब्दों में सोचते हैं या नहीं, मूल्यवान हो सकता है।

यदि आपको इनपुट की एक विस्तृत श्रृंखला से निपटना है, तो आपको बस एक "स्टैक" के बारे में सोचना होगा, एक नेटवर्क स्टैक की तरह। आपको अपने सॉफ़्टवेयर को कई परतों में बनाना होगा, जिनमें से प्रत्येक एक विशिष्ट क्रम में परिवर्तनों का एक बहुत विशिष्ट सेट लागू करता है। यह आपको रूपांतरण के प्रत्येक भाग को सरल रखने की सुविधा देता है जिसे आप इसे नियंत्रण में रख सकते हैं, और इसे अपनी आवश्यकताओं को पूरा करने का एक उचित मौका दे सकते हैं।

मैं एक संभावना को रेखांकित करूंगा कि मुझे कम से कम कुछ काम करने योग्य मिला है। मैं यह स्वीकार करने वाला पहला व्यक्ति हूं कि अन्य लोग भी हो सकते हैं जिनके पास बेहतर विचार हैं। कम से कम मेरे लिए, यह थोड़ा वास्तविक लालित्य के साथ, ब्रूट-फोर्स इंजीनियरिंग जैसा लगता है।

आप सामान्य रूप से UCS-4 (उर्फ UTF-32) में किसी अन्य प्रतिनिधित्व को परिवर्तित करके शुरू करना चाहते हैं। इसके लिए, आप आमतौर पर उपयोगकर्ता से इनपुट पर भरोसा करना पसंद करेंगे , इसे अपने दम पर जानने का प्रयास करेंगे। कुछ मामलों में, आप यह सुनिश्चित कर सकते हैं कि ऑक्टेट का एक विशेष अनुक्रम किसी विशेष एन्कोडिंग योजना के नियमों का पालन नहीं करता है , लेकिन आप शायद ही कभी (यदि कभी भी) सुनिश्चित करें कि यह किसी विशेष एन्कोडिंग योजना का पालन करता है।

अगला चरण वैकल्पिक है। आप चार यूनिकोड सामान्यीकरण रूपों में से एक के लिए इनपुट को सामान्य कर सकते हैं। इस मामले में, आप संभवतः "एनएफकेसी" परिवर्तन लागू करना चाहेंगे: विहित संरचना के बाद अनुकूलता अपघटन। यह (जहां संभव हो) संयुक्त राजनैतिक रूपों (जैसे कि यू + 301 कि जॉन ने उल्लेख किया है) को एकल कोड बिंदुओं में परिवर्तित करता है (उदाहरण के लिए, "यू + 301" वाला "ए" "लैटिन राजधानी ए के साथ तीव्र" में परिवर्तित हो जाएगा। , यू + 00 सी 1)।

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

आप उन पूर्ण वर्णों के क्रम को उल्टा करते हैं, आमतौर पर पिछले चरण में आपके द्वारा बनाए गए सूचकांक का उपयोग करके।

आप तब (फिर, वैकल्पिक रूप से) एक और यूनिकोड सामान्यीकरण प्रक्रिया लागू करते हैं, जैसे कि NFD (कैनोनिकल अपघटन)। यह उपरोक्त "लैटिन ए के साथ तीव्र" दो कोड बिंदुओं में बदल जाएगा - एक "लैटिन राजधानी ए" और एक "संयोजन संयोजन"। यदि आपका इनपुट एक U + 00C1 को रोकने के लिए के साथ शुरू करने के लिए, फिर भी हुआ है, यह भी बदल जाएगा कि दो कोड अंक में भी।

फिर आप वांछित एन्कोडिंग (UTF-8, UTF-16, आदि) में UCS-4 कोड बिंदुओं के अनुक्रम को एनकोड करते हैं।

ध्यान दें कि यूनीकोड ​​के सामान्यीकरण के चरण स्ट्रिंग को संग्रहीत करने के लिए आवश्यक कोड बिंदुओं की संख्या को बदल सकते हैं, इसलिए यदि आप उन्हें शामिल करते हैं, तो आप परिणाम स्ट्रिंग पर मूल भंडारण में योजना नहीं बना सकते हैं। स्पष्ट रूप से पर्याप्त है, परिणामी कोड बिंदु सीधे इनपुट कोड बिंदुओं के अनुरूप नहीं हो सकते हैं।


जॉन को लाने से पहले मैं U + 301 के पार नहीं आया था। मैं यह नहीं देख सकता कि सभी उच्चारण पात्रों के लिए ग्लिफ़ के साथ यूनिकोड में इसकी आवश्यकता क्यों है - मुझे लगता है कि यह पीछे की संगतता है
मार्टिन बेकेट

@ मर्टिन: वास्तव में डायक्ट्रीक्स के संयोजन की एक उचित संख्या है (यू + 0300 से लेकर यू + 036 एफ तक की पूरी रेंज, हालांकि यू + 0363 से यू + 036 एफ सबसे अच्छे हैं)। Precomposed वर्ण सबसे आम संभावनाओं में से कुछ के लिए प्रदान किए जाते हैं, और किसी और चीज़ के लिए विकृति विज्ञान के संयोजन।
जेरी कॉफिन

बहुत अधिक भंडारण, सामान्यीकरण और रूपांतरण। बस वर्णों को पुनरावृत्त करें, और इन-प्लेस कोड-यूनिटों के क्रम को उलट दें। फिर सभी कोड-यूनिटों के क्रम को इन-प्लेस करें।
डिडुप्लिकेटर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.