鱼C论坛

 找回密码
 立即注册
查看: 2455|回复: 14

[已解决]一个含金量较高的题,走过路过进来看看啊

[复制链接]
发表于 2016-3-25 18:45:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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)所以也正确

                                    复杂点的测试用例 11111111.png



     要求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中若出现 [ ]中括号,{}大括号啊,数字啊之类的就全部报错。。。这个我也闹不明白

   测试用例如图
22222.png
333333333.png
最佳答案
2016-3-27 10:39:21
本帖最后由 挥舞乾坤 于 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)
11111111.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-3-25 18:47:44 | 显示全部楼层
仔细想了想好像遍历括号的方法也不行啊怎么将一个复杂的元组给分清楚了,弄成一层套一层清楚的样子啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-26 10:12:10 | 显示全部楼层
@小甲鱼 @冬雪雪冬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-26 10:13:17 | 显示全部楼层
@小甲鱼 @冬雪雪冬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-26 10:57:46 | 显示全部楼层
栗子不明白,
arity ==3 ,  term:  F(g( a, a ), f (a, b))
这个为什么正确呢。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-26 13:23:17 | 显示全部楼层
wei_Y 发表于 2016-3-26 10:57
栗子不明白,
arity ==3 ,  term:  F(g( a, a ), f (a, b))
这个为什么正确呢。

打错了。。。是二,怎么@人啊。。。帮我@下小甲鱼和冬雪雪冬吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-26 14:04:34 | 显示全部楼层
BeiLou 发表于 2016-3-26 13:23
打错了。。。是二,怎么@人啊。。。帮我@下小甲鱼和冬雪雪冬吧

辣么,如果g有三个或者更多或更少参数算正确么。
@小甲鱼 @冬雪雪冬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-26 16:30:54 | 显示全部楼层
wei_Y 发表于 2016-3-26 14:04
辣么,如果g有三个或者更多或更少参数算正确么。
@小甲鱼 @冬雪雪冬

那就不对了,必须从最里到外都是3才对
你可以看看最后我贴的测试用例, 看一下就明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-26 18:22:28 | 显示全部楼层

回帖奖励 +8 鱼币

真是一个纠结的问题,纠结的问题用正则解决起来就更纠结(我正则超级差)
import re
##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))
    print(r)
    def check(s):
        if s.strip():
            s1 = r.sub('',s)
            if s == s1:
                return False
            else:
                return check(s1)
        return True
    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.')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-26 21:31:22 | 显示全部楼层
试了好久没有做出来。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-27 03:44:31 | 显示全部楼层
本帖最后由 bhsx 于 2016-3-27 04:41 编辑

去掉括号前的名字.然后转成元组,然后你懂得
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-27 08:17:27 | 显示全部楼层
挥舞乾坤 发表于 2016-3-26 18:22
真是一个纠结的问题,纠结的问题用正则解决起来就更纠结(我正则超级差)

虽然看不大明白,但大体的功能实现了,但是怎么限制term的输入符合要求,并且arity ==0 ,输入F 或者content这样的结果也是True呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-27 10:39:21 | 显示全部楼层    本楼为最佳答案   
本帖最后由 挥舞乾坤 于 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)

评分

参与人数 1荣誉 +6 鱼币 +6 收起 理由
wei_Y + 6 + 6 支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-27 10:50:33 | 显示全部楼层
BeiLou 发表于 2016-3-27 08:17
虽然看不大明白,但大体的功能实现了,但是怎么限制term的输入符合要求,并且arity ==0 ,输入F 或者cont ...

不太难懂,思路就是根据输入的arity,用正则匹配ff( , , )这样的形式,并替换成'',再用递归把替换完的字符串在1次匹配,直到结果为空,就算通过了,如果匹配不到,就False
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-27 13:08:29 | 显示全部楼层
import sys

def is_syntactically_correct(term, arity):
    import re
    term = re.sub(r'\s*', '', term)
    condition = re.compile(r'\((.*)\)')
    def find_args(term=term, arity=arity):

        result = re.findall(condition ,term)
        if result[0].count('(') != result[0].count(')'):
            return False
        len_result = len(result)
        if len_result == 0 and arity == 0:
            return True
        elif len_result != 0 and arity == 0:
            return False
        if '(' not in result[0]:
            lens = len(result[0].split(','))
            if lens == arity:
                return True
            else:
                return False

        judge = [0]
        trans = ''
        result_arg = []
        length = len(result[0])
        for i in range(length):
            trans += result[0][i]
            if result[0][i] == ',' and '(' not in trans:
                result_arg.append(trans[:-1])
                trans = ''
                judge = [0]
            if i == length-1:
                result_arg.append(trans)
            if len(judge) == 0:
                result_arg.append(trans)
                trans = ''
                judge = [0]
            if result[0][i] == '(' and judge[0] == 0:
                judge[0] = result[0][i]
            elif result[0][i] == '(' and judge[0] != 0:
                judge.append(result[0][i])
            elif result[0][i] == ')':
                judge.remove('(')
        if len(result_arg) == arity:
            for i in result_arg:
                if '(' in i:
                    return find_args(term=i, arity=arity)
                else:
                    return True
        else:
            return False
    return find_args()


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.')

笨办法实现。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 16:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表