|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 BeiLou 于 2016-3-26 13:23 编辑
求帮我看看这个题,我写了自己的理解,希望大家帮助
这个题的要求是输入一个参数数量(arity)和一个term;比较输入的term中的参数数量是否等于之前输入的参数数量。
举几个例子,例如输入了arity ==1 , term : function_one(hello), 由于term确实只有一个参数,则正确
arity ==2 , term: F(g( a, a ), f (a, b)) , f和g各有两个参数,F也有两个参数(即g和f)所以也正确
复杂点的测试用例
要求term只能包含字母,下划线,逗号,括号,空格
import sys
def is_syntactically_correct(term, arity):
#代码
try:
arity = int(input('Input an arity : '))
if arity < 0:
raise ValueError
except ValueError:
print('Incorrect arity, giving up...')
sys.exit()
print('A term should contain only letters, underscores, commas, parentheses, spaces.')
term = input('Input a term: ')
if is_syntactically_correct(term, arity):
print('Good, the term is syntactically correct.')
else:
print('Unfortunately, the term is syntactically incorrect.')
我的想法是遍历term中的括号,即先找到所以左括号,当找到第一个右括号时则可以确定第一个右括号和最后一个左括号的内容,len其长度,与arity相比,以此类推。感觉像是把term分成不同的级别,从最里面的部分向外进行测量和比较。。。
然而我琢磨了半天。。。写不出代码。。。实在是菜。。。
值得注意的是,arity ==0,term:constant ,这样对的,但()就不对
还有怎么控制term中若出现 [ ]中括号,{}大括号啊,数字啊之类的就全部报错。。。这个我也闹不明白
测试用例如图
本帖最后由 挥舞乾坤 于 2016-3-27 10:40 编辑 import re
import sys
##test3 = 'ff(ff(ff(a,b,ff( aa, bb, cc )),b,ff( a,b, c)),b,ff(a,ff(a,b,c),c))'
##test2 = 'F(g( a, a ), f (a, b)) '
##test1 = 'function_one(hello)'
def is_syntactically_correct(term, arity):
r = re.compile('\s*\w+\s*\((\s*\w*\s*,){%s}\s*\w*\s*\)' % str(arity - 1))
def check(s):
if s.strip():
s1 = r.sub('',s)
if s == s1:
return False
else:
return check(s1)
return True
if arity == 0 and '(' not in term and ')' not in term:
return True
else:
return check(term)
if __name__ == '__main__':
try:
arity = int(input('Input an arity : '))
if arity < 0:
raise ValueError
except ValueError:
print('Incorrect arity, giving up...')
sys.exit()
print('A term should contain only letters, underscores, commas, parentheses, spaces.')
term = input('Input a term: ')
if is_syntactically_correct(term, arity):
print('Good, the term is syntactically correct.')
else:
print('Unfortunately, the term is syntactically incorrect.')
勉强测试通过arity == 0,很牵强的办法,加了个判断而已,期待更好的办法吧
多加了这歌判断: if arity == 0 and '(' not in term and ')' not in term:
return True
else:
return check(term)
|
-
|