Розбираємо 1D мову


13

Враховуючи рядок, що містить лише 0, 1 і 2, і дужки, виведіть граматичне дерево рядка.

А 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дійсний вхід?
Ніл

Ні, це може бути 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

Збережено 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.