Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First (='ω'=) solution in Clear category for Chemical Analysis by Magu
import re
from collections import Counter
def atoms(formula, limit):
lst = list({formula[t[0]:t[1]] for t in [m.span() for m in re.finditer(r'[A-Z]{1}[1-9]{1}|[A-Z]{1}[a-z]{1}[1-9]{1}', formula)]})
for el in reversed(lst): formula = formula.replace(el, el[:-1] * int(el[-1]))
lst = list({formula[t[0]:t[1]+1] for t in [m.span() for m in re.finditer(r'\[(.+?)\]', formula)]})
for el in reversed(lst): formula = formula.replace(el, el[1:-2] * int(el[-1]))
lst = list({formula[t[0]:t[1]+1] for t in [m.span() for m in re.finditer(r'\((.+?)\)', formula)]})
for el in reversed(lst): formula = formula.replace(el, el[1:-2] * int(el[-1]))
l = []
for n in range(len(formula)):
if formula[n].islower(): l.pop(-1); l.append(formula[n-1] + formula[n])
else: l.append(formula[n])
dic = Counter(l)
return sorted([k for k, v in dic.items() if v >= limit])
if __name__ == '__main__':
print("Example:")
print(atoms('C2H5OH', 2))
#These "asserts" using only for self-checking and not necessary for auto-testing
assert atoms('C2H5OH', 2) == ['C', 'H']
assert atoms('H2O', 2) == ['H']
assert atoms('Mg(OH)2', 1) == ['H', 'Mg', 'O']
assert atoms('K4[ON(SO3)2]2', 4) == ['K', 'O', 'S']
print("Coding complete? Click 'Check' to earn cool rewards!")
Oct. 30, 2021