Chemical calculator: Difference between revisions

Content added Content deleted
Line 1,748: Line 1,748:
Uue -> 315.000
Uue -> 315.000
</pre>
</pre>

=={{header|Groovy}}==
{{trans|Java}}
<lang groovy>import java.util.regex.Pattern

class ChemicalCalculator {
private static final Map<String, Double> ATOMIC_MASS = new HashMap<>()

static {
ATOMIC_MASS.put("H", 1.008)
ATOMIC_MASS.put("He", 4.002602)
ATOMIC_MASS.put("Li", 6.94)
ATOMIC_MASS.put("Be", 9.0121831)
ATOMIC_MASS.put("B", 10.81)
ATOMIC_MASS.put("C", 12.011)
ATOMIC_MASS.put("N", 14.007)
ATOMIC_MASS.put("O", 15.999)
ATOMIC_MASS.put("F", 18.998403163)
ATOMIC_MASS.put("Ne", 20.1797)
ATOMIC_MASS.put("Na", 22.98976928)
ATOMIC_MASS.put("Mg", 24.305)
ATOMIC_MASS.put("Al", 26.9815385)
ATOMIC_MASS.put("Si", 28.085)
ATOMIC_MASS.put("P", 30.973761998)
ATOMIC_MASS.put("S", 32.06)
ATOMIC_MASS.put("Cl", 35.45)
ATOMIC_MASS.put("Ar", 39.948)
ATOMIC_MASS.put("K", 39.0983)
ATOMIC_MASS.put("Ca", 40.078)
ATOMIC_MASS.put("Sc", 44.955908)
ATOMIC_MASS.put("Ti", 47.867)
ATOMIC_MASS.put("V", 50.9415)
ATOMIC_MASS.put("Cr", 51.9961)
ATOMIC_MASS.put("Mn", 54.938044)
ATOMIC_MASS.put("Fe", 55.845)
ATOMIC_MASS.put("Co", 58.933194)
ATOMIC_MASS.put("Ni", 58.6934)
ATOMIC_MASS.put("Cu", 63.546)
ATOMIC_MASS.put("Zn", 65.38)
ATOMIC_MASS.put("Ga", 69.723)
ATOMIC_MASS.put("Ge", 72.630)
ATOMIC_MASS.put("As", 74.921595)
ATOMIC_MASS.put("Se", 78.971)
ATOMIC_MASS.put("Br", 79.904)
ATOMIC_MASS.put("Kr", 83.798)
ATOMIC_MASS.put("Rb", 85.4678)
ATOMIC_MASS.put("Sr", 87.62)
ATOMIC_MASS.put("Y", 88.90584)
ATOMIC_MASS.put("Zr", 91.224)
ATOMIC_MASS.put("Nb", 92.90637)
ATOMIC_MASS.put("Mo", 95.95)
ATOMIC_MASS.put("Ru", 101.07)
ATOMIC_MASS.put("Rh", 102.90550)
ATOMIC_MASS.put("Pd", 106.42)
ATOMIC_MASS.put("Ag", 107.8682)
ATOMIC_MASS.put("Cd", 112.414)
ATOMIC_MASS.put("In", 114.818)
ATOMIC_MASS.put("Sn", 118.710)
ATOMIC_MASS.put("Sb", 121.760)
ATOMIC_MASS.put("Te", 127.60)
ATOMIC_MASS.put("I", 126.90447)
ATOMIC_MASS.put("Xe", 131.293)
ATOMIC_MASS.put("Cs", 132.90545196)
ATOMIC_MASS.put("Ba", 137.327)
ATOMIC_MASS.put("La", 138.90547)
ATOMIC_MASS.put("Ce", 140.116)
ATOMIC_MASS.put("Pr", 140.90766)
ATOMIC_MASS.put("Nd", 144.242)
ATOMIC_MASS.put("Pm", 145.0)
ATOMIC_MASS.put("Sm", 150.36)
ATOMIC_MASS.put("Eu", 151.964)
ATOMIC_MASS.put("Gd", 157.25)
ATOMIC_MASS.put("Tb", 158.92535)
ATOMIC_MASS.put("Dy", 162.500)
ATOMIC_MASS.put("Ho", 164.93033)
ATOMIC_MASS.put("Er", 167.259)
ATOMIC_MASS.put("Tm", 168.93422)
ATOMIC_MASS.put("Yb", 173.054)
ATOMIC_MASS.put("Lu", 174.9668)
ATOMIC_MASS.put("Hf", 178.49)
ATOMIC_MASS.put("Ta", 180.94788)
ATOMIC_MASS.put("W", 183.84)
ATOMIC_MASS.put("Re", 186.207)
ATOMIC_MASS.put("Os", 190.23)
ATOMIC_MASS.put("Ir", 192.217)
ATOMIC_MASS.put("Pt", 195.084)
ATOMIC_MASS.put("Au", 196.966569)
ATOMIC_MASS.put("Hg", 200.592)
ATOMIC_MASS.put("Tl", 204.38)
ATOMIC_MASS.put("Pb", 207.2)
ATOMIC_MASS.put("Bi", 208.98040)
ATOMIC_MASS.put("Po", 209.0)
ATOMIC_MASS.put("At", 210.0)
ATOMIC_MASS.put("Rn", 222.0)
ATOMIC_MASS.put("Fr", 223.0)
ATOMIC_MASS.put("Ra", 226.0)
ATOMIC_MASS.put("Ac", 227.0)
ATOMIC_MASS.put("Th", 232.0377)
ATOMIC_MASS.put("Pa", 231.03588)
ATOMIC_MASS.put("U", 238.02891)
ATOMIC_MASS.put("Np", 237.0)
ATOMIC_MASS.put("Pu", 244.0)
ATOMIC_MASS.put("Am", 243.0)
ATOMIC_MASS.put("Cm", 247.0)
ATOMIC_MASS.put("Bk", 247.0)
ATOMIC_MASS.put("Cf", 251.0)
ATOMIC_MASS.put("Es", 252.0)
ATOMIC_MASS.put("Fm", 257.0)
ATOMIC_MASS.put("Uue", 315.0)
ATOMIC_MASS.put("Ubn", 299.0)
}

private static double evaluate(String s) {
String sym = s + "["
double sum = 0.0
StringBuilder symbol = new StringBuilder()
String number = ""
for (int i = 0; i < sym.length(); ++i) {
char c = sym.charAt(i)
if (('@' as char) <= c && c <= ('[' as char)) {
// @, A-Z, [
int n = 1
if (!number.isEmpty()) {
n = Integer.parseInt(number)
}
if (symbol.length() > 0) {
sum += ATOMIC_MASS.getOrDefault(symbol.toString(), 0.0) * n
}
if (c == '[' as char) {
break
}
symbol = new StringBuilder(String.valueOf(c))
number = ""
} else if (('a' as char) <= c && c <= ('z' as char)) {
symbol.append(c)
} else if (('0' as char) <= c && c <= ('9' as char)) {
number += c
} else {
throw new RuntimeException("Unexpected symbol " + c + " in molecule")
}
}
return sum
}

private static String replaceParens(String s) {
char letter = 'a'
String si = s
while (true) {
int start = si.indexOf('(')
if (start == -1) {
break
}

for (int i = start + 1; i < si.length(); ++i) {
if (si.charAt(i) == (')' as char)) {
String expr = si.substring(start + 1, i)
String symbol = "@" + letter
String pattern = Pattern.quote(si.substring(start, i + 1))
si = si.replaceFirst(pattern, symbol)
ATOMIC_MASS.put(symbol, evaluate(expr))
letter++
break
}
if (si.charAt(i) == ('(' as char)) {
start = i
}
}
}
return si
}

static void main(String[] args) {
List<String> molecules = [
"H", "H2", "H2O", "H2O2", "(HO)2", "Na2SO4", "C6H12",
"COOH(C(CH3)2)3CH3", "C6H4O2(OH)4", "C27H46O", "Uue"
]
for (String molecule : molecules) {
double mass = evaluate(replaceParens(molecule))
printf("%17s -> %7.3f\n", molecule, mass)
}
}
}</lang>
{{out}}
<pre> H -> 1.008
H2 -> 2.016
H2O -> 18.015
H2O2 -> 34.014
(HO)2 -> 34.014
Na2SO4 -> 142.036
C6H12 -> 84.162
COOH(C(CH3)2)3CH3 -> 186.295
C6H4O2(OH)4 -> 176.124
C27H46O -> 386.664
Uue -> 315.000</pre>


=={{header|Java}}==
=={{header|Java}}==