鉴于有机分子的高分辨分子质量,输出该分子的分子式。
输入将是一个小数到三个小数位的精度,分子的相对分子质量。
在这里,分子质量被定义为化合物中原子质量的总和。由于你只是在寻找有机化合物的分子公式,所以你需要知道的原子质量是:
你的配方应该只含有碳、氢、氧或氮。
在编写公式时,应采取以下形式:
CaHbOcNd其中元素必须按这个顺序排列(C -> H -> O -> N,所以C2O8N4H6应该是C2H6O8N4),而a、b、c和d是分子中前一个元素的数字(即C2表示分子中有两个碳原子)。
如果a、b、c或d为零,则公式中不应包含该元素(例如,C2H6O2N0应为C2H6O2)。最后,如果a、b、c或d是一个,则不应该在公式中包含数字(例如,C1H4应该是CH4)。
输入总是有效的(即有一个具有这个质量的分子)。如果输入不明确(多个分子具有相同的质量),则只能输出其中一个分子。你如何选择这种分子取决于你自己。
假设输入是180.156,只有一个元素的组合可以具有这个分子质量:
12.011*6 + 1.008*12 + 15.999*6 + 14.007*0 = 180.156因此,有:
因此,您的输出应该是:
C6H12O6Input -> Output
28.054 -> C2H4
74.079 -> C3H6O2
75.067 -> C2H5O2N
18.015 -> H2O以字节为单位的最短代码获胜。
发布于 2017-05-03 17:38:35
Print@@Join@@({Characters@"CHON",#}ᵀ/.a_/;Last@a<2:>Table@@a)&/@{12011,1008,15999,14007}~FrobeniusSolve~#&纯函数,期望输入为整数(相对分子质量的1000倍);它打印所有可能的答案给STOUD (并返回一个NullS数组)。
繁重的工作是由内置的{12011,1008,15999,14007}~FrobeniusSolve~#完成的,它查找所有与输入相等的硬编码权值的所有非负整数组合。{Characters@"CHON",#}ᵀ将每个这样的组合放在一个类似于{{"C", 0}, {"H", 1}, {"O", 2}, {"N", 3}}的表单中。(ᵀ实际上是3字节的专用数学字符U+F3C7。)
转换规则/.a_/;Last@a<2:>Table@@a将表单{x, 0}的对更改为{},将表单{x, 1}的对更改为{x} (并且在试图应用于整个表达式时也会产生错误)。然后,Print@@Join@@以正确的形式打印结果,避免了将整数转换为字符串和连接的需要。
https://codegolf.stackexchange.com/questions/118715
复制相似问题