首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >造一个质谱仪!

造一个质谱仪!
EN

Code Golf用户
提问于 2017-05-03 16:44:00
回答 1查看 387关注 0票数 10

挑战

鉴于有机分子的高分辨分子质量,输出该分子的分子式。

解释

输入将是一个小数到三个小数位的精度,分子的相对分子质量。

在这里,分子质量被定义为化合物中原子质量的总和。由于你只是在寻找有机化合物的分子公式,所以你需要知道的原子质量是:

  • C,碳: 12.011
  • 氢: 1.008
  • O,氧气: 15.999
  • N,氮: 14.007

你的配方应该只含有碳、氢、氧或氮。

在编写公式时,应采取以下形式:

代码语言:javascript
复制
CaHbOcNd

其中元素必须按这个顺序排列(C -> H -> O -> N,所以C2O8N4H6应该是C2H6O8N4),而abcd是分子中前一个元素的数字(即C2表示分子中有两个碳原子)。

如果abcd为零,则公式中不应包含该元素(例如,C2H6O2N0应为C2H6O2)。最后,如果abcd是一个,则不应该在公式中包含数字(例如,C1H4应该是CH4)。

输入总是有效的(即有一个具有这个质量的分子)。如果输入不明确(多个分子具有相同的质量),则只能输出其中一个分子。你如何选择这种分子取决于你自己。

工作示例

假设输入是180.156,只有一个元素的组合可以具有这个分子质量:

代码语言:javascript
复制
12.011*6 + 1.008*12 + 15.999*6 + 14.007*0 = 180.156

因此,有:

  • 6架Carbons
  • 12氢
  • 6氧
  • 0-硝基

因此,您的输出应该是:

代码语言:javascript
复制
C6H12O6

更多示例

代码语言:javascript
复制
Input -> Output

28.054 -> C2H4
74.079 -> C3H6O2
75.067 -> C2H5O2N
18.015 -> H2O

以字节为单位的最短代码获胜。

EN

回答 1

Code Golf用户

回答已采纳

发布于 2017-05-03 17:38:35

Mathematica,108个字节

代码语言:javascript
复制
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@@以正确的形式打印结果,避免了将整数转换为字符串和连接的需要。

票数 2
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/118715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档