[pyar] [OT] - Checkeando parentesis balanceados.

Fabian Ezequiel Gallina galli.87 en gmail.com
Sab Jun 19 02:05:20 ART 2010


El día 18 de junio de 2010 13:24, Mariano Garcia Berrotarán
<garcia.berrotaran en gmail.com> escribió:
> Hola listeros:
>
> el otro dia charlando con un compañero de trabajo, me contó que un
> ejercicio que toma en entrevistas, es el siguiente:
>
> escribir una función la cual recibe una cadena conformada unicamente
> por parentesis abiertos y cerrados.
> la funcion tiene que retornar un booleano representando si los
> parentesis estan balanceados o no.
>
> balanceados significa: todo parentesis que abre, corresponde a uno que cierra.
>
> casos validos: (()), (), ()(), ((())), ((()())) ...
> casos invalidos: )()), ((()) )( ...
>
> despues de jugar un rato yo lo resolví de esta forma:
>
> http://pastebin.com/5BHcxbDC
>
> mi pregunta es la siguiente:
>
> a alguien se le ocurre alguna forma de hacerlo usando list comprehension ?
>
> alguna forma chiflada de hacerlo?
>
>
> aca les dejo los unit tests para probarlo si quieren.
>
> http://pastebin.com/7En3UzBk
>

Forma en que la hubiera presentado:

def check_parens(string):
    checker = 0
    for char in string:
        if char == ")":
            checker -= 1
        elif char == "(":
            checker += 1
        if checker < 0:
            return False
    return checker == 0

Onliner marca gripe A para los objetivos del post:

def check_parens(s):
    return reduce(lambda t, v: len(s) if t < 0 else v + t, [1 if c ==
"(" else -1 for c in s]) == 0

Tests baratos:

assert check_parens("(") == False
assert check_parens(")") == False
assert check_parens(")()") == False
assert check_parens("((())))") == False
assert check_parens("(((()))") == False
assert check_parens(")((())))") == False
assert check_parens(")((()))(") == False
assert check_parens("()()")
assert check_parens("((((())))())")


Saludos resfriados,
-- 
Fabián E. Gallina
http://www.from-the-cloud.com



More information about the pyar mailing list