Gizlenmiş parantez var mı?


12

Birisi bize bir ip verdi, ancak tüm parantez benzeri karakterler normal karakterlere dönüştürüldü ve hangisinin, hatta kaçının olduğunu bilmiyoruz. Tek bildiğimiz, L1,L2,L3,...,LNfarklı türde sol parantezler olsaydı ve R1,R2,R3,...,RNfarklı karşılık gelen sağ parantez türleri olsaydı , hepsi farklıydı (2N farklı parantez karakteri), bir dize, (+ normal dize birleştirme ise):

  • L1+X+R1,, L2+X+R2...,, geçerli bir dize LN+X+RNnerede X,

  • X+Y, nerede Xve Ygeçerli dizeler,

  • Köşeli ayraç karakteri olmayan herhangi bir karakter.

  • Boş dize

Köşeli parantezleri değiştirmeden önce geçerli bir dize ile başladıklarını biliyoruz ve bunları dizede zaten var olan karakterlere dönüştürmediler. Her braket için de en az bir çift mevcuttu. Hangi karakterlerin orijinal olarak sol ve sağ köşeli parantez çiftleri olduğunu yeniden oluşturabilir misiniz ( verilen koşulları Live Riaşağıdaki koşulları bulun )?

Köşeli ayraç olan karakter çiftlerini çıktılar. Örneğin, (){}[]gerçekten köşeli ayraç karakterleri olsaydı , çıktı alabilirsin, (){}[]ya {}[]()da [](){}, vb. Bir dize için bunu yapmanın birden çok yolu olabilir, yalnızca daha fazla çiftli köşeli parantez atamayacak şekilde bir tane döndürmen gerekir (örneklere bakın). Çıktı dizesinin her zaman eşit uzunlukta olması gerektiğini unutmayın.

Örnekler:

abcc- cköşeli ayraç olamaz, çünkü iki kez gerçekleşen başka bir karakter yoktur, ancak abköşeli ayraç çifti olabilir, bu yüzden tam olarak çıktı alırsınız ab.

fffff - en fazla bir karaktere sahip herhangi bir dize parantez içeremez, bu nedenle boş dize döndürür veya hiçbir şey çıkarmazsınız.

aedbedebdcecdec - 1 dize, 2 bs, 3 cs, 4 ds ve 5 es olduğu için bu dizede herhangi bir parantez olamaz, bu nedenle parantez olması için iki kez aynı sayıda karakter olmaz.

abcd- olası atamaları vardır ab, cd, abcd, cdab, adbc, bcad, ac, ad, bcve bd, (aynı zamanda hepsi var boş atama, gibi) ama sen geri dönmelidir, böylece en uzun atamaları biri dönmelidir abcd, cdab, adbc, veya bcad.

aabbcc, abc- bunlar her ikisine de sahip ab, acve bcgeçerli çiftleri olarak. Bu çiftlerden birini iade etmelisiniz, hangisi önemli değil.

abbac- a ve b aynı karakter sayısına sahiptir, ancak gerçekte çalışamazlar, çünkü bunlardan biri diğerinin tüm oluşumlarının hem solunda hem de sağında meydana gelir. Hiçbir şey döndürmeyin.

aabcdb- cdve abtam iki dirsek çifti vardır, çıkış ya da çok cdabya da abcd.

abcdacbd- Sadece bir çift aynı anda elde edilebilir, ancak ab, ac, bd, cd, ve adolası çiftleri tüm dönebilirsiniz edilir. Seçtiğiniz çifti olursa olsun, bu durumu dışında, başka çiftleri yasaklayan tek diğer karakter kendi içinde olan bir örneğini vardır addiğer çift, bcve cbya ve bu nedenle mümkün olamaz yalnız mümkün değildir ile ad.

Bu kod golf, bayt en kısa kod kazanır. Diliniz için mümkünse giriş STDIN'den yapılır. Mümkün değilse cevabınızdaki giriş yöntemini belirtin.


1
giriş için abcd, çıktı adbcda kabul edilebilir olurdu, değil mi?
Patrick Roberts

Evet, örneğe ekledim.
Sürtünme Kavun

Yanıtlar:


4

Yakut, 373 bayt

i=gets.chomp
b=[*(i.chars.group_by{|x|x}.group_by{|x,y|y.size}.map{|x|s=x[1].size
x[1][0...s-s%2].map{|x|x[0]}*''}*'').chars.each_slice(2)]
puts [*[*b.size.downto(1).map{|n|b.combination(n).map{|t|[t*'',(h=Hash[t]
s=[]
o=1
i.each_char{|c|s.push(c)if h.keys.include?c
(o=false if s.empty?||!h[s.pop].eql?(c))if h.values.include?c}
o ?s.empty?: o)]}}.find{|x|x[0][1]}][0]][0]

Bu, burada yığın ayrıştırıcısının golf edilmiş bir sürümünü kullanır .

Muhtemelen daha da basitleştirilebilir, ancak beynimin daha fazla işleyebileceğini sanmıyorum.

Tüm test örnekleri: http://ideone.com/gcqDkK

Boşluklu: http://ideone.com/pLrsHg

Ungolfed (çoğunlukla): http://ideone.com/oM5gKX

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.