Chemische formules omschrijven uit welke chemische elementen en in welke aantallen atomen een molecuul is opgebouwd. H2O — de chemische formule van water — is een formule die de meeste mensen vermoedelijk wel kennen (normaalgezien worden subscripts gebruikt voor de getallen, maar in deze opgave schrijven we ze gewoon tussen de symbolische voorstellingen van de chemische elementen). Deze formule geeft aan dat één watermolecuul bestaat uit twee atomen waterstof (H) en één atoom zuurstof (O).

Complexere chemische formules kunnen ronde haakjes bevatten, die aangeven dat er aan het hoofdmolecuul meerdere kopieën gehecht zijn van het deelmolecuul ingesloten tussen ronde haakjes. Zo heeft ijzer(III)sulfaat een chemische formule Fe2(SO4)3, die aangeeft dat één molecuul ijzer(III)sulfaat bestaat uit twee atomen ijzer (Fe), drie atomen zwavel (S) en twaalf atomen zuurstof (O). Hierbij dient het aantal atomen van de subformule SO4 tussen ronde haakjes dus vermenigvuldigd te worden met drie.

Het doel van deze opgave is om op basis van een gegeven chemische formule te bepalen uit welke chemische elementen en in welke aantallen atomen het molecuul is opgebouwd.

Opgave

In de chemie worden elementen symbolisch voorgesteld door een string die begint met een hoofdletter, gevolgd door nul of meer kleine letters (bv. C of Fe).

Een chemische formule is een string die bestaat uit een opeenvolging van groepen, waarbij elke groep één van volgende twee vormen kan aannemen:

In beide gevallen is $$n = 1$$ indien de groep niet eindigt op een getal. Gevraagd wordt:

Voorbeeld

> groepen("C6H12O6")
["C6", "H12", "O6"]
> groepen("C4H8(OH)2")
["C4", "H8", "(OH)2"]
> groepen("PbCl(NH3)2(COOH)2")
["Pb", "Cl", "(NH3)2", "(COOH)2"]
> groepen("PbCl(NH3(H2O)4)2")
["Pb", "Cl", "(NH3(H2O)4)2"]

> molecuulformule("C6H12O6")
{"C": 6, "H": 12, "O": 6}
> molecuulformule("C4H8(OH)2")
{"C": 4, "H": 10, "O": 2}
> molecuulformule("PbCl(NH3)2(COOH)2")
{"Pb": 1, "Cl": 1, "N": 2, "H": 8, "C": 2, "O": 4}
> molecuulformule("PbCl(NH3(H2O)4)2")
{"Pb": 1, "Cl": 1, "N": 2, "H": 22, "O": 8}