Os parênteses no meu teclado estão todos gastos e eu quero evitar usá-los o máximo possível. Seu desafio é equilibrar uma linha contendo parênteses, adicionando-os antes e depois de cada linha.
Isso é semelhante aos parênteses automáticos do TI-Basic e ao fechamento de cadeias (ou seja Output(1, 1, "Hello, World!
). Ele também salva bytes preciosos de um programa!
Exemplo de entrada:
This line has no parentheses
alert(Math.max(1, 2
1+1)*2).toString()
function() { alert('Hello, World!'); })(
Exemplo de saída (possível):
This line has no parentheses
alert(Math.max(1, 2))
((1+1)*2).toString()
(function() { alert('Hello, World!'); })()
Especificação:
Para cada linha de entrada,
Adicione tantos parênteses abertos ao começo e feche parênteses ao final da linha conforme necessário para equilibrar os parênteses na linha
A definição de "saldo" é:
Mesma quantidade de
(
e)
na linhaPara cada substring começando no início da string, esse substring não deve ter mais parênteses de fechamento do que parênteses de abertura
- Por exemplo,
(foo))(bar
não é equilibrado porque(foo))
tem mais parênteses de fechamento do que parênteses de abertura
- Por exemplo,
Você pode adicionar parênteses extras desnecessários, se desejar, se o código for mais curto
Você não precisa se preocupar com literais de seqüência de caracteres ou algo assim, suponha que todos os parênteses precisem ser balanceados
Saída de cada linha com parênteses balanceados
Isso é código-golfe , então o código mais curto em bytes vencerá!
fonte
()
parens, ou fazer outras faixas{}
,[]
,<>
, etc necessidade de ser considerada como bem?(
e)
.Respostas:
GolfScript, 23 bytes
A brecha que estou explorando é a decisão de que:
Basicamente, para cada linha, esse código conta o número de caracteres na linha que não estão abrindo parênteses e precede muitos parênteses de abertura extras à linha e, em seguida, faz o mesmo para fechar parênteses. Isso é incrivelmente ineficiente, mas garante que todos os parênteses na linha de saída estejam equilibrados.
Por exemplo, dada a entrada:
este programa produzirá:
Ps. Você também pode testar esse código online .
fonte
Perl, 32 = 31 + 1 ou 73 = 72 + 1 (parênteses minimizados)
32 = 31 + 1: com parênteses desnecessários extras
Editar% s:
y///
.$a
removida.É usado com a opção de tempo de execução
-p
(+1 byte).Arquivo de teste
input.txt
:Linha de comando:
ou
Resultado:
Ungolfed:
O algoritmo é simples, basta adicionar a contrapartida para cada parêntese encontrado.
73 = 72 + 1: adicionando número mínimo de parênteses
Este script adiciona apenas o número mínimo de parênteses para obter uma saída equilibrada.
É usado com a opção de tempo de execução
-p
(+1 byte).Resultado:
Ungolfed:
81 = 80 + 1: adicionando número mínimo de parênteses
Este é um método mais antigo para adicionar o número mínimo de parênteses para uma saída balanceada.
Ele usa Perl 5.14 (por causa do modificador de substituição não destrutivo) e o comutador de tempo de execução
-p
(+1 byte).Resultado:
Ungolfed:
fonte
'('x/\)/g
sempre igualar '(' ...y///
vez dem//g
para contar os parênteses.Python
2.73:626058 bytesNão é super golfista, mas você sabe. Talvez eu consiga extrair mais bytes se realmente tentei.
Para cada linha, gera
(
* o número de)
na linha, depois a linha, e)
* o número de(
na linha. Se eu entender as regras corretamente, isso sempre fornecerá uma saída válida.Sai lançando uma exceção, como resultado da maneira como inseri. (A entrada é sempre uma parte difícil desses problemas.) Se isso não for aceitável, custará alguns bytes para corrigir, embora ainda não tenha certeza de quantos.
Exemplo de saída:
fonte
python2 balanced_parenthesis.py < input.txt 2>/dev/null
obtém a saída que escrevi, mas se você quiser entrada com várias linhas ao fazê-lo interativamente, isso me custará alguns bytes. Dá-me um segundo, eu vou descobrir alguma coisa ...while 1:s=raw_input();c=s.count;print'('*c(')')+s+')'*c('(')
c=s.count
. Achei que você tinha que fazerc=s
,s.c()
. Obrigado!Pure Bash, 72 bytes
Usa o mesmo algoritmo da resposta do @ undergroundmonorail:
Resultado:
fonte