Esse foi um de uma série de desafios que antecederam o aniversário de Brain-Flak. Saiba mais aqui .
Desafio
Para esse desafio, seu objetivo será encontrar o primeiro par de colchetes correspondentes em uma sequência de ()[]{}<>
colchetes totalmente compatível . Para emprestar a definição de DJMcMayhem de uma sequência totalmente correspondente:
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 string é considerada "Totalmente correspondida" se, e somente se, cada par de colchetes tiver o colchete de abertura e fechamento correto na ordem correta.
Entrada
A entrada consistirá em uma única string não vazia ou matriz de caracteres contendo apenas os caracteres ()[]{}<>
e é garantida uma correspondência completa. Você pode tirar a entrada de qualquer forma razoável que corresponde com os nossos I / O padrão .
Saída
A saída do seu programa ou função será o índice do suporte que fecha o primeiro. A saída deve ser 0
ou 1
indexada. Novamente, a saída pode ser de qualquer forma razoável que corresponde com os nossos I / O padrão .
Casos de teste
Input 0-indexed 1-indexed
() 1 2
(<>) 3 4
<[]{<>}> 7 8
{}{}{}{} 1 2
[[]<>[]] 7 8
Isso é código-golfe , o menor número de bytes vence!
Respostas:
V , 4 bytes
Experimente online!
Isso, diferentemente da maioria das respostas em V, usa indexação 0. Estou extremamente orgulhoso dessa resposta e de quão longe meu idioma chegou. Explicação:
fonte
Brain-Flak ,
685, 155, 151, 137 bytesExperimente online!
136 bytes de código, mais um byte para
-a
. Um indexado.530 bytes jogados fora! Esse é provavelmente o maior golfe que já fiz.
14 bytes salvos graças a Riley!
Isso abusa de uma fórmula dos parênteses de abertura / fechamento: se você pegar os valores ASCII, aumente em um e o módulo 4, os abridores (
({[<
) sempre obterão0
ou1
, enquanto os fechos ()}]>
) sempre obterão 2 ou 3.Explicação:
fonte
n-1&2
/n+1&2
/-n&2
oun%7&2
distinguir abertura e colchetes de fechamento ...&2
, mas vou investigar.0
/1
e2
/3
... embora agora que eu veja, você esteja apenas diminuindo se positivo. Um truque legal, bem :-)(TOS+1)%4
pode ser mais curto: Experimente online!05AB1E ,
17 1610 bytes-1 graças à carusocomputação
-6 obrigado a Adnan por sua incrível percepção de que "depois de incrementar, o segundo último bit é 0 para um colchete de abertura e 1 para um colchete de fechamento"
Experimente online!
fonte
žu
parece utilizável aqui.žu8ÝÈÏ
então, não, não realmente lol. Na melhor das hipóteses, ainda serão 5 bytes. Eu estava pensando mais em dividir os pares de chaves e removê-las até restar apenas um par, incrementar o contador em 2 para cada par removido. Não tenho idéia se isso é menos. Experimentando atm.Ç>2&<.pO0k
.0
para um colchete de abertura e1
para um colchete de fechamento.Vim, 23 bytes
Experimente online!
Estou muito triste com esta resposta. Esta solução é lindamente elegante e curta, mas, por padrão, o vim não considera
<
e>
deve ser correspondido, portanto, preciso de 13 bytes de código padrão . Caso contrário, isso seria apenas 10 bytes.Eu teria postado uma resposta em V, mas isso seria apenas um byte mais curto, ou seja, mudar
Vr
paraÒ
, já queVr
é um idioma comum para o vim.Isso é indexado em 1, mas pode ser modificado trivialmente para ser indexado em 0, alterando o
1
para a0
.fonte
Geléia ,
11109 bytesExperimente online!
Explicação
A idéia aqui era encontrar uma "fórmula mágica" capaz de distinguir os colchetes de abertura e fechamento. Eu originalmente usei
O%7&2
(ou seja, "pegue o código ASCII, módulo 7, bit a bit e 2"), mas o @ETHproductions sugeriuO’&2
(que substitui o módulo 7 por um decréscimo); ambos retornam 0 para um tipo de suporte e 2 para o outro. Subtrair 1 (’
) transformará esses resultados em -1 e 1.O restante do código é
+\
.+\
produz uma soma cumulativa. Se um conjunto de colchetes for correspondido corretamente, ele conterá o mesmo número de -1s e 1s, ou seja, sua soma acumulada será 0. Então, basta retornar o índice do primeiro 0 na lista resultante; nós podemos fazer isso comi0
.fonte
b*2%7>3
Retina ,
2624 bytesExperimente online!
O resultado é baseado em 1.
Explicação
Uma solução Retina muito diferente, baseada essencialmente em um único (e muito legível ...) regex. Isso usa uma nova técnica que eu descobri ontem para combinar seqüências equilibradas usando grupos de balanceamento .
Encontre (
M
) e retorne (!
) todas as correspondências da expressão regular^.(?<-1>([[({<])*.)*
. Essa regex ignora o primeiro caractere da sequência e usa grupos de balanceamento para acompanhar a profundidade do aninhamento. Qualquer[({<
aumento da profundidade (monitorado por grupo1
) e qualquer outro caractere diminui a profundidade (em princípio, isso.
permite que a profundidade seja diminuída abrindo colchetes também, mas como a regex é correspondida avidamente, o backtracker nunca tentará isso ) O truque estranho é que o(?<-1>...)
grupo fechado1
que funciona porque o popping de um grupo de balanceamento acontece no final do grupo. Isso economiza dois bytes sobre a abordagem padrão no formulário((open)|(?<-2>close))*
. A correspondência necessariamente para no colchete que fecha o primeiro, porque a ignoramos, por isso não é contabilizado na profundidade da pilha (e a profundidade da pilha não pode ficar negativa).A duração dessa correspondência é o índice baseado em 0 do suporte que estamos procurando.
Basta contar o número de correspondências vazias nessa sequência. O regex vazio sempre corresponde mais uma vez do que os caracteres na string, portanto, isso nos fornece o índice baseado em 1 do colchete que estamos procurando.
fonte
Retina , 24 bytes
Experimente online!
Isso é inspirado na solução de Martin Ender .
Explicação
A primeira linha é um regex que corresponde a um caractere seguido por uma string balanceada até o final da string principal (para uma explicação detalhada de como os grupos de balanceamento são usados nessa regex, consulte a resposta de Martin). Como as expressões regulares procuram correspondências da esquerda para a direita, este encontrará o subfixe adequado mais longo e equilibrado, ou seja, tudo depois do colchete que fecha o primeiro, além do próprio colchete.
A linha a seguir está vazia, portanto substituímos a correspondência por uma sequência vazia, o que significa que agora precisamos contar apenas os caracteres restantes para obter o resultado desejado (indexado a 0).
A última linha vazia conta o número de correspondências da cadeia vazia na cadeia, que é um a mais que o número de caracteres na cadeia, equivalente ao resultado indexado em 1.
fonte
Perl 5 , 28 bytes
Economizou 6 bytes usando apenas em
.
vez de[>})\]]
, da resposta Retina de Martin Ender .27 bytes de código +
-p
sinalizador.Experimente online!
Regex recursiva, que bela invenção.
A regex procura um colchete de abertura (
[<{([]
), seguido por chamada reccursiva (?0
), seguido por um colchete de fechamento (.
). Tudo isso de forma não avidamente (+?
), para que corresponda o mais curto possível desde o início. O índice do final da partida é a resposta, e como acontece, ele pode ser encontrado em$+[0]
.fonte
JavaScript (ES6),
555352 bytesGuardado 1 byte graças a @Adnan
Para cada colchete de abertura, usar seu código de char mod 4 nos dá 0 ou 3; para os colchetes de fechamento, ele nos fornece 1 ou 2. Portanto, podemos distinguir entre colchetes de abertura e fechamento negando o código de char do colchete (que inverte os bits e subtrai 1) e obtendo o segundo bit menos significativo; isto é,
n&2
.fonte
n-1&2
,-n&2
também funciona?C,
757256555445 bytesVeja como funciona online .
Se você deseja que a saída seja indexada em 1 em vez de indexada em 0, substitua a última
0
por1
.fonte
Python 2.7 + Numpy,
8579 bytesMinha primeira tentativa no código de golfe:
fonte
Brain-Flak , 97 bytes (96 para código, 1 para sinalizador)
Corra com a
-a
bandeira.Experimente online!
Explicação:
Apenas funciona, ok.
fonte
Retina , 34 bytes
Experimente online!
O resultado é baseado em 0.
Explicação
Substitua o primeiro caractere por a
!
. Isso faz com que o suporte que procuramos seja incomparável.Converta parênteses, colchetes e colchetes em colchetes angulares. Como a string é garantida para ser totalmente correspondida, não nos importamos com os tipos reais, e isso salva alguns bytes na próxima etapa.
Repetidamente (
+
) substitua cada caractere em todas as correspondências de<!*>
com!
s. Ou seja, combinamos pares de colchetes que não contêm mais colchetes não processados e os transformamos em outros pontos de exclamação. Isso transformará a cadeia inteira, exceto o colchete de fechamento incomparável, em pontos de exclamação.Contar o número de pontos de exclamação iniciais, que é igual à posição com base em 0 do primeiro ponto de exclamação (ou seja, o colchete sem correspondência). As
\G
âncoras combinam cada uma com a anterior, e é por isso que isso não conta os!
s após o referido colchete.fonte
(?!(2))
é justo(?!2)
. Você provavelmente quis dizer(?(2)(?!))
ou(?2)!)
. Você também esqueceu de escapar de um]
e o final+
precisa ser*
.PHP, 116 bytes
Versão Online
fonte
<?php
?Python , 76 bytes
Função recursiva que usa o 2º LSB ordinal como um sinalizador para o truque de abertura versus fechamento usado por muitos encontrados por Adnan (e provavelmente outros). Cauda bate quando a soma acumulada de
-1
para aberto e1
para próximo atinge zero. O índice é mantido em uma variável, pois é mais barato em bytes do que em usolen(r)
, a indexação é baseada em 1.Experimente online!
fonte
Ruby,
3534 bytesCom base na resposta Perl5 da Dada . A saída é indexada em 1. Requer que o interpretador Ruby seja chamado com a
-n
opção (while gets
loop implícito ).Edit: Isso também é
3534 bytes, mas é outro possível ponto de partida para reduzir ainda mais essa resposta.Edit2: Removidos espaços desnecessários depois
p
.Edit3: Mais algumas respostas de 34 bytes.
fonte
Python 3 ,
59555049 bytesA saída é indexada em 0. A fórmula para determinar a direção do suporte foi descoberta pela primeira vez por @ETHProductions e aprimorada por @Adnan.
Experimente online!
fonte
Lote, 172 bytes
1 indexado.
<>
É claro que s são caracteres especiais no Lote, então não só tenho que citar todo o texto, como também não posso fazer truques, como marcá-losgoto
.fonte
R, 126 bytes
fonte
C, 127 bytes
Experimente on-line
Saída
fonte