Jenis braket yang sama

9

Berdasarkan pertanyaan INI .

Diberikan string, ganti setiap braket ()[]{}<>dengan braket dari jenis yang sesuai sehingga kurung cocok, dan siklus kurung bersarang sebagai berikut:

  1. Yang paling luar adalah ()
  2. Langsung di dalam ()seharusnya[]
  3. Langsung di dalam []seharusnya{}
  4. Langsung di dalam {}seharusnya<>
  5. Langsung di dalam <>akan ()lagi (siklus)

Semua karakter non-braket harus tetap seperti apa adanya. Kurung terbuka hanya dapat diganti dengan kurung terbuka jenis tertentu, dan kurung tutup dengan kurung dekat.

Masukan akan selalu memungkinkan ini. Ini berarti tanda kurungnya cocok dengan benar jika tipenya diabaikan. Jadi, {ab<)c]adalah input yang valid, tetapi ab)(cdatau ab((cdtidak.

Contoh:

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

Penggunaan pengubahan input asli dengan cara ini (sintaksis bahasa secara otomatis) tidak diizinkan.

Seperti biasa: kode terpendek menang.

Dirk Reichel
sumber
Saya tidak mengerti tantangannya. Apa yang harus menjadi output dalam hal input?
xnor
@ xnuntuk output harus berupa string yang sama seperti input, kecuali untuk empat jenis kurung. Mereka perlu diganti agar sesuai dengan polanya.
Dirk Reichel
Ah, sekarang saya mengerti. Saya tidak mengerti bahwa "seharusnya" adalah hal-hal yang seharusnya Anda jadikan benar. Saya akan mengedit untuk mencoba membuatnya lebih jelas.
xnor
1
@DirkReichel Saya tidak berpikir itu adalah sesuatu yang perlu Anda khawatirkan. Saya tidak dapat membayangkan bahwa bahasa apa pun dapat melakukan transformasi spesifik ini secara asli, dan jika tidak ada bahasa seperti itu, semua yang dimaksud adalah bahwa jawaban dalam bahasa itu tidak akan terlalu menarik.
Martin Ender
2
@DirkReichel apa gunanya? Tetap dengan ASCII. Menggunakan karakter yang berbeda tidak menambah tantangan selain dari pembatasan yang tidak perlu pada bahasa ascii saja.
FlipTack

Jawaban:

2

JavaScript (ES6), 79 byte

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

Uji kasus

Arnauld
sumber
1

Lex, 132 byte

%{
int i,o[4]={40,91,123,60};
%}
%%
[[({<] {putchar(o[i++&3]);}
[])}>] {putchar(o[--i&3]+2-!(i&3));}
%%
yywrap(){}
main(){yylex();}
Rainer P.
sumber
Anda dapat menyimpan 27 byte (lex portabel) atau 30 byte (menggunakan flexsebagai kompiler) dengan menghapus masing-masing dua atau tiga baris terakhir, dengan biaya sejumlah byte (mungkin 2, 3 atau 4; aturannya agak tidak jelas) dalam penalti untuk -llopsi baris perintah saat menautkan file C yang dihasilkan. (Yaitu, alih-alih mengkompilasi dengan lex brackets.l; cc lex.yy.c, Anda mengkompilasi dengan lex brackets.l; cc lex.yy.c -ll.) Itu pasti tradeoff layak dibuat dalam situasi ini.
1

Java, 155 byte

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 yang mengambil char[]argumen tunggal. Kita memutar melalui array, menyimpan posisinya di string tanda kurung ( s) dalam variabel ( k). Kami memeriksa apakah itu braket pembuka atau penutup ( s.indexAt()), dan menggantinya dengan braket yang sesuai berdasarkan tingkat sarangnya ( s.charAt()), dilingkarkan dengan tepat dengan%4

Xanderhall
sumber
1

Haskell, 126 byte

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

Cobalah di ideone. Pemakaian:

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

Penjelasan

fmengambil tiga argumen: Sebuah string yang berfungsi sebagai tumpukan untuk menutup tanda kurung, sebuah int nuntuk menghitung kedalaman bersarang dan string input.

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
Laikoni
sumber