1D dilini ayrıştırma


13

Yalnızca 0, 1, 2 ve parantez içeren bir dize verildiğinde, dizenin dilbilgisi ağacını çıktılar.

A 22 argüman gerektirir - biri sola diğeri sağa

A 1tek bir argüman gerektirir - sola veya sağa

A 0herhangi bir argüman gerektirmez ve temel durumdur

Bir çift köşeli ayraç bir bağımsız değişken olarak sayılır ve köşeli ayraçların içeriği dizenin geri kalanından ayrı olarak değerlendirilir. İç içe parantez mümkündür

Giriş dizesi her zaman tam bir ağaç olur ve karakter düşmez. Dize ayrıca yalnızca tek bir doğru çözüme sahip olacaktır. İşlevlerin değişmeli olduğunu ve herhangi bir argüman düzenlemesinin 2kabul edilebilir olacağını unutmayın. Bu gereksinimlere uymayan girdileri işlemek zorunda kalmayacaksınız.

Çıktı gramer formatı function(arguments)özyinelemeli olarak olacaktır

Test senaryoları

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)))

Mi 10201geçerli giriş?
Neil

Hayır, 1 (2 (0,1 (0))) veya 2 (1 (0), 1 (0))
Mavi olabilir

Aslında 1 (2 (1 (0), 0)) ;-) olduğunu düşünüyordum
Neil

1
Hala neden parantez içinde sayılar dizede konumu belirtildiği 0120210gibi ayrıştırılamıyorum görmüyorum 2[4](2[2](1[1](0[0]), 0[3]), 1[5](0[6])).
feersum

101aynı zamanda belirsizdir.
feersum

Yanıtlar:


3

Python 3.6 (ön sürüm), 199

Morgan Thrapp sayesinde 6 bayt tasarruf edildi

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

Açıklama ve ungolfed sürümü:

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.