एक पायथन स्ट्रिंग शाब्दिक पार्स


9

चुनौती यह है कि एक स्ट्रिंग को पार्स करें जैसे पायथन करता है और स्ट्रिंग की सामग्री को प्रिंट करता है

  • इनपुट (कमांड-लाइन तर्क या स्टडिन) : एक स्ट्रिंग शाब्दिक (उदाहरण के लिए "hello") (या कई शाब्दिक, नीचे स्ट्रिंग शाब्दिक संयोजन देखें)
  • आउटपुट (स्टडआउट) : स्ट्रिंग की सामग्री (जैसे hello)

स्ट्रिंग को पार्स करने के नियम:

  • एक स्ट्रिंग शाब्दिक एकल उद्धरणों ( 'a'), डबल कोट्स ( "a"), ट्रिपल सिंगल कोट्स ( '''a''') या ट्रिपल डबल कोट्स ( """a""") के मिलान जोड़े में संलग्न है । स्ट्रिंग खोलने वाले उद्धरणों के प्रकार का पहला प्रतिक्षेप स्ट्रिंग को समाप्त करता है।
  • बैकस्लैश बच जाता है: \' एक स्ट्रिंग के भीतर ', \"बन जाता है "और \\बन जाता है \। आपको किसी अन्य बैकस्लैश एस्केप को लागू करने की आवश्यकता नहीं है। एक बैकस्लैश जो एक एस्केप सीक्वेंस का हिस्सा नहीं है, बैकस्लैश रहता है।
  • स्ट्रिंग शाब्दिक संघटन: आसन्न स्ट्रिंग शाब्दिक की सामग्री संक्षिप्त होती है। उदाहरण के लिए, "hello" 'world'बन जाता है helloworld
  • इनपुट में रिक्त स्थान हो सकते हैं जो किसी भी शाब्दिक का हिस्सा नहीं हैं।
  • आपको किसी भी अन्य प्रकार के व्हाट्सएप का समर्थन करने की आवश्यकता नहीं है, न तो भीतर और न ही बाहर शाब्दिक।

अतिरिक्त नियम:

  • eval, execऔर इसी तरह के सामान को शाब्दिक या उसके कुछ हिस्सों को पार्स करने की अनुमति नहीं है।
  • आप मान सकते हैं कि इनपुट मान्य है।
  • आप अधिकतम 1023 वर्णों की लंबाई मान सकते हैं।

उदाहरण:

  • "hello" ' world' -> hello world
  • """\"""'\\\A""" -> """'\\A
  • ( '''"""'''"""'''""" ) (कोष्ठक के बिना, लेकिन रिक्त स्थान के साथ) -> """'''

सबसे छोटा कोड जीतता है।


क्या आउटपुट एक ऐसे फॉर्म का है जिसे संग्रहीत किया जा सकता है, या क्या इसे प्रिंट करने और इसके साथ किए जाने के लिए पर्याप्त है?
डेविड

@ डेविड प्रिंटिंग यह सब आपको करने की ज़रूरत है।
जूल

तो (जैसे) "\ z", कोड विशेष रूप से बैकस्लैश और जेड आउटपुट के लिए आवश्यक है? लेकिन यह सिर्फ एक अप्रोच बन जाता है, भले ही यह दोहरे-उद्धरणों या ट्रिपल-कोट्स के अंदर दिखाई देता हो? क्या वो सही है?
ब्रेडबॉक्स

@breadbox बिल्कुल
flornquake

क्या कोड को कच्चे तार का समर्थन करना चाहिए? और गैर-कच्चे और कच्चे तारों के संघनन के बारे में क्या?
बाकुरि जुएल 19'13

जवाबों:


4

पर्ल, 54 वर्ण

#!/usr/bin/perl -p
s/ |("""|'''|"|')((\\?.)*?)\1/$2/g;s/\\(["'\\])/$1/g

जिस तरह मैं यह पोस्ट कर रहा था, मैंने देखा कि यह जन द्वारिका के रूबी समाधान के लगभग समान है। मैं वास्तव में कितना समान हूं, इससे थोड़ा बाहर हूं, लेकिन मैं यह कहने जा रहा हूं कि "महान दिमाग एक जैसा सोचते हैं" और इसे उसी पर जाने दें।

यह कार्यक्रम पर्ल स्क्रिप्ट में पात्रों की गिनती में एक अजीब कोने के मामले को उजागर करता है: मेरे पढ़ने से, स्क्रिप्ट में एकल-उद्धरण की उपस्थिति का मतलब है कि मुझे -pअपने कुल के लिए दो वर्णों के रूप में विकल्प को गिनने की आवश्यकता है । आमतौर पर, जब पर्ल स्क्रिप्ट आकार की गणना की जाती है, तो विकल्पों पर प्रारंभिक डैश वर्ण को स्वतंत्र माना जाता है, इस औचित्य पर कि इसे बंडल किया जा सकता है -eजो कार्यक्रम को उचित रूप से पेश करता है ... लेकिन फिर आपको किसी भी अतिरिक्त पलायन के लिए भी ध्यान रखना होगा। आपको कमांड-लाइन पर स्क्रिप्ट दर्ज करने की आवश्यकता है। सिंगल-कोट्स को बहुत से भागने की आवश्यकता होती है, इसलिए उस दंड से बचने के लिए मुझे इसे एक फाइल से चलने वाली स्क्रिप्ट के रूप में गिनना होगा, और इसलिए मुझे #!/usr/bin/perlमुफ्त में मिलता है , लेकिन कोई विकल्प नहीं। यह थोड़ा भ्रमित करने वाला है।


