fork download
  1. import sys
  2.  
  3.  
  4. def addToLevel(name, levelwise, level, number):
  5. if(name.strip()):
  6. if(number == 0):
  7. number = 1
  8. levelwise[level][name] = number
  9.  
  10.  
  11. def atomprinter(atoms):
  12. for atom in atoms:
  13. print(atom + ": " + str(atoms[atom]))
  14.  
  15.  
  16. def getNumber(formula, start):
  17. number = 0
  18. for index in range(start, len(formula)):
  19. if(formula[index].isdigit()):
  20. number = number * 10 + int(formula[index])
  21. else:
  22. return number, index
  23. return number, index + 1
  24.  
  25.  
  26. def getElement(formula, start):
  27. if start == len(formula) - 1:
  28. return formula[start], len(formula)
  29. if(formula[start + 1].islower()):
  30. return formula[start:start + 2], start + 2
  31. else:
  32. return formula[start], start + 1
  33.  
  34.  
  35. def mergeLevel(levelWise, level, number):
  36. if(number == 0):
  37. number = 1
  38. previous = levelWise[level - 1]
  39. current = levelWise[level]
  40. for key in current:
  41. if(key in previous):
  42. previous[key] += (number * current[key])
  43. else:
  44. previous[key] = current[key] * number
  45. levelWise.pop(level)
  46. return levelWise
  47.  
  48.  
  49. def atomfinder(formula):
  50. formula = formula.strip()
  51. levelwise = {}
  52. levelwise[0] = {}
  53. level = 0
  54. name = ''
  55. number = 0
  56. index = 0
  57. while index >= 0 and index < len(formula):
  58. char = formula[index]
  59. if(char == '('):
  60. addToLevel(name, levelwise, level, number)
  61. name = ''
  62. level += 1
  63. levelwise[level] = {}
  64. index += 1
  65. elif(char == ')'):
  66. addToLevel(name, levelwise, level, number)
  67. number = 0
  68. name = ''
  69. if(index < len(formula) - 1):
  70. if(formula[index + 1].isdigit):
  71. number, index = getNumber(formula, index + 1)
  72. else:
  73. index += 1
  74. else:
  75. index += 1
  76. levelwise = mergeLevel(levelwise, level, number)
  77. level -= 1
  78. elif(char.isupper()):
  79. addToLevel(name, levelwise, level, number)
  80. name = ''
  81. number = 0
  82. name, index = getElement(formula, index)
  83. elif(char.isdigit()):
  84. number, index = getNumber(formula, index)
  85. addToLevel(name, levelwise, level, number)
  86. atomprinter(levelwise[0])
  87.  
  88.  
  89. def main():
  90. for formula in sys.stdin:
  91. atomfinder(formula.strip())
  92.  
  93. if __name__ == '__main__':
  94. main()
Success #stdin #stdout 0s 23304KB
stdin
Standard input is empty
stdout
Standard output is empty