उपसर्ग ट्री ट्रैवर्सल


13

एक प्रोग्राम लिखें जो पुनरावर्ती फॉर्म के साथ एक स्ट्रिंग (कमांड या लाइन के माध्यम से) लेता है

PREFIX[SUFFIXES]

कहाँ पे

  • PREFIX रिक्त स्ट्रिंग सहित लोअरकेस अक्षर (az) की कोई भी स्ट्रिंग हो सकती है, और
  • SUFFIXESPREFIX[SUFFIXES]खाली क्रम सहित, पुनरावर्ती रूप में एक साथ संक्षिप्त रूप के साथ तार का कोई भी क्रम हो सकता है ।

प्रत्येक प्रत्यय में स्ट्रिंग की सूची का पुनर्मूल्यांकन करके और उन्हें उपसर्ग में जोड़कर इनपुट से निचले अक्षर वाले तारों की एक सूची बनाएं। किसी भी क्रम में इस सूची में तार को रोकने के लिए आउटपुट, प्रति पंक्ति (प्लस एक वैकल्पिक अनुगामी न्यूलाइन)।

उदाहरण

अगर इनपुट है

cat[s[up[][]][]ch[e[r[]s[]]]a[maran[]comb[]pult[[]ing[]]]]

तो उपसर्ग है catऔर और प्रत्यय हैं s[up[][]], [], ch[e[r[]s[]]], और a[maran[]comb[]pult[[]ing[]]]। प्रत्येक प्रत्यय की अपनी उपसर्ग होती है और बदले में प्रत्यय होता है।

आउटपुट किसी भी क्रम में ये 9 शब्द होंगे

catsup
cats
cat
catcher
catches
catamaran
catacomb
catapult
catapulting

क्योंकि इनपुट इस पेड़ को एनकोड करता है

वृक्षारेख

और 9 आउटपुट शब्दों में से प्रत्येक पेड़ को जड़ से पत्ती तक ट्रेस करके बनाया जा सकता है।

टिप्पणियाँ

  • याद रखें कि उपसर्ग खाली स्ट्रिंग हो सकता है, इसलिए कुछ ऐसा

    [donut[][]cruller[]]
    

    वैध इनपुट है जिसका उत्पादन (किसी भी क्रम में) होगा

    donut
    
    cruller
    

    जहाँ खाली लाइन दूसरी स्ट्रिंग से मेल खाने वाली खाली स्ट्रिंग के लिए है।

  • प्रत्यय अनुक्रम भी खाली हो सकता है, इसलिए तुच्छ इनपुट मामला

    []
    

    इसके आउटपुट के रूप में एक खाली लाइन है:

    
    
  • आप मान सकते हैं कि इनपुट केवल अद्वितीय आउटपुट शब्द ही उत्पन्न करेगा।
    • उदाहरण के hat[s[]ter[]s[]]लिए अमान्य इनपुट होगा क्योंकि hatsदो बार एन्कोड किया गया है।
    • इसी तरह, [[][]]अमान्य है क्योंकि खाली स्ट्रिंग दो बार एन्कोडेड है।
  • आप यह नहीं मान सकते हैं कि इनपुट जितना संभव हो उतना छोटा या संपीड़ित है।
    • उदाहरण के 'e'लिए, ऊपर के मुख्य उदाहरण में 'ch'नोड को नोड के साथ जोड़ा जा सकता है , लेकिन इसका मतलब यह नहीं है कि इनपुट अमान्य है।
    • इसी तरह, [[[[[]]]]]उप-इष्टतम तरीके से केवल खाली स्ट्रिंग को एन्कोडिंग करने के बावजूद, मान्य है।
  • एक कार्यक्रम के बजाय आप एक फ़ंक्शन लिख सकते हैं जो इनपुट स्ट्रिंग को एक तर्क के रूप में लेता है और आउटपुट को सामान्य रूप से प्रिंट करता है या इसे स्ट्रिंग या सूची के रूप में लौटाता है।

