Równe typy wsporników

9

Na podstawie TEGO pytania.

Biorąc pod uwagę ciąg, zamień każdy nawias ()[]{}<>na nawias odpowiedniego typu, aby nawiasy pasowały do ​​siebie, a nawiasy zagnieżdżone wykonują cykl w następujący sposób:

  1. Najbardziej oddalone są ()
  2. Bezpośrednio wewnątrz ()powinno być[]
  3. Bezpośrednio wewnątrz []powinno być{}
  4. Bezpośrednio wewnątrz {}powinno być<>
  5. Bezpośrednio wewnątrz <>będzie ()ponownie (cykle)

Wszystkie znaki bez nawiasów muszą pozostać dokładnie takie, jakie są. Otwarte nawiasy można zastąpić tylko otwartymi nawiasami pewnego typu, a nawiasy zamknięte nawiasami zamkniętymi.

Wejście zawsze umożliwi to. Oznacza to, że nawiasy są poprawnie dopasowane, jeśli ich typ jest ignorowany. Tak, {ab<)c]to ważne wejście, ale ab)(cdczy ab((cdnie.

Przykłady:

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

Używanie natywnej transformacji danych wejściowych w ten sposób (automatyczna składnia języka) jest niedozwolone.

Jak zawsze: wygrywa najkrótszy kod.

Dirk Reichel
źródło
Nie rozumiem wyzwania. Jaka powinna być wydajność pod względem nakładów?
xnor
@ xnor dane wyjściowe powinny być takie same, jak dane wejściowe, z wyjątkiem czterech rodzajów nawiasów. Należy je wymienić, aby pasowały do ​​wzoru.
Dirk Reichel,
Ach, teraz rozumiem. Nie rozumiałem, że „powinno być” to rzeczy, które powinieneś sprawić, aby były prawdziwe. Będę edytować, aby spróbować to wyjaśnić.
xnor
1
@DirkReichel Nie sądzę, że powinieneś się tym martwić. Nie mogę sobie wyobrazić, że jakikolwiek język może dokonać tej konkretnej transformacji natywnie, a w mało prawdopodobnym przypadku, gdy istnieje taki język, oznacza to tylko, że odpowiedzi w tym języku nie będą bardzo interesujące.
Martin Ender,
2
@DirkReichel jaki jest sens? Po prostu trzymaj się ASCII. Używanie różnych znaków nie dodaje niczego do wyzwania poza niepotrzebnymi ograniczeniami dotyczącymi języków tylko ascii.
FlipTack,

Odpowiedzi:

2

JavaScript (ES6), 79 bajtów

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

Przypadki testowe

Arnauld
źródło
1

Lex, 132 bajty

%{
int i,o[4]={40,91,123,60};
%}
%%
[[({<] {putchar(o[i++&3]);}
[])}>] {putchar(o[--i&3]+2-!(i&3));}
%%
yywrap(){}
main(){yylex();}
Rainer P.
źródło
Możesz zapisać 27 bajtów (przenośny leksykon) lub 30 bajtów (używając flexjako kompilatora), usuwając odpowiednio ostatnie dwa lub trzy wiersze, kosztem pewnej liczby bajtów (prawdopodobnie 2, 3 lub 4; reguły są nieco niejasne) w karach za -llopcję wiersza poleceń podczas łączenia wynikowego pliku C. (To znaczy, zamiast kompilować lex brackets.l; cc lex.yy.c, kompilujesz z lex brackets.l; cc lex.yy.c -ll.) To zdecydowanie kompromis, który warto zrobić w tej sytuacji.
1

Java, 155 bajtów

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, która przyjmuje char[]argument jako pojedynczy argument. Pętlimy tablicę, przechowując jej pozycję w naszym ciągu nawiasów ( s) w zmiennej ( k). Sprawdzamy, czy jest to nawias otwierający lub zamykający ( s.indexAt()), i zastępujemy go odpowiednim nawiasiem zależnym od poziomu zagnieżdżenia ( s.charAt()), odpowiednio zapętlając%4

Xanderhall
źródło
1

Haskell, 126 bajtów

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

Wypróbuj na ideone. Stosowanie:

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

Wyjaśnienie

fprzyjmuje trzy argumenty: ciąg znaków, który działa jako stos do zamykania nawiasów, int ndla zliczania głębokości zagnieżdżenia i ciąg wejściowy.

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
źródło