Найти - Пользователи
Полная версия: Программа определения ФАВ в строке
Начало » Python для новичков » Программа определения ФАВ в строке
1 2 3 4 5
Griffon
Первое что написал спросонья:
class BrokenEgg(Exception):
pass

class Brain_breacker:
def __init__(self):
self.test_exp = ""
self.expect_operator = 0
self.braces = 0
self.operators = ("!", "&", "|", "==", "_")
self.operator_leters = ("!", "&", "|", "=", "_")
self.prefix_operators = ("!")
self.var_begining = ("x", "y")

def is_var(self, i):
if self.test_exp[i] in ("x", "y"):
return True

def add_var(self, i):
return i+1

def check_operator_expection(self, i):
if self.expect_operator:
raise BrokenEgg("Expect operator after '%s'." % self.test_exp[:i])

def check_other_expection(self, i):
if not self.expect_operator:
if self.test_exp[i] in self.prefix_operators:
return True
raise BrokenEgg("Don't expect operator after '%s'." % self.test_exp[:i])

def is_operator(self, i):
if self.test_exp[i] in self.operator_leters:
return True

def add_operator(self, i):
j = i
buf = ""
while self.test_exp[j] in self.operator_leters:
buf += self.test_exp[j]
j += 1
if buf in self.prefix_operators:
return j
if buf in self.operators:
return j
else:
raise BrokenEgg("Operator '%s' doesn't exist." % buf)

def start(self, expression):
self.test_exp = expression
i = 0
while i < len(self.test_exp):
#print i, " - ", self.test_exp[i], " - ", self.test_exp
if self.test_exp[i] == "(":
self.check_operator_expection(i)
self.braces += 1
self.expect_operator = False
i += 1
continue

if self.test_exp[i] == ")":
self.braces -= 1
self.expect_operator = True
i += 1
continue

if self.is_var(i):
self.check_operator_expection(i)
i = self.add_var(i)
self.expect_operator = True
continue

if self.is_operator(i):
self.check_other_expection(i)
self.expect_operator = False
i = self.add_operator(i)
continue

if self.test_exp[i] == " ":
i += 1
continue

raise BrokenEgg("Unexpectable simbol '%s'." % self.test_exp[i])

if self.braces:
raise BrokenEgg("Something wrong with braces.")
return True


def test(text, i = [0]):
i[0] += 1
print ">Test number %s:" % i[0]
print "Test expression is '%s'." % text
bb = Brain_breacker()
try:
bb.start(text)
print "It's allright with '%s'" % text
except BrokenEgg as e:
print e
print ""

test("(!x == y & x ! x & !(!x & !y))")
test("(!x + y & x ! x & !(!x & !y))")
test("(!x == y & x = x & !(!x & !y))")
test("(!x == (y) & (x ! x & !(!x & !y)))")
test("(!x == (y & (x ! x & !(!x & !y)))")
Потом глянул регулярку Ed'a, и она меня ввела в состояние прострации. :)
Ed
По какому поводу прострация? Не понравилось?

