Равные типы скобок

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)

Контрольные примеры

Arnauld
источник
1

Lex, 132 байта

%{
int i,o[4]={40,91,123,60};
%}
%%
[[({<] {putchar(o[i++&3]);}
[])}>] {putchar(o[--i&3]+2-!(i&3));}
%%
yywrap(){}
main(){yylex();}
Райнер П.
источник
Вы можете сохранить 27 байтов (переносимый лекс) или 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

Xanderhall
источник
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
Laikoni
источник