2
यदि आप अलग होना चाहते हैं, (('|")\2{2}?)तो लंबाई समान है("""|'''|"|')
पीटर टेलर

3

C, 178 वर्ण

char*p,*q,b[1024];d;main(t){for(p=q=gets(b);*p=*q++;)
d?*p==92&!(*q-*p&&*q-34&&*q-39)?*p++=*q++:*p-d||t&&*q-d|q[1]-d?++p:
(d=0,q+=2*t):*p-32?d=*p,t=*q==d&q[1]==d,q+=2*t:0;puts(b);}

यह उन सी समाधानों में से एक है जहां सब कुछ एक टर्नरी-ऑपरेटर श्रृंखला गिरोह के अंदर किया जाता है।

यह कार्यक्रम मेटाचैकर्स को अधिलेखित करके उसी बफर में वापस वर्णों को कॉपी करके काम करता है। dजब एक स्ट्रिंग के अंदर सीमांकक पकड़, और tसच है अगर सीमांकक एक ट्रिपल-उद्धरण है।


मुझे लगता है कि आपको लूप नियंत्रण चर के एक सशर्त अतिरिक्त वृद्धि को शामिल करने की आवश्यकता है। 'Foo \\' बार 'के लिए यह foo \ ar' देता है, जो दिखता है कि यह \\ की जगह \\ ले लेता है, लेकिन फिर नए सिरे से दर्ज \ के साथ पार्सिंग जारी रखता है, अगले टोकन को \ _ के रूप में देखता है।
मैनटवर्क

दरअसल, वह उदाहरण अमान्य इनपुट है। 'foo\\'स्ट्रिंग फू \ _ को संदर्भित करता है, जिसे बाद में एक वर्ण द्वारा पीछा किया जाता है जो न तो व्हाट्सएप है और न ही एक स्ट्रिंग सीमांकक है।
ब्रेडबॉक्स

उफ़। मैंने उस नियम को गलत बताया। फिर बेशक आपका कोड सही हो।
मैनटवर्क

3

माणिक, 74 73 अक्षर

puts gets.gsub(/('''|"""|'|")((\\?.)*?)\1|./,'\2').gsub /\\([\\'"])/,'\1'

यहां कोर दो रेगीक्स हैं: पहला एक स्ट्रिंग सीमाओं को निर्धारित करता है और केवल सामग्री का चयन करता है। फेरबदल स्ट्रिंग के अंदर सब कुछ को दूर करने के लिए होता है, और यह बिना तार के भी गिरता है।बैकस्लैश को किसी भी चीज़ के बाद होने वाले वैकल्पिक के रूप में माना जाता है। इस प्रकार,चूंकि रेगेक्स इंजन (\\?.)वैध इनपुट्स के लिए पीछे नहीं हटेगा (धन्यवाद @breadbox), एकमात्र बैकस्लैश वहां मेल नहीं खा सकता है। उद्धरण आलसी पुनरावृत्ति के माध्यम से नियंत्रित किए जाते हैं। दूसरा रेगेक्स तब प्रत्येक पलायन योग्य चरित्र से पहले एक बैकस्लैश करता है। रेगेक्स इंजन पर निर्भर करता है कि वह हमेशा सबसे पहले बाईं ओर का विकल्प चुने।

मैंने एक राज्य-मशीन दृष्टिकोण पर भी विचार किया है, लेकिन यह रेगेक्स समाधान की तुलना में काफी बड़ा (19 राज्यों x 4 वर्ण वर्गों) निकला। अगर कोई दिलचस्पी रखता है तो मैं अभी भी राज्य मशीन पोस्ट कर सकता हूं।


इस विधि के साथ एक छोटी सी गड़बड़: 'फू \\' बार 'फू' के बजाय 'बार' बन जाता है।
मैनटवर्क

@ मैनटवर्क यह सही है, जब तक कि प्रारूपण में कुछ खो नहीं गया है। पहला बैकस्लैश दूसरे से बच जाता है। 'foo\\'पहला तार है और bar'एक स्ट्रिंग संदर्भ के बाहर है जब इनपुट है'foo\\'bar'
जॉन ड्वोरक

उफ़। पता नहीं कैसे मैंने पहले इसकी गणना की। बेशक यह सही है। माफ़ करना।
मैनटवर्क

जब मैं इसे चलाने की कोशिश करता हूं तो मुझे एक त्रुटि संदेश मिलता है: "नेस्टेड *? + में regexp"। क्या कोई न्यूनतम संस्करण या रनटाइम ध्वज है जो मुझे चाहिए?
ब्रेडबॉक्स

@breadbox मैंने अन्य संस्करणों की जांच नहीं की है, लेकिन मैं माणिक 1.9.3 (जुआरबी 1.7.2) चला रहा हूं। क्या मुझे कम से कम 1.9.3 मान लेना चाहिए और इसे संपादित करना चाहिए?
जॉन ड्वोरक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.