बाइट्स में सबसे छोटा कोड जीतता है।

जवाबों:


2

रूबी, ११ ९ ११५

t=['']
l=[0]
gets.chars{|c|c<?]?t<<''&&(l<<0)[-2]+=1:c<?^?(x=l.pop;t.pop==''&&(puts t*''if x<1;t[-1]='')):t[-1]<<c}

उदाहरण

इसे आज़माएं: http://ideone.com/NW0CNB

विवरण

कार्यक्रम को स्टडिन से इनपुट मिलता है और परिणाम को स्टडआउट के लिए आउटपुट करता है।

यह पेड़ की वर्तमान शाखा को एक ढेर में रख देता है। एक अलग स्टैक भी कहा जाता है, weightsजो प्रत्येक नोड के बच्चों की संख्या पर नज़र रखता है। यह निर्धारित करने के लिए यह आवश्यक है कि क्या नोड वास्तव में एक पत्ती है, या उसके पास अतीत में बच्चे थे।

पठनीय कार्यक्रम:

stack = ['']
weights = [0]

gets.chars do |c|
  case c
  when '['
    weights[-1] += 1
    stack << ''
    weights << 0
  when ']'
    last_weight = weights.pop

    if stack.pop == ''
      puts stack.join if last_weight < 1
      stack[-1] = ''
    end
  else
    stack[-1] << c
  end
end

6

हास्केल, 125 बाइट्स

t=tail.p
p=g.break(=='[')
g(a,(_:t))=(:)&(map(a++).z)$t#[]
z[]=[""];z x=x
(']':u)#a=u:a
s#a=(#)&(a++)$p s
(g&f)(x:y)=g x$f y

समारोह है t(ट्रैवर्सल के लिए):

λ: t "cat[s[up[][]][]ch[e[r[]s[]]]a[maran[]comb[]pult[[]ing[]]]]"
["catsup","cats","cat","catcher","catches","catamaran","catacomb","catapult","catapulting"]
λ: t "[donut[][]cruller[]]"
["donut","","cruller"]
λ: t "[[[[[]]]]]"
[""]

आपका कोड १२४ बाइट्स है, न कि १२५ :)
क्रिस्टियन लुपस्कु

मुझे लगता है कि पैटर्न इसके बजाय (a,(_:t))हो सकता है(a,_:t)
गर्वित हैकेलर

2

जावा, 206 बाइट्स

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

int c,i;List a(String a){String b=a.substring(c,c=a.indexOf(91,c));List d=new ArrayList();for(;a.charAt(++c)!=93;)d.addAll(a(a));if(d.isEmpty())d.add("");for(i=0;i<d.size();)d.set(i,b+d.get(i++));return d;}

उदाहरण का उपयोग:

class A{
    public static void main(String[] args){
        System.out.println(new A.a("cat[s[up[][]][]ch[e[r[]s[]]]a[maran[]comb[]pult[[]ing[]]]]"));
    }

    int c,i;List a(String a){String b=a.substring(c,c=a.indexOf(91,c));List d=new ArrayList();for(;a.charAt(++c)!=93;)d.addAll(a(a));if(d.isEmpty())d.add("");for(i=0;i<d.size();)d.set(i,b+d.get(i++));return d;}
}

विस्तारित:

int c, i;
List a(String a){
    String b = a.substring(c, c = a.indexOf(91, c));
    List d = new ArrayList();
    for(; a.charAt(++c) != 93 ;)
        d.addAll(a(a));
    if (d.isEmpty())
        d.add("");
    for (i = 0; i < d.size();)
        d.set(i, b + d.get(i++));
    return d;
}

मैं कल एक स्पष्टीकरण जोड़ूंगा।


0

पायथन, 212 वर्ण

