zoukankan      html  css  js  c++  java
  • 2019年12月CSP考试第三题化学方程式解法

    2019年12月CSP考试第三题化学方程式解法

    import sys
    import re
    
    
    def merge(m1, m2):
        for key in m1.keys():
            if key in m2.keys():
                m2[key] += m1[key]
            else:
                m2[key] = m1[key]
        return m2
    
    
    def mul_formula(coef, formula):
        for key in formula.keys():
            formula[key] *= coef
        return formula
    
    
    def equation(s):
        expr_left, expr_right = s.split("=")
        ret_l, ret_r = {}, {}
        for sub in expr_left.split("+"):
            coef, formula = expr(sub)
            formula = mul_formula(coef, formula)
            ret_l = merge(ret_l, formula)
        for sub in expr_right.split("+"):
            coef, formula = expr(sub)
            formula = mul_formula(coef, formula)
            ret_r = merge(ret_r, formula)
        if ret_l == ret_r:
            return "Y"
        else:
            return "N"
    
    
    def expr(s):
        coef, s = get_coef(s)
        formula = get_formula(s)
        return coef, formula
    
    
    def get_coef(s: str):
        if len(s) == 0:
            return 1, ""
        for i, c in enumerate(s):
            if c.isdigit() == False:
                if i == 0:
                    return 1, s
                else:
                    return int(s[:i]), s[i:]
        return int(s), ""
    
    
    def get_formula(s: str):
        sp = s
        ret = {}
        while(len(sp)):
            term, sp = get_term(sp)
            coef, sp = get_coef(sp)
            term = mul_formula(coef, term)
            ret = merge(ret, term)
        return ret
    
    
    def get_term(s: str):
        if s[0] == "(":
            i = 0
            lp = 0
            while True:
                if s[i] == "(":
                    lp += 1
                if s[i] == ")":
                    lp -= 1
                if lp == 0 and i != 0:
                    break
                else:
                    i+=1
            formula = s[1:i]
            remain = s[i+1:]
            return get_formula(formula), remain
        else:
            return get_element(s)
    
    
    def get_element(s: str):
        if len(s) >= 2:
            if s[1].islower():
                return {s[:2]: 1}, s[2:]
        return {s[0]: 1}, s[1:]
    
    
    if __name__ == "__main__":
        n = int(input())
        for i in range(n):
            eq = input()
            print(equation(eq))
        # print("H2+O2=H2O")
        # print(equation("H2+O2=H2O"))
        # print("2H2+O2=2H2O")
        # print(equation("2H2+O2=2H2O"))
        # print("H2+Cl2=2NaCl")
        # print(equation("H2+Cl2=2NaCl"))
        # print("H2+Cl2=2HCl")
        # print(equation("H2+Cl2=2HCl"))
        # print("CH4+2O2=CO2+2H2O")
        # print(equation("CH4+2O2=CO2+2H2O"))
        # print("CaCl2+2AgNO3=Ca(NO3)2+2AgCl")
        # print(equation("CaCl2+2AgNO3=Ca(NO3)2+2AgCl"))
        # print("3Ba(OH)2+2H3PO4=Ba3(PO4)2+6H2O")
        # print(equation("3Ba(OH)2+2H3PO4=Ba3(PO4)2+6H2O"))
        # print("3Ba(OH)2+2H3PO4=6H2O+Ba3(PO4)2")
        # print(equation("3Ba(OH)2+2H3PO4=6H2O+Ba3(PO4)2"))
        # print("4Zn+10HNO3=4Zn(NO3)2+NH4NO3+3H2O")
        # print(equation("4Zn+10HNO3=4Zn(NO3)2+NH4NO3+3H2O"))
        # print("4Au+8NaCN+2H2O+O2=4Na(Au(CN)2)+4NaOH")
        # print(equation("4Au+8NaCN+2H2O+O2=4Na(Au(CN)2)+4NaOH"))
        # print("Cu+As=Cs+Au")
        # print(equation("Cu+As=Cs+Au"))
    
  • 相关阅读:
    VS中编码格式的问题(待总结)
    第一次搭建Eureka服务器的虐心之路
    Eureka相关
    【移动开发】SparseArray替代HashMap
    【移动开发】plurals
    皮尔森相似度计算举例(R语言)
    据说,年薪百万的程序员,都是这么开悟的
    RDD:基于内存的集群计算容错抽象
    使用IDEA运行Spark程序
    scala for spark
  • 原文地址:https://www.cnblogs.com/huangdong2000/p/12430947.html
Copyright © 2011-2022 走看看