Các loại khung bằng nhau


9

Dựa trên câu hỏi NÀY .

Đưa ra một chuỗi, thay thế mỗi dấu ngoặc ()[]{}<>bằng một dấu ngoặc của loại thích hợp sao cho dấu ngoặc khớp và chu kỳ ngoặc được lồng như sau:

  1. Những người ngoài cùng là ()
  2. Trực tiếp bên trong ()nên[]
  3. Trực tiếp bên trong []nên{}
  4. Trực tiếp bên trong {}nên<>
  5. Trực tiếp bên trong <>sẽ là ()một lần nữa (chu kỳ)

Tất cả các ký tự không dấu ngoặc phải giữ chính xác như hiện tại. Dấu ngoặc mở chỉ có thể được thay thế bằng dấu ngoặc mở của một số loại và đóng ngoặc với dấu ngoặc đóng.

Đầu vào sẽ luôn luôn làm điều này có thể. Điều này có nghĩa là dấu ngoặc của nó khớp chính xác nếu loại của chúng bị bỏ qua. Vì vậy, {ab<)c]là một đầu vào hợp lệ, nhưng ab)(cdhoặc ab((cdkhông.

Ví dụ:

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

Không được phép sử dụng chuyển đổi gốc của đầu vào theo cách này (cú pháp tự động của ngôn ngữ).

Như mọi khi: mã ngắn nhất sẽ thắng.


Tôi không hiểu thử thách. Đầu ra phải là gì về đầu vào?
xnor

@xnor đầu ra phải là cùng một chuỗi như đầu vào, ngoại trừ bốn loại dấu ngoặc. Chúng cần được thay thế để phù hợp với mô hình.
Dirk Reichel

À, giờ tôi hiểu rồi. Tôi đã không hiểu rằng "nên là" là những điều bạn phải làm là đúng. Tôi sẽ chỉnh sửa để cố gắng làm cho nó rõ ràng hơn.
xnor

1
@DirkReichel Tôi không nghĩ đó là điều bạn cần lo lắng. Tôi không thể tưởng tượng rằng bất kỳ ngôn ngữ nào cũng có thể thực hiện chuyển đổi cụ thể này, và trong trường hợp không chắc là có một ngôn ngữ như vậy, tất cả điều đó có nghĩa là câu trả lời trong ngôn ngữ đó sẽ không thú vị lắm.
Martin Ender

2
@DirkReichel điểm gì? Chỉ cần gắn bó với ASCII. Sử dụng các ký tự khác nhau không thêm gì vào thử thách ngoài những hạn chế không cần thiết đối với các ngôn ngữ chỉ có ascii.
FlipTack

Câu trả lời:


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)

Các trường hợp thử nghiệm


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();}

Bạn có thể lưu 27 byte (lex di động) hoặc 30 byte (sử dụng flexlàm trình biên dịch) bằng cách xóa hai hoặc ba dòng cuối cùng, với chi phí là một số byte (có thể là 2, 3 hoặc 4; các quy tắc có phần không rõ ràng) trong các hình phạt cho -lltùy chọn dòng lệnh khi liên kết tệp C kết quả. (Đó là, thay vì biên dịch với lex brackets.l; cc lex.yy.c, bạn biên dịch với lex brackets.l; cc lex.yy.c -ll.) Đó chắc chắn là một sự đánh đổi đáng để thực hiện trong tình huống này.

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 đó là một char[]đối số duy nhất. Chúng tôi lặp qua mảng, lưu trữ vị trí của nó trong chuỗi ngoặc ( s) trong một biến ( k). Chúng tôi kiểm tra xem đó là một khung mở hay đóng ( s.indexAt()) và thay thế nó bằng khung thích hợp dựa trên mức độ lồng nhau ( s.charAt()) của nó, lặp lại một cách thích hợp với%4


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

Hãy thử nó trên ideone. Sử dụng:

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

Giải trình

fnhận ba đối số: Một chuỗi hoạt động như ngăn xếp để đóng ngoặc, một int nđể đếm độ sâu lồng nhau và chuỗi đầu vào.

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.