def p(t,f="",o="",d=0):
 if[]==t:return
 b=[""]
 for c in t:d+=c=="[";b[-1]+=c;d-=c=="]";b+=[""]*(d==0)*(c=="]")
 for r in b[:-1]:i=r.index("[");w,s=f+r[:i],r[i:][1:-1];p(s,w);o+= ["",w+"\n"][""==s]
  if o:print o,

मैं 200 से कम होने की उम्मीद कर रहा था, लेकिन फिर भी मैं इससे बहुत खुश हूं।


0

जावास्क्रिप्ट ईएस 6, 142 बाइट्स

s=>(o=[],x=_=>s[0]==']'?s=s.slice(1):0,(g=d=>{while(s&&!x())[o[d],s]=s.split(/\[(.*)/).concat``,x()?console.log(o.join``):g(d+1),o.pop()})(0))

0

प्रश्न: 70 बाइट्स

f:{,/'$({(z_x),y}\[();{`$x@&~x="]"}'w;-b])@-1+&0<b:(+/"]"=)'w:"["\:x}

एक फ़ंक्शन f को परिभाषित करता है जो एक स्ट्रिंग को स्वीकार करता है और स्ट्रिंग्स की एक सूची लौटाता है (शब्द)

लैम्ब्डा (अनाम फ़ंक्शन) के रूप में हम पहले 2 वर्णों को छोड़ते हैं f :, इतनी लंबाई 68 बाइट्स है

परीक्षा

f "cat[s[up[][]][]ch[e[r[]s[]]]a[maran[]comb[]pult[[]ing[]]]]"

( "कैटचप", "बिल्लियों", "बिल्ली", "पकड़ने", "कैच", "कटमरैन", "तलघर", "गुलेल", "catapulting")

f "[donut[][]cruller[]]"

( "डोनट", "", "cruller")

f "[[[[[]]]]]"

, ""

टिप्पणियाँ

, "" स्ट्रिंग की एक सूची इंगित करता है जिसमें केवल एक खाली स्ट्रिंग है

प्रतीक परमाणु हैं। स्टैक पर एक प्रतीक को दबाएं / पॉप करें यह एक सरल ऑपरेशन है जो प्रतीक की लय से प्रभावित नहीं है (स्पष्टीकरण देखें)

व्याख्या

Q, APL का चचेरा भाई है (kx.com)

स्यूडोकोड:

  • स्प्लिट्स स्ट्रिंग (arg x) "[" char पर। परिणाम (तार की सूची) w में
  • गिनता है "]" प्रत्येक एलएम में चार्ट। w की। बी में परिणाम
  • वर्ण को फ़िल्टर करने के लिए प्रत्येक आइटम को संशोधित करता है "]" और प्रत्येक स्ट्रिंग को प्रतीक में परिवर्तित करता है
  • आइटम> 0 को b में चिह्नित करने के लिए एक तार्किक अनुक्रम (बिटमैप) बनाता है
  • एक स्टैक के साथ आंशिक परिणामों पर Iterates: यदि चिह्नित आइटम को हमें अधिक प्रतीकों में से एक को छोड़ना होगा (बी में मूल्य के अनुसार)। हमेशा स्टैक करने के लिए वास्तविक प्रतीक संलग्न करें
  • पुनरावृति के बाद हमारे पास सभी मध्यवर्ती अवस्थाएँ हैं। हम पहले से चिह्नित राज्यों का चयन करते हैं
  • अंत में प्रत्येक परिणाम के लिए हम प्रतीकों को स्ट्रिंग्स में परिवर्तित करते हैं और उन्हें संक्षिप्त करते हैं

-1

कोबरा - 181

def f(s='')as String*
    for m in RegularExpressions.Regex.matches(s,r'(\w*)\[((?:(?<B>\[)|\w|(?<-B>]))*)](?(B)(?!))'),for r in.f('[(u=m.groups)[2]]'),yield'[u[1]]'+r
    if''==s,yield''

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