แยกวิเคราะห์ภาษา 1D


13

รับสตริงที่มีเพียง 0 ของ 1, 2 และวงเล็บส่งออกต้นไม้ไวยากรณ์ของสตริง

A 2ต้องการ 2 อาร์กิวเมนต์ - หนึ่งทางซ้ายและอีกหนึ่งทางขวา

1ต้องอาร์กิวเมนต์เดียว - ทั้งด้านซ้ายหรือขวา

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
ฉันยังไม่เห็นสาเหตุที่0120210ไม่สามารถแยกวิเคราะห์ได้เช่นกัน2[4](2[2](1[1](0[0]), 0[3]), 1[5](0[6]))ซึ่งเป็นที่ที่หมายเลขวงเล็บแสดงตำแหน่งในสตริง
feersum

101ยังคลุมเครือ
feersum

คำตอบ:


3

Python 3.6 (เผยแพร่ล่วงหน้า), 199

บันทึกไปแล้ว 6 ไบต์ขอบคุณ Morgan Thrapp

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.