1D言語の解析


13

0、1、2、および角かっこのみを含む文字列を指定すると、文字列の文法ツリーが出力されます。

Aに2は2つの引数が必要です-左に1つ、右に1つ

A 1は単一の引数を必要とします-左または右のいずれかに

A 0は引数を必要とせず、基本ケースです

角括弧のペアは1つの引数としてカウントされ、角括弧の内容は文字列の残りの部分とは別に評価されます。ネストされたブラケットが可能です

入力文字列は常に完全なツリーであり、文字が落ちることはありません。また、文字列には単一の正しい解しかありません。関数は可換であり、引数の配列は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あいまいです。
feersum

回答:


3

Python 3.6(プレリリース)、199

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