Você deve escrever um programa ou função que use uma sequência de colchetes e produza se essa sequência é ou não totalmente correspondida. Seu programa deve imprimir um valor verdadeiro ou falso , e as E / S podem estar em qualquer formato razoável .
Regras e definições:
Para o propósito deste desafio, um "suporte" é qualquer um desses caracteres:
()[]{}<>
.Um par de colchetes é considerado "correspondente" se os colchetes de abertura e fechamento estiverem na ordem correta e não tiverem caracteres dentro deles, como
() []{}
Ou se todos os subelementos dentro dele também corresponderem.
[()()()()] {<[]>} (()())
Os subelementos também podem ser aninhados com várias camadas de profundidade.
[(){<><>[()]}<>()] <[{((()))}]>
Uma cadeia é considerada "Totalmente compatível" se e somente se:
Cada caractere é um colchete,
Cada par de suportes possui o suporte correto de abertura e fechamento e na ordem correta, e
Cada suporte é correspondido.
Você pode assumir que a entrada conterá apenas ASCII imprimível .
Teste de E / S
Aqui estão algumas entradas que devem retornar um valor verdadeiro:
()
[](){}<>
(((())))
({[<>]})
[{()<>()}[]]
[([]{})<{[()<()>]}()>{}]
E aqui estão algumas saídas que devem retornar um valor falso:
( Has no closing ')'
}{ Wrong order
(<)> Each pair contains only half of a matched element
(()()foobar) Contains invalid characters
[({}<>)> The last bracket should be ']' instead of '>'
(((())) Has 4 opening brackets, but only 3 closing brackets.
Como de costume, esse é um código de golfe, então as brechas padrão se aplicam e a resposta mais curta em bytes vence.
fonte
[}
uma partida? E se não, onde é excluído por essas regras?Each pair of brackets has the correct opening and closing bracket and in the right order.
Respostas:
05AB1E , 19 bytes
A entrada é dada entre aspas . Código:
Bem, porcaria, muitos bugs e recursos não implementados foram encontrados. Explicação:
Esta é realmente uma parte complicada. O que isso parece no pseudocódigo é:
Isso é coberto por esta parte do código 05AB1E :
Como você pode ver, isso é uma substituição infinita (feita até que a string não mude mais). Portanto, não preciso me preocupar em definir a substituição em um loop, pois isso já está embutido. Depois disso:
Usa a codificação CP-1252 . Experimente online! (ligeiramente modificado porque a versão acima está obsoleta).
fonte
õ
foi adicionado antes ?Flak cerebral ,
1101, 1085, 981 bytesExperimente online!
Trata-se de 980 bytes de código-fonte e
+1
para o-a
sinalizador que permite entrada ASCII (mas saída decimal)Esta é uma resposta que tenho vontade de escrever há muito, muito tempo. Pelo menos 6 meses. Eu esperei para postar isso porque sabia que responder a esse desafio seria muito difícil no cérebro. Mas vale a pena por uma razão muito importante: o código-fonte em si é uma entrada verdadeira, que é o ponto inteiro dessa própria linguagem.
E, como escrevi aqui , essa pergunta foi o que me inspirou a escrever ataques cerebrais.
Essa resposta levou aproximadamente duas horas para ser escrita. Admito que o jogo é muito ruim, principalmente porque muito do código é repetido para cada tipo de colchete. Mas estou bastante surpreso por ter conseguido escrever uma resposta, especialmente porque o Brain-Flak é um
Vou tentar jogar no golfe mais tarde, mas queria divulgá-lo de qualquer maneira.
Eu tenho uma explicação detalhada, mas tem cerca de 6 mil caracteres, então acho que não seria sensato colar a coisa toda nessa resposta. Você pode ler aqui se quiser. Vou adicionar uma explicação mais curta aqui.
A idéia básica é repetir as seguintes etapas para cada caractere na pilha:
Verificamos cada caractere para ver se ele combina com qualquer colchete. Se for um colchete de abertura, colocamos um número na outra pilha de acordo com o seguinte mapeamento:
Em seguida, verificamos se ele corresponde a qualquer colchete de fechamento. Se isso acontecer, colocamos o número equivalente na pilha alternativa, assim como nos colchetes de abertura. Em seguida , verificamos se os dois primeiros números são iguais. Se estiverem, os dois serão acionados e o programa continuará normalmente. Caso contrário, limpamos as duas pilhas (para interromper o loop) e colocamos uma na pilha alternativa. Esta é essencialmente uma declaração de "interrupção".
Depois de verificar os 8 tipos de colchetes, pressionamos o valor dessa execução pelo loop. Como zeramos a maior parte, os únicos trechos que têm algum valor são os condicionais quando comparamos com colchetes. Portanto, se qualquer colchete for correspondido, o loop inteiro terá o valor 1. Se nenhum deles tiver, o loop inteiro terá o valor 0. Nesse caso, limparemos as duas pilhas e empurraremos 0 na pilha alternativa. Novamente, isso é como uma declaração de "interrupção".
Após a execução desse loop principal, o restante é bastante simples. Estamos na pilha principal (vazia) e a pilha alternativa está vazia (se os colchetes foram correspondidos) ou não está vazia se não estiver. Então, executamos isso:
Isso colocará 0 ou 1 na pilha principal e, quando o programa terminar, será impresso implicitamente.
Agradecemos ao @WheatWizard por apresentar um bom snippet "igual" e "lógico não" limpo de pilha, e por atualizar regularmente o wiki do github com exemplos úteis.
Obrigado a @ ASCII-only por escrever um metagolfer inteiro online que ajudou imensamente a escrever este programa
revisões
Removida alguma redundância push pop
Mudou minha lógica de contador zero
fonte
Brain-Flak ,
204196190 bytesExperimente online!
-8 bytes graças ao Assistente de Trigo. -6 bytes graças a Jo King.
Explicação
Este programa armazena os códigos de caracteres de todos os colchetes não fechados atuais na segunda pilha. Os pares suporte
<>
,[]
e{}
cada um tem códigos de caracteres que diferem por exatamente 2, por isso não há necessidade de verificá-los especificamente. O par()
difere apenas de 1; portanto, verificamos(
especificamente e diminuímos efetivamente esse byte (na verdade, incrementamos todos os outros bytes) antes de continuar.fonte
([{}]<>({}))((){[()](<{}>)}{})
({<>[()]}())
a -6 bytesJavaScript (ES6),
5250 bytesRemova repetidamente os colchetes até o resultado ser o mesmo do original e, em seguida, retorne false, a menos que a sequência esteja vazia.
Editar: salvou 2 bytes graças a @ edc65.
fonte
Retina, 20 bytes
Experimente online
fonte
CJam,
25242321 bytesAgradecimentos ao Sp3000 por salvar 2 bytes.
Obrigado a jimmy23013 por salvar 2 bytes.
Suíte de teste.
Trabalha essencialmente o mesmo que as outras respostas: que repetidamente remover
()
,[]
,<>
e{}
da corda e verificar se vamos acabar com a cadeia vazia. Para evitar ter que verificar quando terminamos, removemos os pares deN
vezes em queN
é o comprimento da string, o que sempre é suficiente (já que cada iteração remove pelo menos dois caracteres, a menos que terminemos). Fico feliz em ver que isso não bate em Retina. :) (Embora Pyth ou Jelly possam ...)Há um truque divertido de golfe aqui: para obter a sequência
()<>[]{}
, usamos o seguinte:O,
{()<>}
é apenas um bloco (ou seja, uma função), que contém os outros colchetes como código. Coma
nós envolvemos o bloco em uma matriz. O`
stringification que array, que dá"[{()<>}]"
. Finalmente, classificamos a string com$
, que reorganiza os colchetes para()<>[]{}
.fonte
()<>[]{}`
que funcionaria tão bem e teria o mesmo número de bytes, certo?()<>
existem quatro operadores (decremento, incremento e, em seguida, comparação ou truncamento, dependendo dos operandos), que seriam executados imediatamente, enquanto{}
denota um bloco (o equivalente a uma função do CJam), ou seja, um pedaço de código que é apenas pressionado na pilha sem avaliá-la imediatamente. É por isso que eu preciso{}
agrupar o()
e<>
, mas usara
para colocar tudo em uma matriz é menor que[...]
.Python, 67 bytes
Gera e avalia uma expressão que se parece com
e verifica se o resultado está vazio.
O Sp3000 salvou 8 bytes apontando que
[],(),{}
pode ser substituído sem aspas porque são objetos Python e que dois parênteses eram desnecessários.fonte
Yacc, 119 bytes
Não usa regex / substituir.
Ungolfed
Compilação
Uso
fonte
Pitão,
312524 bytesJogou até 25 bytes graças ao FryAmTheEggMan Removido 1 byte
Experimente aqui: suíte de testes !
Eu ainda sou um novato Pyth, qualquer ajuda é apreciada.
Explicação
BTW, parabéns à outra resposta Pyth (que atualmente é 20 bytes)
fonte
Vz=:z"<>|\[]|{}|\(\)"k;!z
. Particularmente, você basicamente nunca precisará usarl
se realmente não precisa do número e=
adivinha automaticamente a primeira variável usada em uma expressão. Deixe-me saber se você gostaria de me explicar qualquer outra coisa no chat Pyth :)l
era desnecessário, é bom saber. No começo, declarei uma função porque minha lógica era diferente e esqueci de removê-la. Devo incluir sua resposta à minha? (Eu sou um novato>. <)Pitão, 20 bytes
Experimente online: Conjunto de Testes
Repetidamente remove ocorrências de
[]
,()
,<>
e{}
por meio de separação e a re-fusão. Verifica se a sequência resultante está vazia ou não.fonte
Javascript ES6, 54 bytes
Usa uma implementação de substituição recursiva. Simples o suficiente.
fonte
Regex (sabor PCRE),
4137 bytesApenas uma solução padrão com regex recursivo.
Obrigado jimmy23013 por remover 4 bytes
fonte
Perl,
3433 bytesInclui +2 para
-lp
Execute com entrada no STDIN:
brackets.pl
:Localiza o primeiro par de colchetes sem nada entre eles e o remove enquanto houver. Em seguida, verifica se a sequência final está vazia.
fonte
s/\(\)|\[]|<>|{}//&&redo;$_=!$_
funcionaria? :)Flak cerebral , 204 bytes
Experimente online!
Não é tão curto quanto a resposta de Nitroden , mas usa uma abordagem muito diferente. Este percorre a entrada repetidamente, removendo pares de colchetes correspondentes a cada vez até que não sobrem mais. Nesse ponto, se houver algo sobrando na pilha, a sequência não foi totalmente correspondida.
Explicação:
fonte
Brainfuck, 132 bytes
Formatado:
Espera entrada sem uma nova linha à direita. Imprime
\x00
para falso e\x01
verdadeiro.Experimente online.
Abordagem: mantenha uma pilha começando com
\x01
e empurre o suporte de fechamento correspondente sempre que um suporte de abertura for encontrado. Antes de verificar se o caractere atual é um colchete de abertura, verifique primeiro se é igual ao colchete de fechamento na parte superior da pilha e, se for o caso, solte-o. Se não for o suporte de fechamento adequado nem o suporte de abertura, consuma o restante da entrada enquanto move o ponteiro para a direita. No final, verifique se o ponteiro está ao lado da inicial\x01
.fonte
Grime v0.1, 34 bytes
Imprime
1
para uma correspondência e0
sem correspondência. Experimente online!Explicação
Grime é minha linguagem de correspondência de padrões 2D projetada para esse desafio ; também pode ser usado para corresponder a cadeias 1D. Esta é a minha primeira resposta com isso. Modifiquei o Grime hoje, mas apenas para alterar o caractere de um elemento da sintaxe (em
`
vez de,
), para que não afete minha pontuação.fonte
Reng v.3.3, 137 bytes, não-competidor
Experimente aqui!
Há um pouco mais de golfe a ser feito, mas pelo menos funciona. Eu adicionei um comando
ð
para acompanhar as pilhas após esse desafio para que isso seja possível / facilmente remotamente. Vou explicar isso daqui a pouco, mas geralmente acompanha todas as strings repetidas e procura repetições; se houver uma repetição, a sequência será irredutível. Caso contrário, a cadeia será reduzida para a cadeia / pilha vazia e será gerada1
. Caso contrário, nenhuma saída será produzida.fonte
PowerShell v2 +,
6362 bytesNão é possível capturar o JavaScript, mas atualmente está superando os outros não-esolangs.
Abordagem semelhante como outras respostas: um loop simples que continua contanto que pode remover um dos
[]
,()
ou<>
(com vários caracteres estranhos porque precisamos escapar os especiais regex). Usamos$b
como auxiliar ao longo do caminho para lembrar como nosso loop anterior$a
foi definido. Uma variável não inicializada é$null
, portanto, a primeira vez que o loop é encontrado,$a
obviamente não é igual a$null
.No final do loop,
$a
está vazio ou não, e o Boolean-not dessa sequência éTrue
ouFalse
.Exemplo
fonte
C,
121122114 bytesRaspada de 8 bytes graças a @xsot!
Usa uma pilha.
fonte
c%7&2
. Na verdade, você não precisak
. Em vez disso, você pode simplesmente incrementari
onde você modificaria,k
pois você precisa verificar se,i
eventualmente, é zero. Algo como isto (código não testado):a[99],i;main(c){for(;read(0,&c,1);c%7&2?i+=a[i--]^c/9:(a[++i]=c/9))i+=!strchr("()[]{}<>",c);putchar(48+!i);}
.a[99],i,k;main(c){for(;read(0,&c,!k);c%7&2?k|=a[i--]^c/9:(a[++i]=c/9))k|=!strchr("()[]{}<>",c);putchar(48+!i*!k);}
a[99],i;main(c){for(;read(0,&c,1);c%7&2?i+=a[i]^c/9?1:-1:(a[++i]=c/9))i+=!strchr("()[]{}<>",c);putchar(48+!i);}
Mas isso ainda não funciona para entradas como()))
, pois "popping" da pilha não zera os valores na matriz.Java 7,
156151 bytesNão estou esperando que isso ganhe nenhum prêmio, mas ainda não vi uma resposta em Java. Além disso, gosto de espreitar o PPCG e gostaria de poder votar / comentar outras respostas.
A entrada é fornecida como parâmetros do programa. Isso segue o mesmo formato de muitas outras respostas aqui, na medida em que pré-forma uma substituição de regex em um loop. Originalmente, eu tinha o loop N vezes em que N é o comprimento da string original, mas o loop
Integer.MAX_VALUE
é menor:]. Isso deve estar ok, porqueInteger.MAX_VALUE
é o comprimento máximo de umString
em Java, portanto há uma suposição implícita de que o comprimento da entrada é algo que pode ser manipulado pelo Java. O tempo de execução é muito ruim (levou cerca de 20 minutos no meu lappytop) por conta do loop, mas não vi nenhuma restrição sobre isso.fonte
Haskell , 151 bytes
Experimente online!
fonte
(#)
precisa ser chamada com a string vazia como segundo argumento, você precisa contar(#"")
para a contagem de bytes. Também apenasTrue
eFalse
são consideradas verdadeiras / falsas, consulte o Guia de Regras de Golfe .a:x#b:y|a==b=x#y
, reduzindo os bytes para 113: Experimente online!Python 2.7, 96 bytes
fonte
Python 2, 80 bytes
fonte
Julia, 51 bytes
O menos insano de várias opções. Sem surpresa, aproveitar o poder do regex é o caminho mais curto para a correspondência de cadeias, mas isso realmente só se aplica se o padrão a corresponder for regular. Tentar fazer padrões recursivos PCRE acaba aumentando o tamanho do código, verificando se a sequência inteira é a correspondência ou ancorando as extremidades e criando uma construção para especificar o corpo interno da recursão de regex. Nenhum dos quais é bonito ou propício para codificar golfe.
Explicação:
A função remove repetidamente pares adjacentes de parênteses de seu único argumento e retorna true se puder derivar uma string vazia dessa maneira.
fonte
sed,
3936 bytes (34 para código, 2 para -r)Experimente online!
versão sed do que parece ser a abordagem padrão. Requer expressões regulares estendidas (
sed -r
)Economizou 3 bytes graças ao vacas charlatão
fonte
a
é:a
eta
para salvar bytesq
partir/./
e deixar cair as chaves lá também. Experimente online! Isto é por causa de comoc
hange funciona05AB1E, 9 bytes
A entrada é dada entre aspas.
Experimente online!
Explicação:
fonte
Clojure, 153 bytes
Respostas mais longas que C e Brainfuck:
Não usa regex, em vez disso, usa o primeiro caractere para determinar qual é a marca de fechamento e localiza o primeiro índice em que esse colchete está balanceado (a soma acumulada é zero). Em seguida, verifica iterativamente se o que está entre colchetes e depois entre colchetes é válido.
Tenho que ver se existe uma abordagem melhor ...
fonte
Lua , 295 bytes
Versão Ungolfed
Experimente online!
fonte
Japt v2.0a0
-!
, 16 bytesTente
fonte
R, 298
A abordagem aqui é converter a sequência em código R e, em seguida, tente analisá-la e avaliá-la. Se isso der um erro, retorne
FALSE
.Mas há um pequeno problema ... As regras de R para colchetes são diferentes, então
<
e>
não são suportes em tudo, e os outros tipos têm regras próprias. Isso é resolvido por uma abordagem revolucionária - uma função de chiado, cuja única função é sinalizar um erro se a cabeça e a cauda chiarem de maneiras diferentes.Por exemplo,
[]
é transformado emS('[', {}, ']')
, onde S é definido como ...Como o chiado da cabeça e o chiado da cauda correspondem, nenhum erro é gerado.
Alguns outros exemplos (a parte esquerda é uma sequência de colchetes e a parte direita é sua transformação em código R válido que pode ser avaliado):
Algumas outras seqüências de colchetes resultarão em erros de análise:
Portanto, a parte restante apenas captura os erros e retorna FALSE, se houver, e TRUE, se não houver.
O código legível por humanos:
Aplicando-o em casos de amostra:
fonte