fork download
  1. # Element Counter, den510, 6/2/17
  2. table = {"H" => "Hydrogen",
  3. "He" => "Helium",
  4. "Li" => "Lithium",
  5. "Be" => "Beryllium",
  6. "B" => "Boron",
  7. "C" => "Carbon",
  8. "N" => "Nitrogen",
  9. "O" => "Oxygen",
  10. "F" => "Fluorine",
  11. "Ne" => "Neon",
  12. "Na" => "Sodium",
  13. "Mg" => "Magnesium",
  14. "Al" => "Aluminium",
  15. "Si" => "Silicon",
  16. "P" => "Phosphorus",
  17. "S" => "Sulfur",
  18. "Cl" => "Chlorine",
  19. "Ar" => "Argon",
  20. "K" => "Potassium",
  21. "Ca" => "Calcium",
  22. "Sc" => "Scandium",
  23. "Ti" => "Titanium",
  24. "V" => "Vanadium",
  25. "Cr" => "Chromium",
  26. "Mn" => "Manganese",
  27. "Fe" => "Iron",
  28. "Co" => "Cobalt",
  29. "Ni" => "Nickel",
  30. "Cu" => "Copper",
  31. "Zn" => "Zinc",
  32. "Ga" => "Gallium",
  33. "Ge" => "Germanium",
  34. "As" => "Arsenic",
  35. "Se" => "Selenium",
  36. "Br" => "Bromine",
  37. "Kr" => "Krypton",
  38. "Rb" => "Rubidium",
  39. "Sr" => "Strontium",
  40. "Y" => "Yttrium",
  41. "Zr" => "Zirconium",
  42. "Nb" => "Niobium",
  43. "Mo" => "Molybdenum",
  44. "Tc" => "Technetium",
  45. "Ru" => "Ruthenium",
  46. "Rh" => "Rhodium",
  47. "Pd" => "Palladium",
  48. "Ag" => "Silver",
  49. "Cd" => "Cadmium",
  50. "In" => "Indium",
  51. "Sn" => "Tin",
  52. "Sb" => "Antimony",
  53. "Te" => "Tellurium",
  54. "I" => "Iodine",
  55. "Xe" => "Xenon",
  56. "Cs" => "Cesium",
  57. "Ba" => "Barium",
  58. "La" => "Lanthanum",
  59. "Ce" => "Cerium",
  60. "Pr" => "Praseodymium",
  61. "Nd" => "Neodymium",
  62. "Pm" => "Promethium",
  63. "Sm" => "Samarium",
  64. "Eu" => "Europium",
  65. "Gd" => "Gadolinium",
  66. "Tb" => "Terbium",
  67. "Dy" => "Dysprosium",
  68. "Ho" => "Holmium",
  69. "Er" => "Erbium",
  70. "Tm" => "Thulium",
  71. "Yb" => "Ytterbium",
  72. "Lu" => "Lutetium",
  73. "Hf" => "Hafnium",
  74. "Ta" => "Tantalum",
  75. "W" => "Tungsten",
  76. "Re" => "Rhenium",
  77. "Os" => "Osmium",
  78. "Ir" => "Iridium",
  79. "Pt" => "Platinum",
  80. "Au" => "Gold",
  81. "Hg" => "Mercury",
  82. "Tl" => "Thallium",
  83. "Pb" => "Lead",
  84. "Bi" => "Bismuth",
  85. "Po" => "Polonium",
  86. "At" => "Astatine",
  87. "Rn" => "Radon",
  88. "Fr" => "Francium",
  89. "Ra" => "Radium",
  90. "Ac" => "Actinium",
  91. "Th" => "Thorium",
  92. "Pa" => "Protactinium",
  93. "U" => "Uranium",
  94. "Np" => "Neptunium",
  95. "Pu" => "Plutonium",
  96. "Am" => "Americium",
  97. "Cm" => "Curium",
  98. "Bk" => "Berkelium",
  99. "Cf" => "Californium",
  100. "Es" => "Einsteinium",
  101. "Fm" => "Fermium",
  102. "Md" => "Mendelevium",
  103. "No" => "Nobelium",
  104. "Lr" => "Lawrencium",
  105. "Rf" => "Rutherfordium",
  106. "Db" => "Dubnium",
  107. "Sg" => "Seaborgium",
  108. "Bh" => "Bohrium",
  109. "Hs" => "Hassium",
  110. "Mt" => "Meitnerium",
  111. "Ds" => "Darmstadtium",
  112. "Rg" => "Roentgenium",
  113. "Cn" => "Copernicium",
  114. "Uut" => "Ununtrium",
  115. "Fl" => "Flerovium",
  116. "Uup" => "Ununpentium",
  117. "Lv" => "Livermorium",
  118. "Uus" => "Ununseptium",
  119. "Uuo" => "Ununoctium"
  120. }
  121.  
  122. def count_elements(input)
  123. atoms, elements, e_num_scan, e_scan = {}, [], /([A-Z][a-z]{0,2})(\d?)/, /[A-Z][a-z]{0,2}\d?/
  124. input.scan(/\([\w\d]+\)?\d*/).each do | molecule | # scanning for molecules
  125. input.slice!(molecule) # Remove molecule from equation
  126. molecule.scan(/\)(\d)/) # looking for multiplier
  127. $1 == '' ? multiplier = 1 : multiplier = $1.to_i
  128. molecule.scan(e_scan).each do |ely| # looking for elements in molecule
  129. ely.scan(e_num_scan) # breaking up element into element and multiplier
  130. $2 == '' ? elements << $1 + multiplier.to_s : elements << $1 + ($2.to_i * multiplier).to_s
  131. end end
  132. elements.concat input.scan(e_scan) # adding in the remaining elements
  133. elements.each do | element |
  134. element.scan(e_num_scan) # breaking element into element and number
  135. $2 == '' ? num = 1 : num = $2.to_i
  136. atoms.key?($1) ? atoms[$1] = atoms[$1] + num : atoms[$1] = num
  137. end
  138. return atoms
  139. end
  140.  
  141. ["CCl2F2", "NaHCO3", "C4H8(OH)2", "PbCl(NH3)2(COOH)2"].each do |formula|
  142. puts '', formula, '-'*20
  143. count_elements(formula).each do |key, value|
  144. puts table[key].ljust(14) + ':' + value.to_s.rjust(5)
  145. end end
Success #stdin #stdout 0.01s 28320KB
stdin
Standard input is empty
stdout
CCl2F2
--------------------
Carbon        :    1
Chlorine      :    2
Fluorine      :    2

NaHCO3
--------------------
Sodium        :    1
Hydrogen      :    1
Carbon        :    1
Oxygen        :    3

C4H8(OH)2
--------------------
Oxygen        :    2
Hydrogen      :   10
Carbon        :    4

PbCl(NH3)2(COOH)2
--------------------
Nitrogen      :    2
Hydrogen      :    8
Carbon        :    2
Oxygen        :    4
Lead          :    1
Chlorine      :    1