Llamamos a un grupo de padres el par abierto (
, su par cercano )
y todo lo que hay dentro de ellos.
Un grupo o cadena parenteral se llama entre paréntesis equilibrados si no contiene nada o solo 2 grupos parentales entre paréntesis.
Por ejemplo:
The string "(()())()" is parenthesly balanced
( )() Because it contains exactly 2 parenthesly balanced parens groups
()() The left one is parenthesly balanced because it contains 2 parenthesly balanced parens groups (balanced because they are empty). The right one is parenthesly balanced because it contains nothing.
Igualmente:
The string "(()(()))()" is not parenthesly balanced
( )() Because it contains a parens group that is not parenthesly balanced: the left one
()( ) The left one is not balanced because it contains a parens group that is not balanced: the right one
() The right one is not balanced because it only contains one balanced group.
Por lo tanto, una cadena entre paréntesis equilibrada o un grupo parens debería:
- No contienen nada en absoluto.
- O contenga solo y exactamente 2 grupos parensos equilibrados entre paréntesis. No debe contener nada más.
Tarea:
Su tarea es escribir una función o programa que verifique si una cadena dada es paréntesis balanceada o no.
Entrada:
La entrada será una cadena o lista de caracteres o algo similar. Puede suponer que la cadena solo constará de los caracteres '('
y ')'
. También puede suponer que cada par abierto (
tendrá su par cercano )
, así que no se preocupe por cadenas como "((("
o ")("
o "(())("
...
Nota: Como se ha mencionado por @DigitalTrauma en su comentario abajo, que está bien subtitute el ()
combo por otros caracteres (tales como <>
, []
, ...), si es que causa un trabajo adicional como escapar en algunos idiomas
Salida:
Cualquier cosa para indicar si la cadena está entre paréntesis equilibrada o no (verdadero o falso, 1 o 0, ...). Incluya en su respuesta lo que se espera que produzca su función / programa.
Ejemplos:
"" => True
"()()" => True
"()(()())" => True
"(()(()(()())))(()())" => True
"(((((((()())())())())())())())()" => True
"()" => False
"()()()" => False
"(())()" => False
"()(()(())())" => False
"(()())(((((()())()))())())" => False
"()(()()()())" => False
"()(()(()())()())" => False
¡Los dos últimos ejemplos realmente marcaron la diferencia!
¡La mejor de las suertes!
fuente
"(()())()"
se representaría como[0, 0, 1, 0, 1, 1, 0, 1]
. Esto eliminaría la necesidad de convertir la entrada al código de caracteres y luego restar.Respuestas:
Japt v2, 20 bytes
¡Pruébalo en línea!
Al principio, todos entendieron mal el desafío y, aunque cada par de paréntesis tenía que contener un número par de subpares, cuando en realidad el desafío realmente pide 0 o 2 subpares. Así que aquí está mi respuesta revisada, usando la misma técnica que antes.
Todavía podemos resolver el desafío con un reemplazo recursivo. La cuestión es que, en lugar de simplemente eliminar todas las ocurrencias de
()()
, debemos asegurarnos de que no haya nada más en el mismo contenedor además de()()
(en otras palabras, no()()()()
o nada por el estilo). Podemos hacer esto reemplazando recursivamente(()())
con()
.El nuevo problema es que la entrada en sí no tiene un par de paréntesis externos (ya que eso no lo haría una cadena equilibrada entre paréntesis), lo que nos obliga a envolverlo en un par adicional para reducirlo por completo. Finalmente, el resultado final para las cadenas balanceadas es ahora en
()
lugar de la cadena vacía, por lo que verificamos la igualdad en lugar de simplemente tomar el NOT lógico de la salida.fuente
sed 4.2.2, 30
Pruébalo en línea .
Esto devuelve un código de salida de shell de 1 para True y 0 para False.
fuente
Perl 5 -lp,
2422 bytesPruébalo en línea! El enlace incluye casos de prueba. Editar: Guardado 2 bytes gracias a @JoKing. Explicación: solo una expresión regular recursiva. El grupo de captura externo representa una cadena equilibrada
<
seguida de una cadena equilibrada opcional seguida de un>
, dos veces. Tenga en cuenta que la mayoría de las otras respuestas pueden usar()
s, pero esto cuesta dos bytes adicionales:Pruébalo en línea! El enlace incluye casos de prueba.
fuente
<>
()
s, así que no pensé que fuera una comparación justa, sin embargo, veo que la respuesta APL de @ ngn también usa<>
s, así que actualicé esta.6502 rutina de código de máquina , 48 bytes
Espera un puntero a una cadena en
$fb
/$fc
que se espera que solo contenga(
y)
. Borra el indicador C (Carry) si la cadena está "paranthesely balanceada", la establece de otra manera (lo cual es un idioma típico en el 6502, establece carry "en caso de error"). No hace nada sensato en la entrada inválida.Aunque el algoritmo es recursivo, no se llama a sí mismo (lo que necesitaría más bytes y haría que la posición del código dependiera), sino que mantiene una profundidad de recursión y utiliza ramificaciones "simples".
Desmontaje comentado
Ejemplo de programa ensamblador C64 usando la rutina:
Demostración en línea
Código en sintaxis ca65 :
fuente
V ,
21, 20 bytesPruébalo en línea! o Verifique todos los casos de prueba!
Hexdump:
fuente
Brachylog , 28 bytes
Pruébalo en línea!
Explicación
fuente
C (gcc) , 113 bytes
Pruébalo en línea!
Explicación
Pruébalo en línea!
fuente
MATL ,
2625 bytesPruébalo en línea!
Gracias a la respuesta de @ETHProductions por la idea "reemplazar (() ()) con ()", y al comentario de la pregunta de @JungHwan Min por la idea de ver los corchetes como dígitos binarios.
La salida es una matriz vacía para la verdad, un número positivo para falsey, que creo que está permitido por el comentario de OP: "Podría haber categorías. Es decir, valores de verdad para señalar la verdad y valores falsos para indicar lo contrario". Si no es así, podemos agregar
n
al final para +1 byte, para tener 0 como salida verdadera y 1 como salida falsey.Con comentarios:
fuente
C # (.NET Core) ,
7871 bytesPruébalo en línea!
fuente
Haskell ,
8259 bytesPruébalo en línea!
Supongo que se puede jugar mucho más, ya que es la primera vez que juego golf en Haskell, por lo que cualquier truco o comentario es más que bienvenido.
EDITAR - Gracias @nimi por guardar 23 bytes (más del 28% del envío original :)
fuente
()
vueltay+1
. Como se permiten funciones sin nombre, puede descartarf=
,r[0]
es una función adecuada. Coloque el caso baser b[]
al final y cambie a una función infija (digamos#
), luego puede usarb#_=
. También puede cambiar su algoritmo ligeramente mediante la construcción de la lista para comprobar si hay0
s y2
s paso a paso, en lugar de llevar a su alrededor las llamadas der
en un acumuladorr(x:y:z) ... = x : r (...) a
con el caso baser b [] = b
. Haga la verificación después de la llamada inicialr[0]
. En total, 73 bytes.foldl
(59 bytes): ¡ Pruébelo en línea! .JavaScript (ES6), 63 bytes
Toma entrada como una matriz de caracteres. Devuelve falso para paréntesis equilibrado, verdadero para paréntesis no equilibrado.
Pruébalo en línea!
Comentado
Recursivo, 54 bytes
Usar reemplazos recursivos (como en Sin embargo, el la respuesta Japt de ETHproductions ) es significativamente más corto.
Toma la entrada como una cadena. Devuelve 1 para paréntesis balanceados, 0 para paréntesis no balanceados.
Pruébalo en línea!
Recursivo, 46 bytes
Este arroja un error de recursión para el paréntesis no equilibrado:
Pruébalo en línea!
fuente
x[k]
inicialmente no está definido yx[k]++
daríaNaN
, mientras que-~undefined
da1
.a[k]
inicialmente contiene un carácter. Pero la misma lógica se aplica a las cadenas: al aplicar el++
operador sobre ellas se obtienen rendimientosNaN
, pero los operadores bit a bit (como~
) obligan a que se las coarte de0
antemano.Perl 6 ,
43 4137 bytesPruébalo
Pruébalo
Pruébalo
Expandido:
fuente
R , 71 bytes
Pruébalo en línea!
Otra solución, más larga, pero interesante para el enfoque diferente.
R , 85 bytes
Pruébalo en línea!
Explicación
Toma la cadena de entrada y reemplaza:
luego evalúa la expresión resultante. Si es igual a cero está equilibrado, de lo contrario no lo está. El uso de
sum
solo es necesario para manejar el caso de cadena vacía, porque su evaluación regresaNULL
.p.ej
fuente
f=function(s,r=sub('(()())','()',s,f=T))'if'(r==s,s==''|s=='()()',f(r))
Wolfram Language (Mathematica) , 65 bytes
Pruébalo en línea!
fuente
05AB1E ,
181613 bytesPuerto de @ETHproductions respuesta Japt' s de solucionar el caso de prueba
()(()()(()())(()()))
.-2 bytes gracias a @Adnan .
Basado en este comentario de OP , ahora lo uso
()
como valor verdadero, y cualquier otra cosa como falsey. Si ambos valores deben ser consistentes en lugar de solo uno, sería la respuesta anterior de 16 bytes en su lugar (…(ÿ)…(()∞„()©:®Q
), regresando0
para verdades y1
para casos de prueba falsey.Pruébelo en línea o verifique todos los casos de prueba .
Explicación
(Antigua respuesta de 18 bytes que falló para el caso de prueba
()(()()(()())(()()))
...):Pruébelo en línea o verifique todos los casos de prueba .
fuente
„()∞õ:g_
.(()()()())
que deberían devolver falsey. Cada grupo de paréntesis debe contener exactamente 0 o 2 grupos internos.'(®')J
con…(ÿ)
.ÿ
existía, pero nunca lo usé antes, así que lo olvidé por completo.APL (Dyalog Classic) , 27 bytes
Pruébalo en línea!
fuente
Prólogo , 46 bytes
Pruébalo en línea! o Verifique todos los casos de prueba!
Utiliza listas de
l
yr
como entrada, por ejemplo,"()()"
se prueba comof([l,r,l,r]).
.Las primeras tres líneas son la gramática de cadenas válidas en la sintaxis Grammar de Cláusula Definitiva de Prolog .
a(A,B).
devuelvetrue
cuandoA
es una lista que sigue la gramática yB
está vacía. Por lo tanto, la función principalf
toma algoX
y comprueba si sea(X,[])
mantiene.fuente
Python 2 ,
7371 bytesPruébalo en línea!
fuente
brainfuck, 50 bytes
Formateado:
Espera una cadena de
(
y)
sin una nueva línea final, y genera\x01
true y\x00
false. (Para legibilidad, por ejemplo, puede agregar 48+
s antes de la final.
para que se imprima1
y en su0
lugar).Pruébalo en línea
Esto mantiene una pila con el número de grupos en cada profundidad, distinguiendo los caracteres por paridad y verificando si el número de grupos está en {0, 2} después de cada paréntesis; si no se cumple la condición, consume el resto de la entrada y establece un indicador; luego verifica la condición nuevamente al final del programa.
Si se nos permite terminar la secuencia de entrada con un carácter impar, podemos omitir la verificación final
<[--[>->]]
para guardar 10 bytes. (Si\n
no fuera inconveniente incluso, podría haber propuesto esta variante como la respuesta principal).(También podríamos guardar algunos bytes cambiando el formato de salida a
\x00
verdadero y no\x00
falso, lo que parece estar permitido (tal vez accidentalmente) por la declaración del problema tal como está escrita, pero de todos modos no sería muy interesante, y prefiero no para hacer ese cambio.)fuente
Python2,
9594 bytesPruébalo en línea!
f () transforma la cadena en una tupla anidada, que pasa a g ().
g () navega recursivamente la tupla y devuelve False si algún elemento no tiene exactamente 0 o 2 hijos.
Guardado un byte mediante el formato de cadena.
fuente
Stax ,
1311 bytesEjecutar y depurarlo
Ahorré dos bytes cuando me di cuenta de que las entradas se pueden evaluar de manera implícita como literales de matriz. Al eliminar las comillas dobles, la entrada se simplifica.
La idea general es evaluar la entrada como un literal de matriz y mapear recursivamente los elementos para verificar el equilibrio parental. Si la afirmación final falla alguna vez, habrá un pop posterior en una pila vacía. En stax, aparecer con pilas vacías termina inmediatamente el programa.
Desempaquetado, sin golf y comentado, se ve así.
Ejecute este
fuente
Java 10,
99969583 bytesEl puerto de mi respuesta 05AB1E (también regresa
()
como verdadero y cualquier otra cosa como falsey).Pruébalo en línea.
Explicación:
return s;
puede serreturn"()".equals(s);
si se requiere un resultado booleano real.fuente
!s.contains("()()(")