Рівні типи дужок


9

На основі цього питання.

Задавши рядок, замініть кожну дужку ()[]{}<>дужкою відповідного типу, щоб дужки відповідали, і вкладені дужки провели так:

  1. Зовнішні є ()
  2. Прямо всередині ()має бути[]
  3. Прямо всередині []має бути{}
  4. Прямо всередині {}має бути<>
  5. Прямо всередині <>буде ()знову (цикли)

Усі знаки, що не належать до дужок, повинні залишатися такими, якими вони є. Відкриті дужки можуть бути замінені лише відкритими дужками певного типу, а закриті дужки - із закритими дужками.

Введення завжди зробить це можливим. Це означає, що його дужки правильно підібрані, якщо їх тип ігнорується. Таким чином, {ab<)c]дійсний вхід, але ab)(cdчи ab((cdнемає.

Приклади:

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

Використання нативного перетворення введення таким чином (автоматичний синтаксис мови) не дозволяється.

Як завжди: виграє найкоротший код.


Я не розумію виклику. Яким повинен бути результат у плані введення?
xnor

@xnor вихід повинен бути таким же рядком, що і вхідний, за винятком чотирьох видів дужок. Їх потрібно замінити, щоб вони відповідали шаблону.
Дірк Рейхель

Ах, тепер я бачу. Я не розумів, що "повинно бути" - це речі, які ти повинен зробити правдою. Я відредагую, щоб спробувати зробити це зрозумілішим.
xnor

1
@DirkReichel Я не думаю, що це те, про що потрібно турбуватися. Я не можу уявити, що будь-яка мова може зробити цю специфічну трансформацію споконвічно, і, мабуть, якщо така мова існує, все це означає, що відповіді на цій мові будуть не дуже цікавими.
Мартін Ендер

2
@DirkReichel в чому сенс? Просто дотримуйтесь ASCII. Використання різних символів нічого не додає до виклику, крім зайвих обмежень для мов, що належать лише ascii.
FlipTack

Відповіді:


2

JavaScript (ES6), 79 байт

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

Тестові справи


1

Лекс, 132 байти

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

Ви можете зберегти 27 байт (портативний lex) або 30 байт (використовуючи flexяк компілятор), видаливши останні два-три рядки відповідно, витрачаючи деяку кількість байтів (можливо, 2, 3 або 4; правила дещо незрозумілі) у штрафних санкціях за параметр -llкомандного рядка при посиланні на отриманий файл C. (Тобто замість того, щоб компілювати lex brackets.l; cc lex.yy.c, ви компілюєте lex brackets.l; cc lex.yy.c -ll.) Це безумовно компроміс, який варто зробити в цій ситуації.

1

Java, 155 байт

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

Лямбда, яка приймає char[]як єдиний аргумент. Ми проводимо цикл через масив, зберігаючи його позицію в нашому рядку дужок ( s) у змінній ( k). Ми перевіряємо, чи є це кронштейн для відкривання або закриття ( s.indexAt()), і заміняємо його на відповідний кронштейн, виходячи з рівня гніздування ( s.charAt()), замикаючи відповідним чином на%4


1

Haskell, 126 байт

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

Спробуйте це на ideone. Використання:

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

Пояснення

fбере три аргументи: Рядок, який працює як стек для закриття дужок, int nдля підрахунку глибини введення та рядок введення.

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.