Уведомления

Группа в Telegram: @pythonsu

#1 Март 26, 2010 00:49:08

Alex_Kutsan
От:
Зарегистрирован: 2010-03-25
Сообщения: 150
Репутация: +  0  -
Профиль   Отправить e-mail  

Программа определения ФАВ в строке

вот немного подкоректировал, теперь он мне говорит что разность скобок = 1 , на последнем символе.

def COUNT(n):
k=h=m=d=0
while h!=1:
if n[d]=="(":
k=k+1
d=d+1
elif n[d]==")":
m=m+1
d=d+1
else:
d=d+1
while n[d]!= ")":
if n[d]=="(":
k=k+1
d=d+1
elif n[d]==")":
m=m+1
d=d+1
else:
d=d+1
h=k-m
return d
кажется это изза ещё одного вложеного цикла, но как сделать без него я не могу придумать



Отредактировано (Март 26, 2010 00:50:48)

Офлайн

#2 Март 26, 2010 01:04:25

Alex_Kutsan
От:
Зарегистрирован: 2010-03-25
Сообщения: 150
Репутация: +  0  -
Профиль   Отправить e-mail  

Программа определения ФАВ в строке

О! кажется получилось

>>> n
'(((!x)>x)_((!y)=(!x)))'
>>> def COUNT(n):
k=h=m=d=0
j=1
while h!=1:
if n[d]=="(":
k=k+1
d=d+1
elif n[d]==")":
m=m+1
d=d+1
else:
d=d+1
while n[j]!= ")":
if n[j]=="(":
k=k+1
j=j+1
d=d+1
elif n[d]==")":
m=m+1
d=d+1
j=j+1
else:
d=d+1
j=j+1
h=k-m
return d

>>> COUNT(n)
9
>>> n[:9]
'(((!x)>x)'
Но теперь проблема,
ведь такой случай если n='(((!x) >=x)_((!y)=(!x)))' программа тоже обработает и даже не заикнётся,а в решении это будет ошибка. Как обработать такое исключение?



Отредактировано (Март 26, 2010 01:06:39)

Офлайн

#3 Март 26, 2010 05:52:23

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

Программа определения ФАВ в строке

О! Программирование методом Монте-Карло!!! Я преклоняюсь пред Вами, Мастер…



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#4 Март 26, 2010 10:57:25

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Программа определения ФАВ в строке

В первом цикле напрочь отсутствует изменение условия выхода. Он бесконечен.
Попытайтесь переписать это на Python :)



Офлайн

#5 Март 26, 2010 11:52:27

Zubchick
От:
Зарегистрирован: 2009-07-08
Сообщения: 613
Репутация: +  0  -
Профиль   Отправить e-mail  

Программа определения ФАВ в строке

скобочки считаются элементарно.

brackets = 0
# Считаем скобочки
for letter in string:
if letter == '(':
brackets += 1
elif letter == ')':
brackets -= 1

if brackets != 0:
print "Ошибка! Ошибка!"



Отредактировано (Март 26, 2010 11:54:39)

Офлайн

#6 Март 26, 2010 16:12:56

Alex_Kutsan
От:
Зарегистрирован: 2010-03-25
Сообщения: 150
Репутация: +  0  -
Профиль   Отправить e-mail  

Программа определения ФАВ в строке

Спасибо, я совеошенно забыл про циклы for, но к сожалению этот код мне не совсем подходит.
если его проанализировать на функции например n= "(((!x)>x)_((!y)=(!x))) и цикл выполнится. Но всё что он сделал то это сказал что количество открыывающихся скобок = количеству закрывающихся, а для этого подходит и такая функция ()()()()()()()x(), которая уже не является ФАВ т.к тут просто скобки без выражения и действий, Я возьму вашу функцию на заметку в начале программы, чтоб следуйщий оператор по напрасну не работал с функцией где разница скобок != 0

