[pyar] [OT] - Checkeando parentesis balanceados.

Esteban Ordano esteban en ordano.com.ar
Sab Jun 19 07:57:33 ART 2010


bueno... llegué tarde pero acá vá un oneliner para cuando hay chars en la
lista... con asquerosos ifs por todos lados :P

>>> bal = lambda x, y: False if y<0 else (y==0 if (len(x) == 0) else
bal(x[1:], y+(0 if x[0] not in ['(', ')'] else {'(':1, ')':-1}[x[0]])))

>>> tests = ['', '()', ')(', '(', '()()()', '((()))', '(()()())',
'((())(()))', '(234)']

>>> res = [True, True, False, False, True, True, True, True, True]

>>> [bal(a, 0) for a in tests] == res
True




Saludos,
Esteban


2010/6/19 Fabian Ezequiel Gallina <galli.87 en gmail.com>

> 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
> _______________________________________________
> pyar mailing list pyar en python.org.ar
> http://listas.python.org.ar/listinfo/pyar
>
> PyAr - Python Argentina - Sitio web: http://www.python.org.ar/
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20100619/8e708752/attachment.html>


More information about the pyar mailing list