IMP:暗黙的な乗算パーサー


9

ジャックはCプログラミング言語が好きですがV=a*b*h; 、値を乗算するような式を書くのは嫌いです。

V=abh;代わりに彼は書きたいのですが、定義されabhているのでシンボルが未定義であることについてコンパイラがうめき声を出してint a, b, h;、乗算を推定できるようにする必要がありますか?

現在のスコープで定義されている変数のセットがわかっている場合、単一の乗算項を解読するパーサーの実装を支援します。

簡単にするために、(のように2*a*b)数値による乗算は考慮されず、変数のみが表示されます。

入力は正規表現を満たす乗算項Tです。

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

変数セットZ

変数セットZに対する項Tの解析Pは、次の条件を満たす文字列です。

  1. *Pからのすべての出現を削除した後、Tを受け取り、
  2. Zからの変数名であるか、Zからの適切な変数名を1 *文字で分割して構成されています。

ソリューションは、用語のすべての解析を出力する必要があります。

サンプル:

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行に1つの構文解析またはコンマ区切りのリストなど)にすることができますが、明確で、読みやすくする必要があります。

用語を解析できない場合は、空の出力でも問題ありません(例では、わかりやすくするために「-」を使用しています)。

これはコードゴルフなので、最短のコードが勝ちます。


1
あなたの最初の例では、許可された変数ではないab*cため、私は誤った解析であると考えていcます。
isaacg 2015

1
再帰スキャンで、サンプルで正確に結果を見つけます。しかし、それは疑わしいです:なぜそうa*aaa aaa*aでないのかab*c c*ab
edc65

解析のルール1.のため。はい、通常、乗算は可換ですが、ここまでは進みません。乗算を「実行」した順序で「再構築」したいだけです。実際、ジャックの言語では、行列型を使用できます。その場合、乗算は可換ではありません。また、「aaaa」は「aaa」と「a」または「a」と「aaa」の両方の並置にすることができます。これは可換性のためではなく、あいまいさのために両方を考慮しています。
pawel.boczarski 2015

回答:


4

Pyth、18文字

mj\*dfqzsTsm^Qkhlz

このソリューションは、私の魚の解釈 ソリューションから採用されました。問題は実際には非常に似ています。

そのような入力を期待します:

aaaa
"a", "aaa"

次のような出力が得られます。

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

ここで試してください。

  • sm^Qkhlz:入力文字列の長さまでの変数を含む変数のすべてのシーケンスを生成します。

  • fqzsT:入力文字列に一致する変数シーケンスをフィルターで除外します

  • mj\*d*記号を挿入して印刷します。


3

Python 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

JavaScript(ES6)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,[])

出力はコンソールに出力されます。関数の結果には意味がなく、破棄する必要があります。

Firefox / FireBugコンソールでテストする

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.