Nawiasy w Java, Python + lambda

Tytuł posta wygląd na przypadkowy zlepek słów :) Ma jednak sens, który zamierzam pokazać w poniższym poście. Zacznijmy jednak od początku. Na ostatnich zajęciach z podstaw programowania mieliśmy napisać (za dodatkowego plusa) program, którego zadaniem będzie określenie czy w wyrażeniu matematycznym są poprawnie rozmieszczone nawiasy. Udało mi się coś wymodzić, ba nawet dostałem plusa (co wydaje się być niemożliwe przy prowadzącym zajęcia). Jednak jak zwykle prowadzący napisał kod na tablicy ładniejszy. Jeśli jest ktoś zainteresowany to przedstawiam program w wersji Java (odmiana tablicowa :P )

boolean nawiasyOK(String wyr){
   int lic = 0;
   for(int i=0; i < wyr.length() && lic>=0; i++)
   if(wyr.charAt(i) == '(' ) lic++;
   else if(wyr.charAt(i) == ')' ) lic--;
   return lic ==0;
}


Dzisiejszego wieczoru postanowiłem nauczyć się czegoś nowego o programowaniu, wybierając do tego mój ulubiony język, czyli Pythona. Postarałem się przyswoić sobie zakres wiedzy związany z programowaniem funkcyjnym i wyrażeniami lambda. Po przeczytaniu krótkiego wstępu teoretycznego na stronie pl.wikipedia.org i napisaniu paru jakże przydatnych skryptów w stylu:

a = lambda : x**2a(23)

Postanowiłem trochę poszaleć i przepisać powyższy program pod pythona używając tylko i wyłącznie wyrażenia lambda. Później okazało się, że muszę podzielić to na kilka funkcji i użyć listy składanej jako pomocy. Oto wynik moich zmagań:

p=lambda str: [x=='(' and 1 or x==')' and -1 for x in str]
r=lambda w,s=0,i=0: s>-1 and i< len(w) and r(w, s+w[i], i+1) or str(s)
s=lambda x: int(r(p(x)))  == 0
s("(2+3)")

Funkcja p tworzy na podstawie napisu listę złożoną z 1 (gdy w oryginalnym wyrażeniu jest „(„) lub -1 (w przypadku „)”), pomijając pozostałe znaki.

Funkcja r sumuję rekurencyjnie wszystkie liczby z listy, sprawdzając czy nie pojawia się ujemna ich suma (co oznacza, że liczba nawiasów zamykających przewyższa ilość otwierających, co zaś jest ewidentnym błędem) i zwraca wynik w postaci napisu. Czemu tak robi, skoro następna zmienia z powrotem napis na liczbę ? Dlatego, że liczba 0 jest interpretowana przez pythona jako fałsz. Zamiana cyfry na tekst powoduje zwrócenie jej wartości, a nie podejmowanie próby określenia jej wartości logicznej.

Zdaje sobie sprawę, że napisanie tego przy pomocy prostej pętli było by dużo łatwiejsze, ale na pewno nie dostarczyłoby mi tyle satysfakcji ;)

Dodano 1.02.2k10 10:59 Jak człowiek śpi to przychodzą najlepsze rozwiązania. Tak więc po nocy spędzonej na podświadomym kombinowaniu przedstawiam powyższe zagadnienie jako jedną funkcję lambda:

l = lambda nap,s=0,i=0:s >-1 and i < len(nap) and ( nap[i]=='(' and l(nap, s+1, i+1) or nap[i]==')' and l(nap, s-1, i+1) or l(nap,s,i+1)) or s==0 and 1 or -1
Stron:

Napisz komentarz.


Informacja - możesz użyć HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Switch to our mobile site