Parantez, vb.


15

Göreviniz, kabul etmeyi seçerseniz, belirli bir dizeyi (yalnızca parantez, kaşlı ayraçlar ve köşeli parantezler içeren) doğru küme ayracı eşleştirmesi yapmak için minimum sayıda parantez, parantez ve parantez eklemektir . Eklenen sembol bağları, eşleştirilmiş parantezler arasındaki maksimum mesafeye göre kırılmalıdır . Bu iki kurala uyan tek bir doğru cevap döndürmeniz gerekir; Varsa diğer bağlar, uygun gördüğünüz şekilde kırılabilir.

Örnekler:

input      output
                          // Empty String is a legal input
[          []             // Boring example
[()]       [()]           // Do nothing if there's nothing to be done
({{        ({{}})         // NOT (){}{} (0 + 0 + 0). Maximum distance is 4 + 2 + 0, ({{}})
[([{])]}   {[([{}])]}     // NOT [([])]{[([])]} or similar

Bir program veya işlev yazabilir , girdiyi işlevinize bir dize bağımsız değişkeni olarak STDIN aracılığıyla alır, bu da çıktıyı dize olarak döndürür veya STDOUT'a (veya en yakın alternatife) yazdırır. İsteğe bağlı olarak, çıktıya tek bir sondaki yeni satır ekleyebilirsiniz.

Giriş dizesinin yalnızca aşağıdaki 6 karakterden (veya eksikliğinden) oluştuğunu varsayabilirsiniz: [](){}(Desteklemenize gerek yoktur <>)

Bu , en kısa program kazanır. Elbette standart boşluklar yasaklanmıştır .


Başlığı gerçek başlığın hemen altında tekrarlamak mı yoksa etiketi doğrudan gerçek etiketlerin üstünde mi tekrarlamak istediniz? Sadece Sandbox'tan yapıştırılmış olup olmadığını ve kaldırmayı unuttuğunuzda sormak.
Rainbolt

@Rainbolt Eski hayır (sandbox), ikincisi evet
durron597

1
@AlexA. Onların küçük yollarla nasıl farklı olduklarını görebiliyorum, ama bence ayrı sorular olarak düşünülemeyecek kadar benzerler.
NinjaBearMonkey

Yeterince adil. Kesinlikle kuru ve kuru değil ve diğerleri karar vermiyorsa kapatmaya devam etmeyeceğim.
NinjaBearMonkey

Yeterince farklı düşünürdüm. Oy verildi reopen.
nderscore

Yanıtlar:


1

Python 2-198

Bazı kavrayışları biraz daha aşağıya indirmeyi umuyordum, ancak şu anda bir şeyler yapmanın farklı yollarını gerçekten test etmek için çok zamanım yok.

s="()[]{}";f=s.find
def F(S):
 r=m=""
 for c in S:
    i=f(c)^1
    if i%2:m=c+m;r+=c
    else:
     for d in m:
        if d==s[i]:break
        r+=s[f(d)^1]
     else:r=s[i]+r+c
     m=m[1:]
 for c in m:r+=s[f(c)^1]
 return r

OP, {[([{}])]}{[(bitişik gruplarla) gibi bir örnek içermiyordu , ancak bu işlevsellik gerekip gerekmediği doğru çıktı veriyor{[([{}])]}{[]}


198 bayt nasıldır?
Zacharý

@ZacharyT, sekmeler ( \t) yığın taşması üzerine 4 boşluk olarak biçimlendirilmiş olsun ama aslında sekmeleri ve boşlukları alternatif ediyorum bu yüzden ilk seviyesidir (Eğer Python 2'de girinti düzeyleri için değil 3 yapabilirsiniz) [space]ikinci [tab]üçüncü [tab][space]olduğunu ileri [tab][tab]. Kodun boşluklarla girilmesi beni buradan 227 verir. Mothereff.in/byte-counter ve ben 10 sekme sayıyorum böylece 227 - (3 * 10) = 197. Hah, sanırım ben aslında 1 şekilde geri sayım Bunu gönderdi.
KSab

Dang! Bu gerçekten iyi bir numara. (Satırın sonuna girin). Baytları return r+[s[f(c)^1]for c in m]kaydetmek için alt for-loop'u ve return-deyimini birleştirebilirsiniz .
Zacharý

1

Haskell, 513

İşlev h. Önceki sürüm "({{)["ve için doğru cevap vermedi"({{)}}"

import Control.Monad

m '('=')'
m '['=']'
m '{'='}'
m ')'='('
m ']'='['
m '}'='{'

data B=B Char[B]|N[B]|Z B Char[B]
instance Eq B where(==)a b=q a==q b
instance Ord B where(<=)a b=q a<=q b

w(B o s)=o:(s>>=w)++[m o]
v(N k)=k>>=w
n(B _ k)=(sum$n<$>k)+1
q(N k)=sum$n<$>k

u(Z(Z g pc pk) c k)=Z g pc(pk++[B c k])
u(Z(N pk) c k)=N(pk++[B c k])
t(N k)=N k
t z=t$u z

f z c|elem c "([{"=[Z z c[]]
f z@(Z p o k) c|m c==o=[u z]|2>1=(u$Z(Z p o [])(m c)k):f(u z)c
f (N k)c=[Z(N[])(m c)k]

h s=v.minimum$t<$>foldM f(N [])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.