1D 언어 파싱


13

0과 1, 2와 괄호 만 포함 된 문자열이 주어지면 문자열의 문법 트리를 출력합니다.

A 2에는 2 개의 인수가 필요합니다. 하나는 왼쪽에, 하나는 오른쪽에

A 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유효한 입력은?
Neil

아니요, 1 (2 (0,1 (0))) 또는 2 (1 (0), 1 (0)) 일 수 있습니다.
Blue

실제로 나는 그것이 1 (2 (1 (0), 0)) ;-)라고 생각하고 있었다
Neil

1
난 아직도 왜 안보여 01202102[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

설명 및 ungolfed 버전 :

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.