1D भाषा को पार्स करें


13

केवल 0 के 1, 2 और कोष्ठक युक्त स्ट्रिंग को देखते हुए, स्ट्रिंग के व्याकरण वृक्ष का उत्पादन करते हैं।

A 2को 2 तर्क चाहिए - एक को बाईं ओर और एक को दाईं ओर

एक 1तर्क की आवश्यकता है - या तो बाएं या दाएं

A 0को किसी तर्क की आवश्यकता नहीं है और आधार मामला है

कोष्ठक की एक जोड़ी को एक तर्क के रूप में गिना जाता है और कोष्ठक की सामग्री का शेष स्ट्रिंग से अलग से मूल्यांकन किया जाता है। नेस्टेड ब्रैकेट संभव हैं

एक इनपुट स्ट्रिंग हमेशा एक पूर्ण पेड़ होगा जिसमें कोई वर्ण नहीं गिरता है। स्ट्रिंग में केवल एक ही सही समाधान होगा। ध्यान दें कि कार्य सराहनीय हैं और किसी भी तर्क के लिए व्यवस्था 2स्वीकार्य होगी। आपको उन इनपुट को संभालना नहीं पड़ेगा जो इन आवश्यकताओं के अनुरूप नहीं हैं।

आउटपुट व्याकरण प्रारूप function(arguments)पुनरावर्ती रूप में होगा

परीक्षण के मामलों

0 --> 0
01 --> 1(0)
020 --> 2(0,0)
101 --> 1(1(0))
0120 --> 2(1(0),0)
0120210 --> 2(1(0),2(0,1(0)))
01210 --> 2(1(0),1(0))
(020)210 --> 2(2(0,0),1(0))
((020)20)1 --> 1(2(0,2(0,0)))

है 10201मान्य इनपुट?
नील

नहीं, यह 1 (2 (0,1 (0))) या 2 (1 (0), 1 (0)) हो सकता है
ब्लू

वास्तव में मैं सोच रहा था कि यह 1 (2 (1 (0), 0)); ;-)
नील

1
मुझे अभी भी यह नहीं दिखाई देता है कि जहां भी ब्रैकेट की संख्या स्ट्रिंग में स्थिति का संकेत देती है, वहां 0120210भी पार्स क्यों नहीं किया जा सकता है 2[4](2[2](1[1](0[0]), 0[3]), 1[5](0[6]))
feersum

101भी अस्पष्ट है।
फेर्सुम

जवाबों:


3

पायथन 3.6 (प्री-रिलीज़), 199

मॉर्गन थ्रैप को 6 बाइट्स धन्यवाद से बचाया

import re
def f(s):s=s.strip('()');i,j=[m.start()if m else-1for m in(re.search(c+'(?![^(]*\))',s)for c in'21')];return i>0and f'2({f(s[:i])},{f(s[i+1:])})'or j>=0and f'1({f(s[:j])or f(s[j+1:])})'or s

स्पष्टीकरण और अपुष्ट संस्करण:

import re

def f(s):
    s=s.strip('()')
    # Search for '2' and '1' outside of brackets
    i, j = [m.start() if m else -1
            for m in (re.search(c + '(?![^(]*\))', s) for c in '21')]

    if i > 0:
        # Call `f(s[:i])` and `f(s[i+1:])`, concatenate the results
        return f'2({f(s[:i])},{f(s[i+1:])})'
    elif j>=0:
        # Call `f(s[:j])` and `f(s[j+1:])`, choose the non-empty result
        return f'1({f(s[:j]) or f(s[j+1:])})'
    else:
        return s
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.