Escriba un programa o función que tome una cadena de ocho bytes que contenga uno de cada uno de los caracteres ()[]{}<>
dispuestos de cualquier manera de manera que coincidan los cuatro tipos de paréntesis respectivos. Por ejemplo, ]<([){}>
es una entrada no válida porque los corchetes no coinciden (aunque todos los demás sí).
Imprima o devuelva un número entero de 0
a 6
que denote cuántos de los seis posibles emparejamientos de los cuatro tipos de paréntesis están enclavados. Los pares de tipo de paréntesis se consideran entrelazados si se produce exactamente un paréntesis de un tipo entre los paréntesis del otro tipo. Así ([)]
y [(])
están entrelazados, pero ()[]
, []()
, ([])
, y [()]
no lo son.
El código más corto en bytes gana.
Ejemplos de entrada / salida
()[]{}<> : 0
([{<>}]) : 0
<>{[]}() : 0
{<>([])} : 0
<(>)[{}] : 1
<[({)}]> : 1
[{<}]>() : 2
{<>([}]) : 2
<{(>})[] : 3
[(]<){>} : 3
<([>{)}] : 4
(<{[>})] : 4
(<[{)>}] : 5
<{[(>})] : 5
[{<(]}>) : 6
(<{[)>}] : 6
fuente
7~f&
? Ya me gusta esta respuesta, y ni siquiera he leído el resto.Python 2, 163 bytes
Esto analiza las cosas entre cada par de corchetes coincidentes y cuenta el número de corchetes individuales izquierdo o derecho presentes. La suma de estos dividida por dos es la salida.
Estoy seguro de que los golfistas mejores que yo podrían jugar mucho más.
fuente
GNU sed -r, 147
La salida está en unario según esta meta-respuesta .
Nota: Reemplace
\t
con tabcaracteres reales para obtener la puntuación correcta. Sin embargo, el programa funcionará de cualquier manera con GNU sed.Pruébalo en línea .
fuente
Perl, 77 bytes
76 código + 1 interruptor
Toma información de STDIN y el programa debe iniciarse de nuevo para cada entrada.
Explicación
y/.../.../
).for$x...
), incremente un contador para el carácter ($h{$x}++
).length $1
) y elimine ambas ocurrencias de este carácter de la cadena. Por ejemplo, si la cadena era([{([{<<
, hay dos caracteres[
y{
entre los dos(
s. Después de que(
se procesan los s, la cadena se convierte[{[{<<
y agregamos 2 al número total ($z
) de paréntesis entrelazados.$z
($_=$z
)fuente
Pyth, 20 bytes
Banco de pruebas
JmC/CdTz
: Primero, esto convierte cada par de símbolos en un solo carácter al asignar cada carácter de entrada a su código de caracteres (Cd
) dividido por 10 (/ T
), que es el mismo para cada par pero diferente entre todos los pares. El número resultante se convierte de nuevo en un personaje para los fines que se revelarán más adelante (C
). La lista resultante de caracteres se guarda enJ
.lsm@FPcsJd{J
: Ahora, asignamos los caracteres únicos enJ
({J
). Comenzamos cortando la cadena formada mediante la concatenaciónJ
usando el carácter actual como el delímetro (csJd
). Un par de paréntesis se superpone al par actual si aparece en el segundo grupo y en el primer o tercer grupo. Para evitar el doble conteo, solo contaremos el primer y segundo caso de grupo. Entonces, eliminamos el tercer grupo (P
) y tomamos la intersección de los grupos restantes (@F
). Finalmente, concatenamos los caracteres superpuestos (s
) e imprimimos la longitud del resut (l
).fuente
Pitón 3, 107
Basada en mi solución CJam.
fuente
Retina ,
128108646255 bytesDonde
<empty>
representa una línea final vacía. Para fines de conteo, coloque cada línea en un archivo separado y reemplace los caracteres\n
con saltos de línea reales. Para su comodidad, puede usar este código equivalente con la-s
marca de un solo archivo:La salida es unaria .
Explicación
El primero
(
le dice a Retina que ejecute todo el código en un bucle hasta que una iteración deje de cambiar la cadena. En este caso, siempre iterará cuatro veces, una para cada tipo de paréntesis.Esto simplemente convierte cada corchete de cierre en el corchete de apertura correspondiente, de modo que podamos hacer coincidir los corchetes correspondientes con una simple referencia posterior más adelante. (Esta etapa se convierte en un no-op después de la primera iteración. Solo se incluye en el bucle, porque
T
ya requería un backtick, por lo que agregar el(
costo solo es uno en lugar de dos bytes).Esto reemplaza el par de corchetes más a la izquierda con nuevas líneas. Usamos
\D
para distinguir los corchetes de los1
s que agregamos más adelante en el ciclo para contar. Al(.*)
final se asegura que solo se reemplaza un par (porque las coincidencias no pueden solaparse).Toda la expresión regular está en una búsqueda anticipada, por lo que coincide con una posición . Más específicamente, coincide con una posición para cada par de corchetes que ha sido separado por los otros corchetes que acabamos de convertir en nuevas líneas. A
1
se inserta en cada una de estas posiciones. Podemos dejar los1
s allí, porque no afectan a ninguna de las otras expresiones regulares (porque los\D
s se aseguran de que no coincidamos accidentalmente).Finalmente, eliminamos las nuevas líneas (es decir, los marcadores de posición para el tipo actual de corchetes); esto significa que hemos reducido el problema restante a una cadena de longitud 6 que contiene solo 3 tipos de corchetes, pero de lo contrario funciona exactamente igual.
Al final, solo
1
quedarán los s que insertamos, y su cantidad corresponde exactamente al número de paréntesis entrelazados.fuente
Javascript (ES7),
121117 bytesGuau. Eso fue divertido. Esbocé una idea de respuesta cuando apareció este desafío por primera vez, pero tenía más de 150 bytes de longitud y no quería esforzarme por jugarlo. Me encontré con esta idea en mi cuaderno ayer y decidí que no dejaría de pensar en ello hasta que lo hubiera jugado por completo. Terminé escribiendo dos algoritmos completamente nuevos, el primero de los cuales terminó varios bytes más cortos después de jugar alrededor de 25 bytes con toneladas de pirateo de bits.
Cómo funciona
Primero establecemos variables
a
yb
to0
.a
es una matriz binaria de 4 bits de los pares de paréntesis en los que estamos actualmente, yb
es una matriz binaria de 16 bits cuyos pares de paréntesis están unidos entre sí.A continuación, recorrer cada carácter
c
enx
, y cada carbónd
en'0123'
. Primero determinamos con qué tipo de soportec
estáe=c.charCodeAt()/26-1|0
. Los códigos de caracteres decimales de cada tipo de paréntesis son los siguientes:Al dividir por 26, restar 1 y piso, los asignamos a 0, 1, 2 y 3, respectivamente.
Luego verificamos si este número es igual al valor actual de
d
. Si es así, estamos entrando o saliendo deld
tipo de soporte th, por lo que cambiamos eld
bit tha
cona^=1<<d
. Si no lo es, sino que están dentro deld
tipo de soporte XX, tenemos que darle la vuelta ale
ésimo bit en lad
sección de 4 bits º deb
. Esto se hace así:(a>>d&1)
Devuelve eld
bit de entradaa
. Si estamos dentro deld
tipo de soporte, esto devuelve 1; de lo contrario, devuelve 0. A continuación, desplazamos esto a la izquierda pord*4+e
bits, y XORb
por el resultado. Si estamos dentro deld
tipo de corchete, este XOR es eld*4+e
bit deb
; de lo contrario, no hace nada.Al final de todo el bucle,
b
contendrá un número de 1 bits igual al doble del valor de retorno deseado. Pero aún necesitamos averiguar cuántos bits es esto. Ahí es dondef
entra la subfunción :Si
y
es 0, esto simplemente devuelve 0. De lo contrario, toma el último bit dey
withy%2
, luego agrega el resultado de ejecutar todo excepto el último bit ay
través de la función nuevamente. Por ejemplo:Realizamos
b
esta función y dividimos el resultado entre 2, y ahí está nuestra respuesta.fuente
Oracle SQL 11.2, 206 bytes
Sin golf:
fuente