Chamamos um grupo de parênteses de parêntesis abertos (
, parênteses próximos correspondentes )
e tudo dentro deles.
Um grupo ou sequência de parênteses é chamado de parênteses balanceado se não contiver nada ou apenas dois grupos parênteses balanceados entre parênteses.
Por exemplo:
The string "(()())()" is parenthesly balanced
( )() Because it contains exactly 2 parenthesly balanced parens groups
()() The left one is parenthesly balanced because it contains 2 parenthesly balanced parens groups (balanced because they are empty). The right one is parenthesly balanced because it contains nothing.
Da mesma forma:
The string "(()(()))()" is not parenthesly balanced
( )() Because it contains a parens group that is not parenthesly balanced: the left one
()( ) The left one is not balanced because it contains a parens group that is not balanced: the right one
() The right one is not balanced because it only contains one balanced group.
Portanto, uma string ou grupo parensly equilibrado entre parênteses deve:
- Não contém nada.
- Ou conter apenas e exatamente 2 grupos parênteses equilibrados entre parênteses. Não deve conter mais nada.
Tarefa:
Sua tarefa é escrever uma função ou programa que verifique se uma determinada sequência é equilibrada entre parênteses ou não.
Entrada:
A entrada será uma sequência ou lista de caracteres ou algo semelhante. Você pode assumir que a sequência consistirá apenas dos caracteres '('
e ')'
. Você também pode assumir que cada um parêntese aberto (
terá seus paren perto de correspondência )
, então não se preocupe com cordas, como "((("
ou ")("
ou "(())("
...
Nota: Como mencionado por @DigitalTrauma em seu comentário abaixo, ele está ok para subtitute a ()
combinação por outros caracteres (como <>
, []
...), se é fazendo com que o trabalho adicional como escapar em algumas línguas
Resultado:
Qualquer coisa para sinalizar se a sequência está entre parênteses ou não (verdadeira ou falsa, 1 ou 0, ...). Inclua na sua resposta o que sua função / programa deverá gerar.
Exemplos:
"" => True
"()()" => True
"()(()())" => True
"(()(()(()())))(()())" => True
"(((((((()())())())())())())())()" => True
"()" => False
"()()()" => False
"(())()" => False
"()(()(())())" => False
"(()())(((((()())()))())())" => False
"()(()()()())" => False
"()(()(()())()())" => False
Os dois últimos exemplos realmente fizeram a diferença!
Boa sorte!
fonte
"(()())()"
seria representado como[0, 0, 1, 0, 1, 1, 0, 1]
. Isso eliminaria a necessidade de converter a entrada em código de caractere e subtrair.Respostas:
Japonês v2, 20 bytes
Teste online!
Todo mundo entendeu mal o desafio em primeiro lugar e, apesar de que cada par de parênteses teve que conter um mesmo número de sub-pares, quando na verdade o desafio realmente pede a 0 ou 2 sub-pares. Então, aqui está minha resposta revisada, usando a mesma técnica de antes.
Ainda podemos resolver o desafio com substituição recursiva. O problema é que, em vez de apenas remover todas as ocorrências de
()()
, precisamos garantir que não haja mais nada no mesmo invólucro além do()()
(em outras palavras, não()()()()
ou nada disso). Podemos fazer isso substituindo recursivamente(()())
por()
.O novo problema é que a entrada em si não possui um par de parênteses externos (pois isso a tornaria uma string não equilibrada entre parênteses), forçando-nos a envolvê-la em um par extra para reduzi-la completamente. Finalmente, o resultado final para seqüências de caracteres balanceadas é agora, em
()
vez da sequência vazia, portanto, verificamos a igualdade em vez de apenas tirar o NOT lógico da saída.fonte
sed 4.2.2, 30
Experimente online .
Isso retorna um código de saída do shell 1 para True e 0 para False.
fonte
Perl 5 -lp,
2422 bytesExperimente online! O link inclui casos de teste. Editar: salvou 2 bytes graças a @JoKing. Explicação: Apenas uma regex recursiva. O grupo de captura externa representa uma sequência balanceada como uma
<
seguida por uma sequência balanceada opcional seguida por uma>
, duas vezes. Observe que a maioria das outras respostas é capaz de usar()
s, mas isso custa dois bytes extras:Experimente online! O link inclui casos de teste.
fonte
<>
()
s, então não achei que fosse uma comparação justa, no entanto, vejo que a resposta da APN da @ ngn também usa<>
s, então atualizei esta.Rotina de código de máquina 6502 , 48 bytes
Espera um ponteiro para uma string em
$fb
/$fc
que deve conter apenas(
e)
. Limpa o sinalizador C (Carry) se a string for "paranthesely equilibrada", define-a de outra forma (que é um idioma típico no 6502, defina carry "on error"). Não faz nada sensato na entrada inválida.Embora o algoritmo seja recursivo, ele não se chama (o que exigiria mais bytes e tornaria a posição do código dependente), mas, em vez disso, mantém uma profundidade de recursão e usa ramificação "simples".
Desmontagem comentada
Exemplo de programa assembler C64 usando a rotina:
Demonstração online
Código na sintaxe ca65 :
fonte
V ,
21, 20 bytesExperimente online! ou Verifique todos os casos de teste!
Hexdump:
fonte
Braquilog , 28 bytes
Experimente online!
Explicação
fonte
C (gcc) , 113 bytes
Experimente online!
Explicação
Experimente online!
fonte
MATL ,
2625 bytesExperimente online!
Obrigado à resposta do @ETHProductions 'para a idéia "substituir (() ()) por ()"), e a pergunta de @JungHwan Min comenta a idéia de ver os colchetes como dígitos binários.
A saída é uma matriz vazia para a verdade, um número positivo para a falsey - que eu acho que é permitido pelo comentário do OP: "Podem ser categorias. Caso contrário, podemos adicionar,
n
no final, +1 byte, para ter 0 como saída de verdade e 1 como saída de falsey.Com comentários:
fonte
C # (.NET Core) ,
7871 bytesExperimente online!
fonte
Haskell ,
8259 bytesExperimente online!
Suponho que ele possa ser jogado muito mais longe, já que é minha primeira vez jogando golfe em haskell, portanto, quaisquer truques ou comentários são bem-vindos.
EDIT - Obrigado @nimi por salvar 23 bytes (mais de 28% da submissão original :)
fonte
()
locomovery+1
. Como funções anônimas são permitidos, você pode soltar af=
,r[0]
é uma função adequada. Coloque a baser b[]
no final e mude para uma função infix (por exemplo#
), para poder usá-lab#_=
. Você também pode alterar um pouco seu algoritmo criando a lista para verificar se0
es e2
passo a passo, em vez de carregá-lo pelas chamadas der
um acumuladorr(x:y:z) ... = x : r (...) a
com baser b [] = b
. Faça a verificação após a chamada inicialr[0]
. Ao todo, 73 bytes.foldl
(59 bytes): Experimente online! .JavaScript (ES6), 63 bytes
Recebe a entrada como uma matriz de caracteres. Retorna false para parênteses balanceado, true para não parênteses equilibrado.
Experimente online!
Comentado
Recursivo, 54 bytes
Usando substituições recursivas (como em resposta Japt da ETHproductions ) é, no entanto, significativamente menor.
Recebe a entrada como uma sequência. Retorna 1 para equilibrado entre parênteses, 0 para não equilibrado entre parênteses.
Experimente online!
Recursivo, 46 bytes
Este gera um erro de recursão para não estar entre parênteses:
Experimente online!
fonte
x[k]
é inicialmente indefinido ex[k]++
dariaNaN
, ao passo que-~undefined
dá1
.a[k]
inicialmente contém um caractere. Mas a mesma lógica se aplica às seqüências de caracteres: aplicar o++
operador sobre elas produzNaN
, mas operadores bit a bit (como~
) forçam a serem coagidos0
previamente.Perl 6 ,
43 4137 bytesTeste-o
Teste-o
Teste-o
Expandido:
fonte
R , 71 bytes
Experimente online!
Outra solução - mais longa - mas interessante para a abordagem diferente
R , 85 bytes
Experimente online!
Explicação:
Pegue a sequência de entrada e substitua:
depois avalia a expressão resultante. Se é igual a zero, é equilibrado, caso contrário, não é. O uso de
sum
é necessário apenas para manipular o caso de cadeia vazia, porque sua avaliação retornaNULL
.por exemplo
fonte
f=function(s,r=sub('(()())','()',s,f=T))'if'(r==s,s==''|s=='()()',f(r))
Wolfram Language (Mathematica) , 65 bytes
Experimente online!
fonte
05AB1E ,
181613 bytesPorto de @ETHproductions resposta Japt 's para corrigir o caso de teste
()(()()(()())(()()))
.-2 bytes graças a @Adnan .
Com base neste comentário do OP , agora uso
()
como valor verdadeiro e qualquer outra coisa como falsey. Se ambos os valores precisarem ser consistentes em vez de apenas um, seria a resposta antiga de 16 bytes (…(ÿ)…(()∞„()©:®Q
), retornando0
para1
os casos de teste truthy e falsey.Experimente online ou verifique todos os casos de teste .
Explicação
(Resposta antiga de 18 bytes que falhou no caso de teste
()(()()(()())(()()))
..):Experimente online ou verifique todos os casos de teste .
fonte
„()∞õ:g_
.(()()()())
que devem retornar falsey. Todo grupo de parênteses deve conter exatamente 0 ou 2 grupos internos.'(®')J
por…(ÿ)
.ÿ
existia, mas nunca o usei antes, esqueci completamente.APL (Dyalog Classic) , 27 bytes
Experimente online!
fonte
Prolog , 46 bytes
Experimente online!ou Verifique todos os casos de teste!
Usa listas de
l
er
como entrada, por exemplo,"()()"
é testado comof([l,r,l,r]).
.As três primeiras linhas são a gramática de cadeias válidas na sintaxe de gramática de cláusula definida do Prolog .
a(A,B).
retornatrue
quandoA
é uma lista que segue a gramática eB
está vazia. Assim, a função principalf
pega algunsX
e verifica sea(X,[])
mantém.fonte
Python 2 ,
7371 bytesExperimente online!
fonte
brainfuck, 50 bytes
Formatado:
Espera uma sequência de
(
e)
sem uma nova linha à direita e gera saída\x01
para true e\x00
false. (Para legibilidade, você pode por exemplo, adicionar 48+
s antes da final.
para torná-lo imprimir1
e0
em vez disso.)Experimente online
Isso mantém uma pilha com o número de grupos em cada profundidade, distinguindo caracteres por paridade e verificando se o número de grupos está em {0, 2} após cada parêntese próximo; se a condição não for atendida, consome o restante da entrada e define um sinalizador; depois verifica a condição novamente no final do programa.
Se for permitido encerrar o fluxo de entrada com um caractere ímpar, podemos omitir a verificação final
<[--[>->]]
para salvar 10 bytes. (E se\n
não fosse inconvenientemente uniforme, eu poderia ter proposto essa variante como a resposta principal.)(Também poderíamos economizar alguns bytes alterando o formato de saída
\x00
para verdadeiro e não\x00
falso, o que parece ser permitido (talvez acidentalmente) pela declaração do problema, como está escrita, mas, de qualquer forma, não seria muito interessante, e eu prefiro para não fazer essa alteração.)fonte
Python2,
9594 bytesExperimente online!
f () transforma a string em uma tupla aninhada, que passa para g ().
g () navega recursivamente a tupla e retorna False se algum elemento não tiver exatamente 0 ou 2 filhos.
Salvou um byte usando a formatação de string.
fonte
Stax ,
1311 bytesExecute e depure
Salvei dois bytes quando percebi que as entradas podem coincidentemente ser avaliadas implicitamente como literais de matriz. Removendo as aspas duplas, a entrada é simplificada.
A idéia geral é avaliar a entrada como uma matriz literal e mapear recursivamente os elementos para verificar o equilíbrio entre parênteses. Se a afirmação final falhar, haverá um pop subsequente em uma pilha vazia. No stax, saltar com pilhas vazias imediatamente termina o programa.
Descompactado, não jogado e comentado, é assim.
Execute este
fonte
Java 10,
99969583 bytesPorta da minha resposta 05AB1E (também retorna
()
como verdade e qualquer outra coisa como falsey).Experimente online.
Explicação:
return s;
pode serreturn"()".equals(s);
se um resultado booleano real foi necessário.fonte
!s.contains("()()(")