# Element Counter, den510, 6/2/17
table = {"H" => "Hydrogen",
"He" => "Helium",
"Li" => "Lithium",
"Be" => "Beryllium",
"B" => "Boron",
"C" => "Carbon",
"N" => "Nitrogen",
"O" => "Oxygen",
"F" => "Fluorine",
"Ne" => "Neon",
"Na" => "Sodium",
"Mg" => "Magnesium",
"Al" => "Aluminium",
"Si" => "Silicon",
"P" => "Phosphorus",
"S" => "Sulfur",
"Cl" => "Chlorine",
"Ar" => "Argon",
"K" => "Potassium",
"Ca" => "Calcium",
"Sc" => "Scandium",
"Ti" => "Titanium",
"V" => "Vanadium",
"Cr" => "Chromium",
"Mn" => "Manganese",
"Fe" => "Iron",
"Co" => "Cobalt",
"Ni" => "Nickel",
"Cu" => "Copper",
"Zn" => "Zinc",
"Ga" => "Gallium",
"Ge" => "Germanium",
"As" => "Arsenic",
"Se" => "Selenium",
"Br" => "Bromine",
"Kr" => "Krypton",
"Rb" => "Rubidium",
"Sr" => "Strontium",
"Y" => "Yttrium",
"Zr" => "Zirconium",
"Nb" => "Niobium",
"Mo" => "Molybdenum",
"Tc" => "Technetium",
"Ru" => "Ruthenium",
"Rh" => "Rhodium",
"Pd" => "Palladium",
"Ag" => "Silver",
"Cd" => "Cadmium",
"In" => "Indium",
"Sn" => "Tin",
"Sb" => "Antimony",
"Te" => "Tellurium",
"I" => "Iodine",
"Xe" => "Xenon",
"Cs" => "Cesium",
"Ba" => "Barium",
"La" => "Lanthanum",
"Ce" => "Cerium",
"Pr" => "Praseodymium",
"Nd" => "Neodymium",
"Pm" => "Promethium",
"Sm" => "Samarium",
"Eu" => "Europium",
"Gd" => "Gadolinium",
"Tb" => "Terbium",
"Dy" => "Dysprosium",
"Ho" => "Holmium",
"Er" => "Erbium",
"Tm" => "Thulium",
"Yb" => "Ytterbium",
"Lu" => "Lutetium",
"Hf" => "Hafnium",
"Ta" => "Tantalum",
"W" => "Tungsten",
"Re" => "Rhenium",
"Os" => "Osmium",
"Ir" => "Iridium",
"Pt" => "Platinum",
"Au" => "Gold",
"Hg" => "Mercury",
"Tl" => "Thallium",
"Pb" => "Lead",
"Bi" => "Bismuth",
"Po" => "Polonium",
"At" => "Astatine",
"Rn" => "Radon",
"Fr" => "Francium",
"Ra" => "Radium",
"Ac" => "Actinium",
"Th" => "Thorium",
"Pa" => "Protactinium",
"U" => "Uranium",
"Np" => "Neptunium",
"Pu" => "Plutonium",
"Am" => "Americium",
"Cm" => "Curium",
"Bk" => "Berkelium",
"Cf" => "Californium",
"Es" => "Einsteinium",
"Fm" => "Fermium",
"Md" => "Mendelevium",
"No" => "Nobelium",
"Lr" => "Lawrencium",
"Rf" => "Rutherfordium",
"Db" => "Dubnium",
"Sg" => "Seaborgium",
"Bh" => "Bohrium",
"Hs" => "Hassium",
"Mt" => "Meitnerium",
"Ds" => "Darmstadtium",
"Rg" => "Roentgenium",
"Cn" => "Copernicium",
"Uut" => "Ununtrium",
"Fl" => "Flerovium",
"Uup" => "Ununpentium",
"Lv" => "Livermorium",
"Uus" => "Ununseptium",
"Uuo" => "Ununoctium"
}
def count_elements(input)
atoms, elements, e_num_scan, e_scan = {}, [], /([A-Z][a-z]{0,2})(\d?)/, /[A-Z][a-z]{0,2}\d?/
input.scan(/\([\w\d]+\)?\d*/).each do | molecule | # scanning for molecules
input.slice!(molecule) # Remove molecule from equation
molecule.scan(/\)(\d)/) # looking for multiplier
$1 == '' ? multiplier = 1 : multiplier = $1.to_i
molecule.scan(e_scan).each do |ely| # looking for elements in molecule
ely.scan(e_num_scan) # breaking up element into element and multiplier
$2 == '' ? elements << $1 + multiplier.to_s : elements << $1 + ($2.to_i * multiplier).to_s
end end
elements.concat input.scan(e_scan) # adding in the remaining elements
elements.each do | element |
element.scan(e_num_scan) # breaking element into element and number
$2 == '' ? num = 1 : num = $2.to_i
atoms.key?($1) ? atoms[$1] = atoms[$1] + num : atoms[$1] = num
end
return atoms
end
["CCl2F2", "NaHCO3", "C4H8(OH)2", "PbCl(NH3)2(COOH)2"].each do |formula|
puts '', formula, '-'*20
count_elements(formula).each do |key, value|
puts table[key].ljust(14) + ':' + value.to_s.rjust(5)
end end
IyBFbGVtZW50IENvdW50ZXIsIGRlbjUxMCwgNi8yLzE3CnRhYmxlID0geyJIIiA9PiAiSHlkcm9nZW4iLAoJIkhlIiA9PiAiSGVsaXVtIiwKCSJMaSIgPT4gIkxpdGhpdW0iLAoJIkJlIiA9PiAiQmVyeWxsaXVtIiwKCSJCIiA9PiAiQm9yb24iLAoJIkMiID0+ICJDYXJib24iLAoJIk4iID0+ICJOaXRyb2dlbiIsCgkiTyIgPT4gIk94eWdlbiIsCgkiRiIgPT4gIkZsdW9yaW5lIiwKCSJOZSIgPT4gIk5lb24iLAoJIk5hIiA9PiAiU29kaXVtIiwKCSJNZyIgPT4gIk1hZ25lc2l1bSIsCgkiQWwiID0+ICJBbHVtaW5pdW0iLAoJIlNpIiA9PiAiU2lsaWNvbiIsCgkiUCIgPT4gIlBob3NwaG9ydXMiLAoJIlMiID0+ICJTdWxmdXIiLAoJIkNsIiA9PiAiQ2hsb3JpbmUiLAoJIkFyIiA9PiAiQXJnb24iLAoJIksiID0+ICJQb3Rhc3NpdW0iLAoJIkNhIiA9PiAiQ2FsY2l1bSIsCgkiU2MiID0+ICJTY2FuZGl1bSIsCgkiVGkiID0+ICJUaXRhbml1bSIsCgkiViIgPT4gIlZhbmFkaXVtIiwKCSJDciIgPT4gIkNocm9taXVtIiwKCSJNbiIgPT4gIk1hbmdhbmVzZSIsCgkiRmUiID0+ICJJcm9uIiwKCSJDbyIgPT4gIkNvYmFsdCIsCgkiTmkiID0+ICJOaWNrZWwiLAoJIkN1IiA9PiAiQ29wcGVyIiwKCSJabiIgPT4gIlppbmMiLAoJIkdhIiA9PiAiR2FsbGl1bSIsCgkiR2UiID0+ICJHZXJtYW5pdW0iLAoJIkFzIiA9PiAiQXJzZW5pYyIsCgkiU2UiID0+ICJTZWxlbml1bSIsCgkiQnIiID0+ICJCcm9taW5lIiwKCSJLciIgPT4gIktyeXB0b24iLAoJIlJiIiA9PiAiUnViaWRpdW0iLAoJIlNyIiA9PiAiU3Ryb250aXVtIiwKCSJZIiA9PiAiWXR0cml1bSIsCgkiWnIiID0+ICJaaXJjb25pdW0iLAoJIk5iIiA9PiAiTmlvYml1bSIsCgkiTW8iID0+ICJNb2x5YmRlbnVtIiwKCSJUYyIgPT4gIlRlY2huZXRpdW0iLAoJIlJ1IiA9PiAiUnV0aGVuaXVtIiwKCSJSaCIgPT4gIlJob2RpdW0iLAoJIlBkIiA9PiAiUGFsbGFkaXVtIiwKCSJBZyIgPT4gIlNpbHZlciIsCgkiQ2QiID0+ICJDYWRtaXVtIiwKCSJJbiIgPT4gIkluZGl1bSIsCgkiU24iID0+ICJUaW4iLAoJIlNiIiA9PiAiQW50aW1vbnkiLAoJIlRlIiA9PiAiVGVsbHVyaXVtIiwKCSJJIiA9PiAiSW9kaW5lIiwKCSJYZSIgPT4gIlhlbm9uIiwKCSJDcyIgPT4gIkNlc2l1bSIsCgkiQmEiID0+ICJCYXJpdW0iLAoJIkxhIiA9PiAiTGFudGhhbnVtIiwKCSJDZSIgPT4gIkNlcml1bSIsCgkiUHIiID0+ICJQcmFzZW9keW1pdW0iLAoJIk5kIiA9PiAiTmVvZHltaXVtIiwKCSJQbSIgPT4gIlByb21ldGhpdW0iLAoJIlNtIiA9PiAiU2FtYXJpdW0iLAoJIkV1IiA9PiAiRXVyb3BpdW0iLAoJIkdkIiA9PiAiR2Fkb2xpbml1bSIsCgkiVGIiID0+ICJUZXJiaXVtIiwKCSJEeSIgPT4gIkR5c3Byb3NpdW0iLAoJIkhvIiA9PiAiSG9sbWl1bSIsCgkiRXIiID0+ICJFcmJpdW0iLAoJIlRtIiA9PiAiVGh1bGl1bSIsCgkiWWIiID0+ICJZdHRlcmJpdW0iLAoJIkx1IiA9PiAiTHV0ZXRpdW0iLAoJIkhmIiA9PiAiSGFmbml1bSIsCgkiVGEiID0+ICJUYW50YWx1bSIsCgkiVyIgPT4gIlR1bmdzdGVuIiwKCSJSZSIgPT4gIlJoZW5pdW0iLAoJIk9zIiA9PiAiT3NtaXVtIiwKCSJJciIgPT4gIklyaWRpdW0iLAoJIlB0IiA9PiAiUGxhdGludW0iLAoJIkF1IiA9PiAiR29sZCIsCgkiSGciID0+ICJNZXJjdXJ5IiwKCSJUbCIgPT4gIlRoYWxsaXVtIiwKCSJQYiIgPT4gIkxlYWQiLAoJIkJpIiA9PiAiQmlzbXV0aCIsCgkiUG8iID0+ICJQb2xvbml1bSIsCgkiQXQiID0+ICJBc3RhdGluZSIsCgkiUm4iID0+ICJSYWRvbiIsCgkiRnIiID0+ICJGcmFuY2l1bSIsCgkiUmEiID0+ICJSYWRpdW0iLAoJIkFjIiA9PiAiQWN0aW5pdW0iLAoJIlRoIiA9PiAiVGhvcml1bSIsCgkiUGEiID0+ICJQcm90YWN0aW5pdW0iLAoJIlUiID0+ICJVcmFuaXVtIiwKCSJOcCIgPT4gIk5lcHR1bml1bSIsCgkiUHUiID0+ICJQbHV0b25pdW0iLAoJIkFtIiA9PiAiQW1lcmljaXVtIiwKCSJDbSIgPT4gIkN1cml1bSIsCgkiQmsiID0+ICJCZXJrZWxpdW0iLAoJIkNmIiA9PiAiQ2FsaWZvcm5pdW0iLAoJIkVzIiA9PiAiRWluc3RlaW5pdW0iLAoJIkZtIiA9PiAiRmVybWl1bSIsCgkiTWQiID0+ICJNZW5kZWxldml1bSIsCgkiTm8iID0+ICJOb2JlbGl1bSIsCgkiTHIiID0+ICJMYXdyZW5jaXVtIiwKCSJSZiIgPT4gIlJ1dGhlcmZvcmRpdW0iLAoJIkRiIiA9PiAiRHVibml1bSIsCgkiU2ciID0+ICJTZWFib3JnaXVtIiwKCSJCaCIgPT4gIkJvaHJpdW0iLAoJIkhzIiA9PiAiSGFzc2l1bSIsCgkiTXQiID0+ICJNZWl0bmVyaXVtIiwKCSJEcyIgPT4gIkRhcm1zdGFkdGl1bSIsCgkiUmciID0+ICJSb2VudGdlbml1bSIsCgkiQ24iID0+ICJDb3Blcm5pY2l1bSIsCgkiVXV0IiA9PiAiVW51bnRyaXVtIiwKCSJGbCIgPT4gIkZsZXJvdml1bSIsCgkiVXVwIiA9PiAiVW51bnBlbnRpdW0iLAoJIkx2IiA9PiAiTGl2ZXJtb3JpdW0iLAoJIlV1cyIgPT4gIlVudW5zZXB0aXVtIiwKCSJVdW8iID0+ICJVbnVub2N0aXVtIgp9CgpkZWYgY291bnRfZWxlbWVudHMoaW5wdXQpCiAgICBhdG9tcywgZWxlbWVudHMsIGVfbnVtX3NjYW4sIGVfc2NhbiA9IHt9LCBbXSwgLyhbQS1aXVthLXpdezAsMn0pKFxkPykvLCAvW0EtWl1bYS16XXswLDJ9XGQ/LwogICAgaW5wdXQuc2NhbigvXChbXHdcZF0rXCk/XGQqLykuZWFjaCBkbyB8IG1vbGVjdWxlIHwgIyBzY2FubmluZyBmb3IgbW9sZWN1bGVzCiAgICAgICAgaW5wdXQuc2xpY2UhKG1vbGVjdWxlKSAjIFJlbW92ZSBtb2xlY3VsZSBmcm9tIGVxdWF0aW9uCiAgICAgICAgbW9sZWN1bGUuc2NhbigvXCkoXGQpLykgIyBsb29raW5nIGZvciBtdWx0aXBsaWVyCiAgICAgICAgJDEgPT0gJycgPyBtdWx0aXBsaWVyID0gMSA6IG11bHRpcGxpZXIgPSAkMS50b19pCiAgICAgICAgbW9sZWN1bGUuc2NhbihlX3NjYW4pLmVhY2ggZG8gfGVseXwgIyBsb29raW5nIGZvciBlbGVtZW50cyBpbiBtb2xlY3VsZQogICAgICAgICAgICBlbHkuc2NhbihlX251bV9zY2FuKSAjIGJyZWFraW5nIHVwIGVsZW1lbnQgaW50byBlbGVtZW50IGFuZCBtdWx0aXBsaWVyCiAgICAgICAgICAgICQyID09ICcnID8gZWxlbWVudHMgPDwgJDEgKyBtdWx0aXBsaWVyLnRvX3MgOiBlbGVtZW50cyA8PCAkMSArICgkMi50b19pICogbXVsdGlwbGllcikudG9fcwogICAgICAgIGVuZCBlbmQKICAgIGVsZW1lbnRzLmNvbmNhdCBpbnB1dC5zY2FuKGVfc2NhbikgIyBhZGRpbmcgaW4gdGhlIHJlbWFpbmluZyBlbGVtZW50cwogICAgZWxlbWVudHMuZWFjaCBkbyB8IGVsZW1lbnQgfAogICAgICAgIGVsZW1lbnQuc2NhbihlX251bV9zY2FuKSAjIGJyZWFraW5nIGVsZW1lbnQgaW50byBlbGVtZW50IGFuZCBudW1iZXIKICAgICAgICAkMiA9PSAnJyA/IG51bSA9IDEgOiBudW0gPSAkMi50b19pCiAgICAgICAgYXRvbXMua2V5PygkMSkgPyBhdG9tc1skMV0gPSBhdG9tc1skMV0gKyBudW0gOiBhdG9tc1skMV0gPSBudW0KICAgIGVuZAogICAgcmV0dXJuIGF0b21zCmVuZAoKWyJDQ2wyRjIiLCAiTmFIQ08zIiwgIkM0SDgoT0gpMiIsICJQYkNsKE5IMykyKENPT0gpMiJdLmVhY2ggZG8gfGZvcm11bGF8CiAgICBwdXRzICcnLCBmb3JtdWxhLCAnLScqMjAKICAgIGNvdW50X2VsZW1lbnRzKGZvcm11bGEpLmVhY2ggZG8gfGtleSwgdmFsdWV8CiAgICAgICAgcHV0cyB0YWJsZVtrZXldLmxqdXN0KDE0KSArICc6JyArIHZhbHVlLnRvX3Mucmp1c3QoNSkKICAgIGVuZCBlbmQ=