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.
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:
de symbolische voorstelling van een element, eventueel gevolgd door een getal $$n \in \mathbb{N}$$ dat aangeeft hoeveel atomen van het element in een molecuul voorkomen
de chemische formule van een submolecuul tussen ronde haakjes, eventueel gevolgd door een getal $$n \in \mathbb{N}$$ dat aangeeft hoeveel kopieën van het submolecuul in een molecuul voorkomen
In beide gevallen is $$n = 1$$ indien de groep niet eindigt op een getal. Gevraagd wordt:
Schrijf een functie groepen waaraan een chemische formule moet doorgegeven worden. De functie moet een array teruggeven met de opeenvolgende groepen van de gegeven chemische formule.
Schrijf een functie molecuulformule waaraan een chemische formule moet doorgegeven worden. De functie moet een object teruggeven waarvan de sleutels gevormd worden door de symbolische voorstellingen van alle chemische elementen in een molecuul dat omschreven wordt door de gegeven formule. De corresponderende waarden geven aan hoeveel atomen van elk element voorkomen in een molecuul dat omschreven wordt door de gegeven formule.
> 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}