छोटा सा भूत: लागू गुणक पार्सर


9

जैक को C प्रोग्रामिंग लैंग्वेज पसंद है, लेकिन भाव लिखने से नफरत है जैसे V=a*b*h; मानों को गुणा करना।

वह V=abh;इसके बजाय लिखना चाहेंगे , क्यों abhप्रतीक int a, b, h;परिभाषित किए जाने के बारे में विलाप करना चाहिए क्योंकि वे परिभाषित नहीं हैं, इसलिए हम गुणा कर सकते हैं?

उसे एक ऐसे पार्सर को लागू करने में मदद करें जो एक एकल गुणा शब्द को निर्धारित करता है, बशर्ते कि वर्तमान दायरे में परिभाषित चर का सेट ज्ञात हो।

सरलता के लिए, संख्या (जैसे 2*a*b) में गुणा करना ध्यान में नहीं लिया जाता है, केवल चर दिखाई देते हैं।

इनपुट एक गुणा शब्द T है , जो regexp को पूरा करता है:

[a-zA-Z_][a-zA-Z_0-9]*

और एक चर सेट जेड

चर सेट Z पर शब्द का एक P पार्सिंग पी निम्नलिखित को पूरा करने वाला एक स्ट्रिंग है:

  1. *P से सभी आवृत्तियों को हटाने के बाद हम T प्राप्त करते हैं,
  2. या तो जेड से एक चर नाम है या जेड से उचित चर नाम शामिल हैं जो एकल *वर्णों द्वारा विभाजित हैं ।

समाधान को किसी शब्द की सभी पार्सिंग्स को प्रिंट करना चाहिए।

नमूना:

Vars           a, c, ab, bc
Term           abc
Solution       ab*c, a*bc

Vars           ab, bc
Term           abc
Solution       -

Vars           -
Term           xyz
Solution       -

Vars           xyz
Term           xyz
Solution       xyz

Vars           width, height
Term           widthheight
Solution       width*height

Vars           width, height
Term           widthheightdepth
Solution       -

Vars           aaa, a
Term           aaaa
Solution       aaa*a, a*aaa, a*a*a*a

इनपुट (चर की सूची और शब्द) किसी भी तरह से भाषा के लिए उपयुक्त हो सकते हैं।

आउटपुट किसी भी समझदार रूप में हो सकता है (प्रति पंक्ति या एक अल्पविराम से अलग की गई सूची आदि) - लेकिन यह अस्पष्ट और पढ़ने के लिए संभव होना चाहिए।

खाली आउटपुट स्वीकार्य है अगर किसी शब्द का संभावित पार्सिंग नहीं है (उदाहरण में मैंने इस्तेमाल किया - 'स्पष्टता के लिए')।

यह एक कोड गोल्फ है, इसलिए सबसे छोटा कोड जीतता है।


1
आपके पहले उदाहरण में, मेरा मानना ab*cहै कि एक गलत पार्स है, क्योंकि cएक अनुमत चर नहीं है।
इसहाक

1
एक पुनरावर्ती स्कैन के साथ मुझे नमूना में आपका परिणाम बिल्कुल मिलता है। लेकिन यह संदिग्ध है: क्यों a*aaa aaa*aऔर नहींab*c c*ab
edc65

क्योंकि नियम 1. पार्सिंग का। हां, गुणा आमतौर पर सराहनीय होता है, लेकिन हम इतने आगे नहीं जाते हैं - हम सिर्फ उस क्रम में गुणा करना चाहते हैं जो यह किया गया था। वास्तव में जैक की भाषा में हम एक मैट्रिक्स प्रकार हो सकते हैं - गुणा तब सराहनीय नहीं है। और "आआआ" दोनों "आ" और "ए" या "ए" और "आ" दोनों के रस हो सकते हैं - यह सराहनीयता के लिए नहीं है, बल्कि अस्पष्टता के लिए हम दोनों को ध्यान में रख रहे हैं।
pawel.boczarski

जवाबों:


4

पायथ, 18 वर्ण

mj\*dfqzsTsm^Qkhlz

यह समाधान मेरी व्याख्या मछली समाधान से अनुकूलित है । समस्याएं वास्तव में बहुत समान हैं।

इनपुट की अपेक्षा इस प्रकार है:

aaaa
"a", "aaa"

इस तरह आउटपुट देता है:

['a*aaa', 'aaa*a', 'a*a*a*a']

इसे यहाँ आज़माएँ।

  • sm^Qkhlz: चर के इनपुट स्ट्रिंग संख्या की लंबाई वाले चर के सभी अनुक्रम उत्पन्न करता है।

  • fqzsT: इनपुट स्ट्रिंग से मेल खाने वाले वेरिएबल सीक्वेंस को फिल्टर करता है

  • mj\*d: *प्रतीक और प्रिंट सम्मिलित करता है ।


3

पायथन 2 - 147 94 बाइट्स


R=lambda S,V,F=[]:S and[R(S[len(v):],V,F+[v])for v in V if v==S[:len(v)]]or print("*".join(F))

यह एक फ़ंक्शन Rको इस तरह इस्तेमाल करने के लिए परिभाषित करता है :

>>> R("abc", ["a", "bc", "ab", "c"])

प्रिंट जैसे उत्पादन:

a*bc
ab*c

1

जावास्क्रिप्ट (ईएस 6) 111

मेरे "मछली" जवाब से अनुकूलित , मुख्य अंतर सभी समाधान ढूंढ रहा है, न कि केवल पहले।

F=(v,t)=>(k=(s,r)=>s?v.map(v=>s.slice(0,l=v.length)==v&&k(s.slice(l),[...r,v])):console.log(r.join('*')))(t,[])

आउटपुट कंसोल पर मुद्रित होता है। फ़ंक्शन परिणाम का कोई अर्थ नहीं है और इसे छोड़ दिया जाना चाहिए।

फ़ायरफ़ॉक्स / फायरबग कंसोल में टेस्ट करें

F(['a','c','ab','bc'],'abc')  
a*bc  
ab*c

F(['ab','bc'],'abc')

F(['aaa','a'],'aaaa')
aaa*a
a*aaa
a*a*a*a

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