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


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

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


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.