PooH
О! Программирование методом Монте-Карло!!! Я преклоняюсь пред Вами, Мастер…
это наверно сарказм,я если чесно не сильно понял вашего выражения, я знаю конечно у меня код слегка Индуский. Я сейчас выложу код с коментариями, чтобы было понятней что я хотео им сделать.

>>> n
'(((!x)>x)_((!y)=(!x)))' # Я задал высказывание
>>> def COUNT(n): # Чоб определить Фав оно или не фав мне надо разбить его ещё на 2 высказывания, в том месте где
#личество открывающихся скобок на 1 больше чем закрывающихся( кроме 1 скобки)
k=h=m=d=0 # задаю нужные мне перемен. k=откр скобки, m=закр, d=колво симв. которые прошол цикл. h=k-m
j=1 # j мне понадобится во вложеном цикле чтоб предотвратить такую разность скобок как 1-0 =1,
while h!=1: # В конце цикла я сделал h как кол-во откр - кол-во закр скобок, и циклмпродолж. пока эта разность !=1
if n[d]=="(":
k=k+1
d=d+1
elif n[d]==")": # я щитаю откр скобки и закр скобки, если же это не скобки то он просто переходит не след символ
m=m+1
d=d+1
else:
d=d+1
while n[j]!= ")": # а вот решение проблемы 1 откр скобки, ведь сразу после неё будет k=1,m=0,h=k-m=1-0=1 и цикл
if n[j]=="(": # прекратится, я создал вложеный цикл который перемещяется по симв. пока не встретит закр. скоб.
k # условия оператора подщёта скобок теже самые, но встретив 1 закр скобку, проблема
j=j+1 # вида k=1,m=0,h=k-m=1-0=1 решится, и вложеный цикл закончится.
d=d+1
elif n[d]==")":
m=m+1
d=d+1
j=j+1
else:
d=d+1
j=j+1
h=k-m # после подщёта циклом скобок от отнимает от откр - закр когда эта разность стнет 1 цикл прекратится
return d # и выдаст мне номер той скобки , на которой разность открытых и закрытых станет 1.
>>> COUNT(n)
9
>>> n[:9]
'(((!x)>x)' # как видно всё правильно, колво откр=3, закр=2, 3-2=1
#теперь нужно в месте d разбить функцию на 2, до d и после d, отвросить у этих функций крайние скобки и проделать с каждой из них тоже самое, пока не дойдём до отсуствия скобок. А там начнутся основные сложности.



Офлайн

#7 Март 26, 2010 22:18:31

sypper-pit
От: Ulan-Ude(msk)
Зарегистрирован: 2009-01-30
Сообщения: 1102
Репутация: +  6  -
Профиль   Отправить e-mail  

Программа определения ФАВ в строке

Alex_Kutsan
а модуль math и аналоги чем не устраивают ?

Офлайн

#8 Март 26, 2010 23:38:18

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Программа определения ФАВ в строке

Что-нибудь типо такого подойдет?

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"
По крайней мере у меня заработало вот это:
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



Офлайн

#9 Март 27, 2010 08:24:00

rerednaW
От:
Зарегистрирован: 2010-03-13
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Программа определения ФАВ в строке

Alex_Kutsan
это наверно сарказм,я если чесно не сильно понял вашего выражения, я знаю конечно у меня код слегка Индуский. Я сейчас выложу код с коментариями, чтобы было понятней что я хотео им сделать.
Я конечно не знаком с современными методами преподавания, но, по-моему, задача сводится к простейшему парсеру на базе yacc. Под Питон есть PLY, и соответственно, совсем простой пример http://www.dabeaz.com/ply/example.html

А программирование методом Монте-Карло - это сильно… :-)



Офлайн

#10 Март 27, 2010 10:27:41

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Программа определения ФАВ в строке

Он же студент. Готовое решение на основе PLY или другой библиотеки его не устроит. По крайней мере если бы я был преподом, то не принял бы.
Судя по крикам ‘СРОЧНО!’ экзамен уже сегодня-завтра-в понедельник.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version