Você é um gerente de projeto. Um dia, um de seus programadores enlouqueceu ( não foi sua culpa ) e pegou todas as expressões na base de código e adicionou colchetes aleatórios a eles, antes de sair no local, reclamando sobre sua incompetência ( também não é sua culpa ). Isso seria uma solução fácil, no entanto, por algum motivo, você não está usando o controle de revisão ( totalmente não é sua culpa ). E, por alguma razão, nenhum dos outros programadores deseja passar por todas as expressões para corrigir os colchetes incompatíveis ( a propósito, isso não é culpa sua ). Programadores hoje em dia, você pensa consigo mesmo. Você terá que fazer isso sozinho. O horror! Essas tarefas deveriam estar abaixo de você ...
A entrada será uma linha única, que conterá um número de colchetes esquerdo ( ( [ {
) e colchetes direito ( ) ] }
). Também pode, mas nem sempre, conter comentários ( /* */
) e literais de sequência ( " "
ou ' '
) e vários números, letras ou símbolos.
Haverá pelo menos um colchete (fora de um comentário ou literal de cadeia) que não possui um oposto de corrosão (fora de um comentário ou literal de cadeia). Por exemplo, um errante }
sem um {
prior. Outro exemplo: um (
que não possui um )
depois. Seu programa substituirá por um espaço o número mínimo de colchetes necessário para fazer com que os colchetes correspondam.
Exemplos:
(4 + (2 + 3))]
==> (4 + (2 + 3))
(o colchete no final)
][][[]]
==> [][[]]
(o colchete no início)
("Hel(o!"))
==> ("Hel(o!")
(o parêntese no final)
( /* )]*/
==> /* )]*/
(o parêntese no início)
{()]
==> ()
(o colchete e o colchete)
- A entrada pode ser obtida da maneira que for mais conveniente (STDIN, argumento da linha de comando, leitura de um arquivo etc.)
- Se houver mais de uma maneira de resolver a incompatibilidade com o mesmo número de remoções, qualquer uma delas é aceitável.
- Haverá apenas incompatibilidades entre colchetes. Literais e comentários de strings sempre serão formados corretamente.
- O título vem deste tópico SO
- Nunca haverá aspas nos comentários, aspas nas aspas, comentários nos comentários ou comentários nas aspas.
Este é o código golf, portanto, o número mínimo de bytes vence. Faça perguntas nos comentários se a especificação não estiver clara.
fonte
("foo (\") bar")
)?{{(})
deveria ser{ }
ou equivalente, já que o cenário de abertura implica que o código estava trabalhando para começar e{(})
conta como colchetes incompatíveis em todas as linguagens de programação que eu conheço (ou seja, "causa estase" ??). Mas, então, eu já escrevi uma resposta, então sou tendenciosa.Respostas:
Ruby, 223 caracteres
Este acabou um pouco longo.
O que ele faz é retirar as strings e os comentários primeiro, para que não sejam contados (e os devolva mais tarde).
Em seguida, ele passa pela string caractere por caractere. Quando encontra uma chave de abertura, armazena sua posição. Quando encontra uma chave de fechamento, ela aparece em sua respectiva matriz de armazenamento de chave aberta.
Se
pop
retornarnil
(ou seja, não havia chaves de abertura suficientes), ela remove a chave de fechamento. Depois que tudo estiver pronto, ele remove os demais chaves de abertura extras (ou seja, não havia chaves de fechamento suficientes).No final do programa, ele coloca todas as strings e comentários de volta e as produz.
Ungolfed:
fonte
(("string"/*comment*/)"string"
? Se estou lendo (a versão não-gasta) corretamente, você substitui as strings e comentários pelo respectivo índice naunparsed
matriz, o que levaria a uma substituição como((12)3
e, em seguida, procurando por um índice inexistente12
(ou11
). Vejo que a versão golfada apenas usashift
, mas ela ainda não pode ter um problema semelhante?Python 3,
410322317Tenta todos os conjuntos de exclusões possíveis, começando pelos menores, até encontrar um onde os chavetas estejam equilibrados. (Com o que quero dizer totalmente corretamente equilibrado:
{{(})
produz( )
, não{(})
.)A primeira versão usou uma função de gerador recursivo, que foi muito legal, mas também muito longa. Esta versão realiza uma pesquisa simples pela primeira vez usando uma fila. (Sim, é um algoritmo fatorial de tempo. Qual é o problema?: ^ D)
fonte
C - 406
Uma tentativa em C sem usar expressões regulares.
Para compilar e executar (em uma máquina Linux):
gcc -o brackets brackets.c
./brackets "[(])"
Em casos indefinidos como [(]), ele retorna o último par de colchetes válido ()
fonte
Python 3, 320
Como a solução do DLosc, isso investiga todas as exclusões possíveis, mas usa uma estratégia recursiva de exploração e fallback que é muito mais rápida. Eu sei que a velocidade não é um critério no código de golfe e, de qualquer forma, a pesquisa exaustiva é exponencial, mas essa pode lidar com entradas como
({({({({({({({({(}}}}}}}}
em alguns segundos.fonte
O(n!!)
solução, nãoO(n!)
. (My golfe éO(n*2^n)
, em vez deO(2^n)
, porqueo
, na verdade, produz todos os padrões com atér
remoções, em vez de exatamenter
remoções fácil de corrigir, mas que custa alguns personagens..)