Eşit çıkış braketi türleri


9

Dayanarak BU soruya.

Bir dize verildiğinde, her braketi ()[]{}<>uygun tipte bir braketle değiştirin, böylece braketler eşleşir ve iç içe parantezler aşağıdaki gibi döner:

  1. En dıştaki ()
  2. Doğrudan içinde ()olmalıdır[]
  3. Doğrudan içinde []olmalıdır{}
  4. Doğrudan içinde {}olmalıdır<>
  5. Doğrudan içinde tekrar <>olacak ()(döngü)

Tüm köşeli ayraç olmayan grafikler tam olarak oldukları gibi kalmalıdır. Açık braketler yalnızca bazı tip açık braketlerle ve yakın braketli kapalı braketlerle değiştirilebilir.

Giriş her zaman bunu mümkün kılacaktır. Bu, türlerinin yoksayılması durumunda parantezlerinin doğru eşleştiği anlamına gelir. Yani, {ab<)c]geçerli bir girdidir ama ab)(cdya ab((cddeğildir.

Örnekler:

2#jd {¤>. = 2#jd (¤).
abcdef    = abcdef
(3×5+(4-1)) = (3×5+[4-1])
<<<>><<>><<<<<<>>>>>>> = ([{}][{}][{<([{}])>}])

Girişin bu şekilde doğal olarak dönüştürülmesine (dilin otomatik sözdizimi) izin verilmez.

Her zamanki gibi: en kısa kod kazanır.


Meydan okumayı anlamıyorum. Çıktı, girdi açısından ne olmalıdır?
xnor

@xnor çıktı, dört çeşit parantez haricinde, girişle aynı dize olmalıdır. Desene uyacak şekilde değiştirilmeleri gerekir.
Dirk Reichel

Ah, şimdi anlıyorum. "Olması gereken" in gerçek olması gereken şeyler olduğunu anlamadım. Açıklığa kavuşturmak için düzenleyeceğim.
xnor

1
@DirkReichel Bunun endişelenmen gereken bir şey olduğunu düşünmüyorum. Herhangi bir dilin bu özel dönüşümü doğal olarak yapabileceğini hayal edemiyorum ve olası bir durumda böyle bir dil olduğu anlamına gelir, bu tek dilde cevaplar çok ilginç olmayacaktır.
Martin Ender

2
@DirkReichel ne anlama geliyor? Sadece ASCII ile devam et. Farklı karakterler kullanmak, yalnızca ascii dillerdeki gereksiz kısıtlamaların yanı sıra zorluğa hiçbir şey katmaz.
FlipTack

Yanıtlar:


2

JavaScript (ES6), 79 bayt

s=>s.replace(/./g,c=>~(p=l.indexOf(c))?l[p&4?--k&3|4:k++&3]:c,l='([{<)]}>',k=0)

Test senaryoları


1

Lex, 132 bayt

%{
int i,o[4]={40,91,123,60};
%}
%%
[[({<] {putchar(o[i++&3]);}
[])}>] {putchar(o[--i&3]+2-!(i&3));}
%%
yywrap(){}
main(){yylex();}

27 bayt (taşınabilir lex) veya 30 bayt ( flexderleyici olarak kullanarak ) sırasıyla birkaç baytlık bir maliyetle (muhtemelen 2, 3 veya 4; kurallar biraz belirsizdir) sırayla silebilirsiniz. -llsonuçta ortaya çıkan C dosyasını bağlarken komut satırı seçeneği için cezalar . (Yani, derlemek yerine, lex brackets.l; cc lex.yy.cderlersiniz lex brackets.l; cc lex.yy.c -ll.) Bu kesinlikle bu durumda yapmaya değer bir ödünleşmedir.

1

Java, 155 bayt

a->{String s="([{<)]}>";for(int i=0,j=0,k;i<a.length;i++){k=s.indexOf(a[i]);if(k>3){a[i]=s.charAt(--j%4+4);}else if(k>-1){a[i]=s.charAt(j++%4);}}return a;}

Lambda char[]tek bir argüman gibi. Bir dizi ( s) içindeki köşeli parantezler ( ) dizisindeki konumunu depolayarak dizide dolaşırız k. Açılış veya kapanış köşeli ayraç ( s.indexAt()) olup olmadığını kontrol eder ve uygun şekilde s.charAt()ilmek yaparak yuvalama düzeyine ( ) göre uygun köşeli ayraçla değiştiririz.%4


1

Haskell, 126 bayt

b="([{<"
d=")]}>"
y=cycle
(!)=elem
f(e:c)n(x:r)|x!b=y b!!n:f(y d!!n:e:c)(n+1)r|x!d=e:f c(n-1)r|1<3=x:f(e:c)n r
f c n s=s
f" "0

İdeone üzerinde deneyin. Kullanımı:

*Main> f" "0 "<<<>><<>><<<<<<>>>>>>>"
"([{}][{}][{<([{}])>}])"

açıklama

füç argüman alır: Kapatma parantezleri için yığın olarak çalışan bir dize n, yuvalama derinliğini ve giriş dizesini saymak için bir int .

f c n "" = ""                            -- base case for recursion: input string is empty
f (e:c) n (x:r)                          -- for the current char x
   | elem x "([{<" =                     -- check if it is an opening bracket
       (cycle "([{<")!!n :               --   if so, replace it with a bracket of the current nesting depth
           f ((cycle ")]}>")!!n : e : c) --   push the matching closing bracket on the stack
               (n+1) r                   --   increase depth level and check the next char
   | elem x ")]}>" =                     -- if x is a closing bracket
       e :                               --   replace it by the closing bracket from on top of the stack
           f c (n-1) r                   --   decrement depth level and check the next char
   | otherwise     = x : f (e:c) n r     -- otherwise keep x and check the next char
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.