python (渣打马拉松大赛)

题目:http://blog.csdn.net/mrpre/article/details/9765979

题目就加减,挺简单的,所以没通过后缀表达式解析

现在已经写好了 中缀转后缀 表达式的解析算法。比赛结束后再贴出来。

#此程序:在解释器版本Python 2.7.3 中通过
#假设1:不知道规则,不知道规则个数,不知道规则单位类型,
#假设2:不知道计算个数,不知道计算单位类型,不知道加减运算符个数
#仅加减,无优先级,故无需采用堆栈计算出后缀表达式的方法,来解析算术表达式,采用递归解析即可

#WARNING:
#官方给的题目(input.txt)有问题
#按英美通行的一些格式规则,大于1或小于-1,单位用复数;-1和1之间,用单数。
#但是实际运用中,英语国家习惯是只有等于1或-1时用单数,其余都用复数,
#但在github给出的input文件中,却综合出现。例如出现了 "0.15 yard" 以及"0.9 miles"


#file start

global line #Limit the number of lines

#functiuon used to add/open "input.txt" to list(initialization ) 
def init():
    list_tmp=[]
    split_tmp=split=0
    for line in open("input.txt") :
        if (line!='\n'):
            list_tmp.append(line)
            split_tmp=split_tmp+1
        else:
            split=split_tmp
    return list_tmp,split

#add new rule to dict ,promote the ability to mach
def renew(dic_rule):
    list_tmp=[]
    for i in dic_rule:
        list_tmp.append(i)
    for i in list_tmp:
        dic_rule[i[0:len(i)-1]]=dic_rule[i]
    return dic_rule

#extract rule
def extractrule(list_rule):
    dict_tmp={}
    for i in list_rule:
        number_eql=i.index("=")
        number_unitm=i.index("m\n")
        dict_tmp[i[2:(number_eql-1)]]=i[(number_eql+2):(number_unitm-1)]
    return dict_tmp


#calculator
def calculator(list_quen):
   global line
   line=0
   for i in list_quen:
       if i.find("+")>0 or i.find("-")>0:
           compute(i)
           line=line+1
       else:
           answer=convert(i)
           answer=round(answer,2)
           line=line+1
           fp.write(str(answer)+" m\n") 

             
#convert
def convert(i):
    sp=i.find(" ")
    length=len(i)
    if(i[length-1]==" "or i[length-1]=="\n"): #forma unit
        unit=i[sp+1:length-1]
    else:
        unit=i[sp+1:length]
        
    value=i[0:sp]
    value=value.replace(" ","")#forma value
    value=eval(value)
    
    if unit=="feet" or unit=="inches":
        if unit=="feet":unit="foot"
        if unit=="inches":unit="inch"
    else:
        unit=unit[0:len(unit)-1]
        
    answer=eval(dic_rule[unit])*value
    return answer


#change (recursive function)
def change(st):
    global answer_change
    if(st.count("+ ")>1 and st.count("- ")==0):
        list_tmp=st.split("+ ")
        change(str(list_tmp[0]))
        change(str(list_tmp[1]))
        
    if(st.count("+ ")==0 and st.count("- ")>1):
        list_tmp=st.split("+ ")
        change(str(list_tmp[0]))
        change(str(list_tmp[1]))
        
    if(st.count("+ ")==1 and st.count("- ")==0):
        list_tmp=st.split("+ ")
        answer=convert(list_tmp[0])+convert(list_tmp[1])
        answer_change=answer_change+answer
    if(st.count("- ")==1 and st.count("+ ")==0):
        list_tmp=st.split("- ")
        answer=convert(list_tmp[0])-convert(list_tmp[1])
        answer_change=answer_change+answer
    if(st.count("+ ")==0 and st.count("- ")==0):
        st_tmp=convert(st)
        answer_change=answer_change+st_tmp
    if(st.count("+ ")>0 and st.count("- ")>0):
        list_tmp=st.split("+ ")
        change(str(list_tmp[0]))
        change(str(list_tmp[1]))


#add and substract
def compute(i):
    global answer_change
    global line
    afchange_str=change(i)
    answer_change=round(answer_change,2)#with accuracy of 2 decimal points
    fp.write(str(answer_change)+" m")#output to "output.txt"
    if line<len(list_quen)-1:
        fp.write("\n")                 #Don't add "\n" to last line 
    answer_change=0#reset answer_change ,preparing for next question

#output personal information
def outputinfo():
    fp.write("mrpre@163.com \n\n")


#main
fp=open("output.txt","w")
answer_change=0 #global variability used to conserve the answer

list_main=init()#init
split=list_main[1]
length=len(list_main[0])

list_rule=list_main[0][0:split]#extract information about rule to list
list_quen=list_main[0][split:length]#generate question to list
dic_rule=extractrule(list_rule) #generate rule to dict
dic_rule=renew(dic_rule) #采用模糊匹配(允许结尾字母的出错)

outputinfo()    #output personal info
calculator(list_quen)   #compute
fp.close()  #close output.txt
#file end
#print 
#print "ALL:",list_main
#print "RULE origin:",list_rule
#print "RULE answer:",dic_rule
#print "quen:",list_quen


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
【数据可视化有什么意义?】 举一个身边的例子,我们平时在电视上看到的天气预报,会用不同的色块代表不同地区的气温、降水情况。通过观察区域色块分,我们可以马上了解哪里气温高,哪里雨水多。 这种数形结合的形式,让我们更容易抓住重点信息,比枯燥的文字、简单表格更有吸引力。 数据可视化,就是让数据分析的结果以最直观的方式呈现,将“孤独”的数据联系起来,让“单调”的数据生动起来。通过观察可视化图表,数据之间的关联、变化一目了然。 【“无处不在”的数据分析与可视化】 一图胜千言,数据分析与可视化如今在我们的工作和生活中处处可见,职场中90%以上的岗位都会跟数据打交道。掌握数据分析与可视化技能,可以极大提升工作效率。 【4.5小时极速提升数据能力数据小白也能轻松上手】 Python数据分析与可视化的学习,重在实操,空谈语法毫无意义。 本课程着重讲解数据分析与可视化工具的实操应用,结合实战案例,带你边学边练,重点知识充分理解。 四大案例结合实际场景,帮助你加深记忆,并且在日后的求职面试或毕业设计中,这些案例都可以复用。 【通解数据科学 拓宽收益渠道】 如今,许多行业都有数据方向的人才需求。 掌握数据分析与可视化技能,你就可以: 【适用人群】 【三重权益】

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值