На всякий случай - парность скобок моя регулярка не проверяет. Но это я намеренно оставил студенту в качестве домашнего задания. Там на пару строк длиннее получится, либо можно попробовать расширить регулярку всякими look-ahead-ами.
Griffon
Наоборот, понравилось. :)
Ed
Ну вот. мы тут пишем-пишем, а студент совсем потерял интерес. Пытается выяснить как посчитать скобки в параллельном треде :)
Alex_Kutsan
Пересмотрев свою задачу я понял, что только скобками всё не решить,интерес я ни в коем случае не потерял.
Тут ещё очень много условий, просто я создал другую тему http://python.su/forum/viewtopic.php?id=6949, в которой обсуждаются новые условия, и сейчас кажется понял что скобки тут практически вобще не нужны, только в начале по минимому.
Alex_Kutsan
Ркбят спасибо Огромное, только я не совсем смог разобрать логику кода,
можете сделать комментарии? и ЧТО такое yacc и PLY , может я смогу их использоват ьхотябы для элементарного пдщёта скобок?
Да и мне ещё очень понравилась идея с мат формулами, но я не знаю тех функцих которые вы указали, и не сильно понял хелп питона,
можете расказать как они действуюТ?
Ed
В моем решении используется только re. Документация здесь: http://docs.python.org/library/re.html
Вы хотя бы попробуйте запустить, потестить. Подумать над кодом тоже не помешает. А что такое yacc и PLY вам гугл скажет не хуже здесь присутствующих.
Griffon
Мой код считает не только скобки. :)
Он даже скажет где в заданном выражении ошибка. И он достаточно гибкий чтобы задать нужные условия. Что не устраивает?
А регулярки это конечно жесть. Но боюсь что без бутылки тут не разобраться. ))
Alex_Kutsan
Знаете мне очеь понравился ваш ход решения:
def is_prop_formula(string):
def reduce(string):
result = re.sub("\(?&[A-Z]\)?|\(?[A-Z]>[A-Z]\)?|\(?[A-Z]<[A-Z]\)?|\(?[A-Z]=[A-Z]\)?|\(?[A-Z]_[A-Z]\)?|\([A-Z]\)", "X", string)
if result != string:
return reduce(result)
return result
return reduce(string) == "X"
Я всё пытаюсь разобратся в re.sub и в reduce , но у меня ничего не вышло, хелпы мне непомогают, в них что-то совсем непонятное наисано.
Что толком делают эти функции?
И кстати reduce у меня требует 2 аргумента, а вы емё предоставили 1.
Да и ещё это решение
In [1]: is_prop_formula("(A=B)>(&C<D)=C=T>Z")
Out[1]: True
In [2]: is_prop_formula("+(A=B)>(&C<D)=C=T>Z")
Out[2]: False
Во первых, скольно уже не переситываю хелпы и ту документацию, практически ничего я понять не могу. Почему ваша функция reduce работает с 1 переменной в функции а по одиночке не работает, и что толком делает re.sub.
Ну это ладно ещё, просто решение не верно

Т.к мы делаем функцию без правила экономии скобок( это условие)

Формуля является формулой только если
1. Неизвестные в ней являются символами определённого алфавита( ранее заданого)( но это не сложно написать)
2.Эти символы могут создавать формулу только таким способом
(&X), (X>Y), (X<Y),(X=Y),(X_Y) # насколько я понял вы опрераруете такими символами ?,&,\,-,| но я как не старался не смог оределить что из них что.
3. Вмето переменных можно поставить другую формулу, только в том случае если эта форула которую мы вставляем справедлива.

тоесть выражение вида (A=B)>(&C<D)=C=T>Z") будет являтся ошибкой.
Т.к. (&C) надо обязательно брать в скобки. И нельзя записать С=Т>Z
Если исправить:
(((A=B)>((&C)<D))=(C=(T>Z))) вот теперь правильно.
ТОесть я
1. Поставил самые большие внешние скобки
2. поставил скобки там где есть чтото типа С=К=Р.
3. взял скобки выражение (&C)

Я думаю что это можно задать, и думаю я смогк
Только обьясните мне принцип работы этой программы
def is_prop_formula(string):
def reduce(string):
result = re.sub("\(?&[A-Z]\)?|\(?[A-Z]>[A-Z]\)?|\(?[A-Z]<[A-Z]\)?|\(?[A-Z]=[A-Z]\)?|\(?[A-Z]_[A-Z]\)?|\([A-Z]\)", "X", string)
if result != string:
return reduce(result)
return result
return reduce(string) == "X"
Alex_Kutsan
Griffon, у вас инттересный ход, но я немного не могу проследить его
Во первых я ещё не толком не понимаю что такое class.
И немоглибы вы выыложить ваш код с коментариями
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB