Tamamen parantez içindeki ifadeler


11

Bugün meydan okuman, bir ifadenin tüm olası tam parantezlerini üretmektir.

Girişiniz, operatörler tarafından ayrılmış bir veya daha fazla terim içeren yazdırılabilir ASCII'nin tek bir satırıdır. Girişte boşluk da olabilir - bunları yok saymanız gerekir. Bir terim [a-zA-Z0-9], bir operatör [^ ()a-zA-Z0-9]. Girişin her zaman geçerli olduğunu varsayabilirsiniz.

Belirli bir ifadeyi yeni satırlarla ayırarak, verilen ifadeyi tamamen parantez içine almak için tüm olası yolları çıktılayın.

Do not :

  • Parantez boyutları - işleçlerin çevresinde yalnızca parantez içine alın.
  • Şartları yeniden sıralayın.
  • Herhangi bir boşluğun çıktısını alın.

Örnek giriş / çıkış:

N
N

a * b
(a*b)

x_x_0
(x_(x_0))
((x_x)_0)

a * b|c|d
(a*(b|(c|d)))
(a*((b|c)|d))
((a*b)|(c|d))
((a*(b|c))|d)
(((a*b)|c)|d)

Bayt cinsinden en küçük kod kazanır.


Dikkate almamız gereken kesin operatörleri listelemeniz gerekir. Mı !bir operatör? Ne olmuş ?
Optimizer

@Optimizer Operatör olarak kabul edilen şeyin tam düzenli ifadesini listeledim. !normal ifadeye uyar , ancak ASCII yazdırılamadığından girdinin bir parçası olamaz.
orlp

Ah tamam. Yani bir terim dışında her şey bir operatör ...
Optimizer

Yani hem terimler hem de operatörler her zaman bir karakter uzunluğunda mıdır?
user81655

1
zorunlu LISP ile ilgili puntayı buraya ekleyin
kedi

Yanıtlar:


2

Pyth, 38 bayt

L?tbsmmjj@bdk"()"*y<bdy>bhd:1lb2bjy-zd

Çevrimiçi deneyin.

Özyinelemeli bir işlevi tanımlar:

  • uzunluğu 1 ise girişi döndürür
  • operatördeki ve her bir bölme için girdinin tüm iki bölünmesini alır:
    • her yarıda kendini tekrar tekrar çağırıyor
    • her yarının sonuçlarının Kartezyen ürününü alır
    • her sonucu bölmedeki operatör tarafından birleştirir
    • katılan sonucu parantez içine alır
  • ve son olarak, sonuçtaki dizileri birleştirir.

Fonksiyon daha sonra boşluklar kaldırılmış giriş dizgisi ile çağrılır ve sonuçlar satırsonu ile birleştirilir.


3

JavaScript (ES6), 208 197 bayt

s=>((q=x=>x.map((_,i)=>(a=[...x.slice(0,i*=2),p="("+x[i]+x[++i]+x[++i]+")",...x.slice(i+1)],x[i]?a[1]?q(a):r.push(p):0)))([...s.replace(/ /g,o="")],r=[]),r.map((l,i)=>r.indexOf(l)<i?0:o+=l+`
`),o)

açıklama

Bir diziyi alan özyinelemeli bir işlev kullanır [ t, o, t, o, etc... ]ve birbirini izleyen her iki terimin çiftini parantez içine alır ve dizide [ (tot), o, etc... ]yalnızca bir öğe olana kadar bu işlemi tekrarlar, sonra yinelenen değerleri filtreler.

s=>(                                  // s = input string
  (q=x=>                              // q = parenthesise array function
    x.map((_,i)=>(
      a=[                             // a = p with parenthesised pair of terms
        ...x.slice(0,i*=2),
        p="("+x[i]+x[++i]+x[++i]+")", // parenthesise and join 2 terms and an operator
        ...x.slice(i+1)
      ],
      x[i]?a[1]                       // make sure the loop is not over
        ?q(a)                         // check next level of permutations
        :r.push(p)                    // add the permutation to the results
      :0
    ))
  )([...s.replace(/ /g,               // remove spaces and parenthesise all expressions
    o="")],                           // o = output string
    r=[]),                            // r = array of result strings
  r.map(                              // filter out duplicates
    (l,i)=>r.indexOf(l)<i?0:o+=l+`
`
  ),o)                                // return o

Ölçek

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.