Este fue uno de una serie de desafíos previos al cumpleaños de Brain-Flak. Descubre más aquí .
Reto
Para este desafío, su objetivo será encontrar el primer par de corchetes coincidentes en una cadena de ()[]{}<>
corchetes totalmente coincidentes . Para tomar prestada la definición de DJMcMayhem de una cadena totalmente coincidente:
A los efectos de este reto, un "soporte" es cualquiera de los siguientes caracteres:
()[]{}<>
.Un par de paréntesis se considera "coincidente" si los paréntesis de apertura y cierre están en el orden correcto y no tienen caracteres dentro de ellos, como
() []{}
O si cada subelemento dentro de él también coincide.
[()()()()] {<[]>} (()())
Los subelementos también se pueden anidar en varias capas de profundidad.
[(){<><>[()]}<>()] <[{((()))}]>
Una cadena se considera "Totalmente coincidente" si y solo si cada par de corchetes tiene el corchete de apertura y cierre correcto en el orden correcto.
Entrada
La entrada consistirá en una sola cadena no vacía o matriz de caracteres que contiene solo los caracteres ()[]{}<>
, y se garantiza que coincida completamente. Usted puede tomar la entrada de cualquier manera razonable que se corresponde con nuestros E / S por defecto .
Salida
La salida de su programa o función será el índice del paréntesis que cierra el primero. La salida debe ser 0
o 1
indexada. Una vez más, la salida puede estar en cualquier forma razonable que se corresponde con nuestros E / S por defecto .
Casos de prueba
Input 0-indexed 1-indexed
() 1 2
(<>) 3 4
<[]{<>}> 7 8
{}{}{}{} 1 2
[[]<>[]] 7 8
Este es el código de golf , ¡la menor cantidad de bytes gana!
Respuestas:
V , 4 bytes
Pruébalo en línea!
Esto, a diferencia de la mayoría de las respuestas V, utiliza la indexación 0. Estoy extremadamente orgulloso de esta respuesta y de lo lejos que ha llegado mi idioma. Explicación:
fuente
Brain-Flak ,
685, 155, 151, 137 bytesPruébalo en línea!
136 bytes de código, más un byte para
-a
. Uno indexado.¡530 bytes de golf! Ese es probablemente el golf más grande que he hecho.
¡14 bytes guardados gracias a Riley!
Esto abusa de una fórmula del paréntesis de apertura / cierre: si toma los valores ASCII, increméntelos en uno y tome el módulo de 4, los abridores (
({[<
) siempre obtendrán0
o1
, mientras que los cerradores ()}]>
) siempre obtendrán 2 o 3.Explicación:
fuente
n-1&2
/n+1&2
/-n&2
on%7&2
para distinguir los corchetes de apertura y cierre ...&2
, pero lo investigaré.0
/1
y2
/3
... aunque ahora que lo miro, solo estás disminuyendo si es positivo. Un truco genial también :-)(TOS+1)%4
puede ser más corto: Pruébelo en línea!05AB1E ,
17 1610 bytes-1 gracias a carusocomputing
-6 gracias a Adnan por su sorprendente percepción de que "después de aumentar, el segundo último bit es 0 para un paréntesis de apertura y 1 para un paréntesis de cierre"
Pruébalo en línea!
fuente
žu
Parece utilizable aquí.žu8ÝÈÏ
así que no, no realmente jajaja. En el mejor de los casos, seguirá siendo de 5 bytes. Estaba pensando más en dividirme en los pares de llaves, y quitar las llaves hasta que solo quede un par, incrementar el contador en 2 por cada par eliminado. Sin embargo, no tengo idea si eso es menos. Probándolo atm.Ç>2&<.pO0k
.0
para un corchete de apertura y1
para un corchete de cierre.Vim, 23 bytes
Pruébalo en línea!
Estoy realmente triste por esta respuesta. Esta solución es bellamente elegante y corta, pero, por defecto, vim no considera
<
y>
debe coincidir, por lo que necesito 13 bytes de código repetitivo. De lo contrario, esto sería solo 10 bytes.Hubiera publicado una respuesta V, pero eso sería solo un byte más corto, es decir, cambiar
Vr
aÒ
, ya queVr
es un vim-idioma común.Esto está indexado en 1 pero podría modificarse trivialmente para indexarse en 0 cambiando el
1
a a0
.fuente
Gelatina ,
11109 bytesPruébalo en línea!
Explicación
La idea aquí era encontrar una "fórmula mágica" que pueda distinguir los corchetes de apertura de cierre. Originalmente utilicé
O%7&2
(es decir, "tome el código ASCII, módulo 7, bit a bit y 2"), pero @ETHproductions sugirióO’&2
(que reemplaza el módulo 7 con una disminución); ambos devuelven 0 para un tipo de soporte y 2 para el otro. Restar 1 (’
) convertirá estos resultados en -1 y 1.El resto del código es
+\
.+\
produce una suma acumulativa Si un conjunto de paréntesis coincide correctamente, contendrá el mismo número de -1s y 1s, es decir, su suma acumulativa será 0. Entonces solo necesitamos devolver el índice del primer 0 en la lista resultante; podemos hacer eso coni0
.fuente
b*2%7>3
Retina ,
2624 bytesPruébalo en línea!
El resultado está basado en 1.
Explicación
Una solución Retina muy diferente que se basa esencialmente en una expresión regular única (y muy legible ...). Esto usa una nueva técnica que descubrí ayer para unir cadenas equilibradas usando grupos de equilibrio .
Find (
M
) y return (!
) todas las coincidencias de la expresión regular^.(?<-1>([[({<])*.)*
. Esa expresión regular omite el primer carácter de la cadena y luego usa grupos de equilibrio para realizar un seguimiento de la profundidad de anidación. Cualquiera de[({<
aumentar la profundidad (seguimiento por grupo1
) y cualquier otro personaje disminuye la profundidad (en principio,.
permite que la profundidad se reduzca abriendo también los corchetes, pero dado que la expresión regular se combina con avidez, el rastreador nunca intentará eso ) El truco extraño es que el(?<-1>...)
grupo de encierro1
funciona porque el estallido de un grupo de equilibrio ocurre al final del grupo. Esto ahorra dos bytes sobre el enfoque estándar en el formulario((open)|(?<-2>close))*
. La coincidencia necesariamente se detiene en el soporte que cierra el primero, porque lo omitimos, por lo que no se tiene en cuenta en la profundidad de la pila (y la profundidad de la pila no puede ser negativa).La longitud de esta coincidencia es el índice basado en 0 del soporte que estamos buscando.
Simplemente cuente el número de coincidencias vacías en esta cadena. La expresión regular vacía siempre coincide una vez más que los caracteres en la cadena, por lo que esto nos da el índice basado en 1 del soporte que estamos buscando.
fuente
Retina , 24 bytes
Pruébalo en línea!
Esto está inspirado en la solución de Martin Ender .
Explicación
La primera línea es una expresión regular que coincide con un carácter seguido de una cadena equilibrada que va hasta el final de la cadena principal (para una explicación detallada de cómo se usan los grupos de equilibrio en esta expresión regular, vea la respuesta de Martin). Dado que las expresiones regulares buscan coincidencias de izquierda a derecha, esto encontrará el subfijo correcto más largo equilibrado, es decir, todo después del parche que cierra el primero, más el paréntesis en sí.
La siguiente línea está vacía, por lo que reemplazamos la coincidencia con una cadena vacía, lo que significa que ahora solo necesitamos contar los caracteres restantes para obtener el resultado deseado (indexado a 0).
La última línea vacía cuenta el número de coincidencias de la cadena vacía en la cadena, que es uno más que el número de caracteres en la cadena, equivalente al resultado indexado 1.
fuente
Perl 5 , 28 bytes
Ahorró 6 bytes usando solo en
.
lugar de[>})\]]
, de la respuesta Retina de Martin Ender .27 bytes de código +
-p
bandera.Pruébalo en línea!
La expresión regular recursiva, qué hermoso invento.
La expresión regular busca un corchete de apertura (
[<{([]
), seguido de una llamada recursiva (?0
), seguido de un corchete de cierre (.
). Todo esto sin codicia (+?
) por lo que coincide lo más corto posible desde el principio. El índice del final del partido es la respuesta, y a medida que sucede, se puede encontrar en$+[0]
.fuente
JavaScript (ES6),
555352 bytesGuardado 1 byte gracias a @Adnan
Para cada paréntesis de apertura, tomar su código de char mod 4 nos da 0 o 3; para los corchetes de cierre, nos da 1 o 2. Por lo tanto, podemos distinguir entre abrir y cerrar corchetes negando el código de caracteres del corchete (que voltea los bits y resta 1) y tomando el segundo bit menos significativo; es decir,
n&2
.fuente
n-1&2
, ¿-n&2
también funciona?C,
757256555445 bytesMíralo trabajar en línea .
Si desea que la salida esté indexada en 1 en lugar de indexada en 0, reemplace la última
0
con1
.fuente
Python 2.7 + Numpy,
8579 bytesMi primer intento de código de golf:
fuente
Brain-Flak , 97 bytes (96 para código, 1 para bandera)
Corre con el
-a
bandera.Pruébalo en línea!
Explicación:
Simplemente funciona, está bien.
fuente
Retina , 34 bytes
Pruébalo en línea!
El resultado está basado en 0.
Explicación
Reemplace el primer carácter con a
!
. Esto hace que el soporte que estamos buscando sea incomparable.Convierta paréntesis, corchetes y llaves en corchetes angulares. Dado que se garantiza que la cadena coincida completamente, no nos importan los tipos reales, y esto ahorra algunos bytes en el siguiente paso.
Repetidamente (
+
) reemplaza cada personaje en todas las coincidencias de<!*>
con!
s. Es decir, combinamos pares de corchetes que no contienen más corchetes sin procesar y los convertimos en otros signos de exclamación. Esto convertirá toda la cadena, excepto el corchete de cierre sin igual, en signos de exclamación.Cuente el número de signos de exclamación iniciales, que es igual a la posición basada en 0 del primer signo de no exclamación (es decir, el paréntesis no coincidente). Los
\G
anclajes coinciden con los anteriores, por lo que esto no cuenta los!
s después de dicho paréntesis.fuente
(?!(2))
es justo(?!2)
. Probablemente quisiste decir(?(2)(?!))
o(?2)!)
. También olvidaste escapar de a]
y la final+
debe ser*
.PHP, 116 bytes
Versión en línea
fuente
<?php
?Python , 76 bytes
Función recursiva que usa el segundo LSB ordinal como una bandera para el truco abierto vs cerrado utilizado por muchos encontrados por Adnan (y probablemente otros). La cola golpea cuando la suma acumulativa de
-1
para abrir y1
para cerrar llega a cero. El índice se mantiene en una variable, ya que es más barato en bytes que el usolen(r)
, la indexación se basa en 1.Pruébalo en línea!
fuente
Ruby,
3534 bytesBasado en la respuesta de Dada Perl5 . La salida está indexada en 1. Requiere que se invoque al intérprete de Ruby con la
-n
opción (while gets
bucle implícito ).Editar: Esto también es
3534 bytes, pero es otro posible punto de partida para reducir aún más esta respuesta.Edit2: Eliminado espacios innecesarios después
p
.Edit3: Un par de respuestas de 34 bytes más.
fuente
Python 3 ,
59555049 bytesLa salida está indexada en 0. La fórmula para determinar la dirección del soporte fue descubierta por @ETHProductions y mejorada por @Adnan.
Pruébalo en línea!
fuente
Lote, 172 bytes
1 indexado.
<>
Por supuesto, los caracteres son especiales en Batch, así que no solo tengo que citarlos por completo, sino que ni siquiera puedo hacer trucos como hacerlosgoto
etiquetas.fuente
R, 126 bytes
fuente
C, 127 bytes
Probar en línea
Salida
fuente