Escreva um programa ou função que utilize uma cadeia de oito bytes contendo um de cada um dos caracteres ()[]{}<>
organizados de maneira que os quatro tipos de colchetes respectivos correspondam. Por exemplo, ]<([){}>
é uma entrada inválida porque os colchetes não correspondem (embora todos os outros correspondam).
Imprima ou retorne um número inteiro de 0
para 6
que indica quantos dos seis possíveis pares dos quatro tipos de colchetes estão intertravados. Os pares de tipos de colchetes são considerados intertravados se ocorrer exatamente um colchete de um tipo entre os colchetes do outro tipo. Assim, ([)]
e [(])
estão interligados, mas ()[]
, []()
, ([])
, e [()]
não são.
O código mais curto em bytes vence.
Exemplos de entrada / saída
()[]{}<> : 0
([{<>}]) : 0
<>{[]}() : 0
{<>([])} : 0
<(>)[{}] : 1
<[({)}]> : 1
[{<}]>() : 2
{<>([}]) : 2
<{(>})[] : 3
[(]<){>} : 3
<([>{)}] : 4
(<{[>})] : 4
(<[{)>}] : 5
<{[(>})] : 5
[{<(]}>) : 6
(<{[)>}] : 6
fonte
7~f&
? Eu já gosto dessa resposta e nem li o resto.Python 2, 163 bytes
Ele examina as coisas entre cada par de colchetes correspondentes e conta o número de colchetes individuais à esquerda ou à direita presentes. A soma destes divididos por dois é a saída.
Tenho certeza de que poderia ser muito mais jogado por jogadores melhores do que eu.
fonte
GNU sed -r, 147
A saída é unária conforme esta meta-resposta .
Nota: Substitua
\t
portab caracteres para obter a pontuação correta. No entanto, o programa funcionará de qualquer maneira com o GNU sed.Experimente online .
fonte
Perl, 77 bytes
76 código + 1 comutador
Recebe informações do STDIN e o programa deve ser iniciado de novo para cada entrada.
Explicação
y/.../.../
).for$x...
), aumente um contador para o caractere ($h{$x}++
).length $1
) e remova ambas as ocorrências desse caractere da string. Por exemplo, se a sequência fosse([{([{<<
, existem dois caracteres[
e{
entre os dois(
s. Depois que os(
s são processados, a sequência se torna[{[{<<
e adicionamos 2 ao número total ($z
) de colchetes.$z
($_=$z
)fonte
Pitão, 20 bytes
Suíte de teste
JmC/CdTz
: Primeiro, isso converte cada par de símbolos em um único caractere, mapeando cada caractere de entrada para seu código de caractere (Cd
) dividido por 10 (/ T
), que é o mesmo para cada par, mas diferente entre todos os pares. O número resultante é convertido novamente em um caractere para fins a serem revelados posteriormente (C
). A lista de caracteres resultante é salva emJ
.lsm@FPcsJd{J
: Agora, mapeamos os caracteres únicos emJ
({J
). Começamos cortando a string formada concatenandoJ
usando o caractere atual como delimeter (csJd
). Um par de colchetes se sobrepõe ao par atual se ele aparecer no segundo grupo e no primeiro ou terceiro grupo. Para evitar a contagem dupla, apenas contaremos o primeiro e o segundo caso de grupo. Portanto, removemos o terceiro grupo (P
) e fazemos a interseção dos demais grupos (@F
). Por fim, concatenamos os caracteres de sobreposição (s
) e imprimimos o comprimento do resultado (l
).fonte
Python 3, 107
Vagamente baseado na minha solução CJam.
fonte
Retina ,
128108646255 bytesOnde
<empty>
representa uma linha de fuga vazia. Para fins de contagem, coloque cada linha em um arquivo separado e substitua\n
por caracteres reais de avanço de linha. Por conveniência, você pode usar esse código equivalente com o-s
sinalizador de um único arquivo:Saída unária .
Explicação
O primeiro
(
diz ao Retina para executar o código inteiro em um loop até que uma iteração pare de alterar a string. Nesse caso, ele sempre repetirá quatro vezes, uma vez para cada tipo de colchete.Isso simplesmente transforma cada colchete de fechamento no colchete de abertura correspondente, para que possamos combinar os colchetes correspondentes com uma referência simples mais tarde. (Esse estágio se torna um não operacional após a primeira iteração. Ele está incluído apenas no loop, porque o
T
já exigia um backtick, portanto, a adição(
custa apenas um em vez de dois bytes.)Isso substitui o par de colchetes mais à esquerda por novas linhas. Usamos
\D
para distinguir colchetes dos1
s que adicionamos posteriormente no loop para contagem. O(.*)
final garante que apenas um par seja substituído (porque as correspondências não podem se sobrepor).A regex inteira está em um lookahead, portanto, isso corresponde a uma posição . Mais especificamente, ele corresponde a uma posição para cada par de colchetes que foi separada pelos outros colchetes que acabamos de transformar em novas linhas. A
1
é inserido em cada uma dessas posições. Podemos simplesmente deixar os1
s lá, porque eles não afetam nenhuma das outras expressões regulares (porque eles\D
garantem que não os correspondemos acidentalmente).Por fim, removemos as novas linhas (ou seja, os espaços reservados para o tipo atual de colchetes) - isso significa que reduzimos o problema restante para uma sequência de comprimento 6 que contém apenas 3 tipos de colchetes, mas, caso contrário, funciona exatamente da mesma maneira.
No final, apenas os
1
s inseridos serão deixados, e sua quantidade corresponde exatamente ao número de colchetes.fonte
JavaScript (ES7),
121117 bytesUau. Foi divertido. Esbocei uma ideia de resposta quando esse desafio foi lançado, mas ele tinha mais de 150 bytes e não queria me esforçar para jogá-lo. Encontrei essa idéia no meu notebook ontem e decidi que não iria parar de pensar nela até que eu tivesse jogado o golfe completamente. Acabei escrevendo dois algoritmos inteiramente novos, o primeiro dos quais acabou vários bytes mais curto depois de jogar cerca de 25 bytes com toneladas de hackers de bits.
Como funciona
Primeiro, definimos variáveis
a
eb
como0
.a
é uma matriz binária de 4 bits cujos pares de colchetes estamos atualmente no interior eb
é uma matriz binária de 16 bits cujos pares de colchetes estão vinculados.Em seguida, vamos percorrer cada personagem
c
emx
, e cada caractered
em'0123'
. Primeiro, determinar que tipo de suportec
é come=c.charCodeAt()/26-1|0
. Os códigos de caracteres decimais de cada tipo de colchete são os seguintes:Dividindo por 26, subtraindo 1 e revestimento, nós os mapeamos para 0, 1, 2 e 3, respectivamente.
Em seguida, verificamos se esse número é igual ao valor atual de
d
. Se for, estamos entrando ou saindo dod
tipo de parêntese, então trocamos od
tha
coma^=1<<d
. Se não é, mas nós estão dentro dod
suporte tipo th, precisamos virar oe
th pouco nad
seção de 4 bits thb
. Isso é feito da seguinte maneira:(a>>d&1)
Retorna od
th bita
. Se estivermos dentro dod
tipo de colchete, isso retornará 1; caso contrário, ele retornará 0. Em seguida, mudamos isso para a esquerda pord*4+e
bits e XORb
pelo resultado. Se estivermos dentro dod
tipo de colchete, este XOR será od*4+e
th bitb
; caso contrário, não faz nada.No final de todo o loop,
b
conterá um número de 1 bits igual ao dobro do valor de retorno desejado. Mas ainda precisamos descobrir quantos bits são esses. É aí quef
entra a sub-função :Se
y
for 0, isso simplesmente retorna 0. Caso contrário, ele leva o último bit dey
comy%2
e adiciona o resultado da execução de todos, exceto o último bit,y
através da função novamente. Por exemplo:Executamos
b
essa função e dividimos o resultado por 2, e aqui está a nossa resposta.fonte
Oracle SQL 11.2, 206 bytes
Sem golfe:
fonte