def countElements(formula) { def els = [:] def molecules = formula =~ /\(?([^\(\)]+)\)?(\d*)/ molecules.each{ molecule -> def elements = molecule[1] =~ /([A-Z][a-z]*)(\d*)/ elements.each{ element -> els[element[1]] = (els[element[1]]?:0) + ((element[2]?:'1') as int) * ((molecule[2]?:'1') as int) } } return els.sort() } System.in.readLines().each{println "$it\n${countElements(it)}\n"}
C6H12O6 CCl2F2 NaHCO3 C4H8(OH)2 PbCl(NH3)2(COOH)2
C6H12O6 [C:6, H:12, O:6] CCl2F2 [C:1, Cl:2, F:2] NaHCO3 [C:1, H:1, Na:1, O:3] C4H8(OH)2 [C:4, H:10, O:2] PbCl(NH3)2(COOH)2 [C:2, Cl:1, H:8, N:2, O:4, Pb:1]