Corrija os aparelhos, etc

15

Sua missão, se você optar por aceitá-la, é adicionar o número mínimo de parênteses, colchetes e colchetes para formar uma determinada sequência (contendo apenas parênteses, colchetes e colchetes) com a correspondência correta entre colchetes. Os laços dos símbolos adicionados devem ser quebrados tendo a distância máxima entre chaves emparelhadas. Você deve retornar apenas uma resposta correta que corresponda a essas duas regras; Outros laços, caso existam, podem ser rompidos da maneira que você achar melhor.

Exemplos:

input      output
                          // Empty String is a legal input
[          []             // Boring example
[()]       [()]           // Do nothing if there's nothing to be done
({{        ({{}})         // NOT (){}{} (0 + 0 + 0). Maximum distance is 4 + 2 + 0, ({{}})
[([{])]}   {[([{}])]}     // NOT [([])]{[([])]} or similar

Você pode escrever um programa ou função , receber a entrada via STDIN como um argumento de string para sua função, que retorna a saída como uma string ou a imprime em STDOUT (ou alternativa mais próxima). Opcionalmente, você pode incluir uma única nova linha à direita na saída.

Você pode assumir que a sequência de entrada consiste apenas nos 6 caracteres a seguir (ou na falta deles): [](){}(Você não precisa oferecer suporte <>)

Este é o , o programa mais curto vence. As brechas padrão são proibidas, é claro .

durron597
fonte
Você quis repetir o título diretamente abaixo do título real ou repetir a tag diretamente acima das tags reais? Basta perguntar no caso de você copiar colado do Sandbox e esquecer de removê-los.
Rainbolt
@Rainbolt O primeiro não (sandbox), o último sim #
durron597
1
@AlexA. Eu posso ver como eles são diferentes em aspectos menores, mas acho que eles são muito parecidos para serem considerados perguntas separadas.
NinjaBearMonkey 27/05
Justo. Certamente não é fácil de cortar e secar, e não vou tentar fechá-lo se outros decidirem não fazê-lo.
NinjaBearMonkey 27/05
Eu consideraria diferente o suficiente. Votou para reabrir.
Ndscore # 28/15

Respostas:

1

Python 2-198

Eu esperava diminuir um pouco mais as compreensões, mas agora não tenho muito tempo para realmente testar diferentes maneiras de fazer as coisas.

s="()[]{}";f=s.find
def F(S):
 r=m=""
 for c in S:
    i=f(c)^1
    if i%2:m=c+m;r+=c
    else:
     for d in m:
        if d==s[i]:break
        r+=s[f(d)^1]
     else:r=s[i]+r+c
     m=m[1:]
 for c in m:r+=s[f(c)^1]
 return r

O OP não incluiu um exemplo como {[([{}])]}{[(com grupos adjacentes), mas se essa funcionalidade é ou não necessária, isso gera a saída correta{[([{}])]}{[]}

KSab
fonte
Como são esses 198 bytes?
Zacharý 01/12/16
@ZacharyT, tabs ( \t) são formatados como 4 espaços no estouro de pilha, mas na verdade estou alternando tabs e espaços (você pode fazer isso para os níveis de indentação no Python 2, não 3), então o primeiro nível é o [space]segundo e o [tab]terceiro é [tab][space]o seguinte [tab][tab]. Digitar o código com espaços me dá 227 a partir daqui mothereff.in/byte-counter , e conto 10 abas, então 227 - (3 * 10) = 197. Huh, acho que realmente super-contei 1 maneira quando eu Postou isso.
KSab
DANG! Esse é realmente um bom truque. (Digite no final da linha). Você pode combinar o loop for inferior e a instrução return return r+[s[f(c)^1]for c in m]para salvar bytes.
Zacharý
1

Haskell, 513

A função h. A versão anterior não forneceu respostas corretas para "({{)["e"({{)}}"

import Control.Monad

m '('=')'
m '['=']'
m '{'='}'
m ')'='('
m ']'='['
m '}'='{'

data B=B Char[B]|N[B]|Z B Char[B]
instance Eq B where(==)a b=q a==q b
instance Ord B where(<=)a b=q a<=q b

w(B o s)=o:(s>>=w)++[m o]
v(N k)=k>>=w
n(B _ k)=(sum$n<$>k)+1
q(N k)=sum$n<$>k

u(Z(Z g pc pk) c k)=Z g pc(pk++[B c k])
u(Z(N pk) c k)=N(pk++[B c k])
t(N k)=N k
t z=t$u z

f z c|elem c "([{"=[Z z c[]]
f z@(Z p o k) c|m c==o=[u z]|2>1=(u$Z(Z p o [])(m c)k):f(u z)c
f (N k)c=[Z(N[])(m c)k]

h s=v.minimum$t<$>foldM f(N [])s
Matt
fonte