碳氢化合物是由氢原子和碳原子组成的化合物。对于这个挑战,我们只考虑三种最简单的碳氢化合物:烷烃、烯烃和没有分支的炔类。
含有n碳原子的烷烃含有2n+2氢原子。含n碳原子的烯烃含有2n氢原子。含n碳原子的炔中含有2n-2氢原子。
每种碳氢化合物都有一个前缀,表示它所包含的碳原子数,如果它分别是烷烃、烯烃或炔,则后缀为ane、ene或yne。数字前缀如下:
1 <-> meth
2 <-> eth
3 <-> prop
4 <-> but
5 <-> pent
6 <-> hex
7 <-> hept
8 <-> oct
9 <-> non
10 <-> dec例如,我们可以看到propane有3个碳原子和8个氢原子,heptyne有7个碳原子和12个氢原子。
您的任务是编写一个函数或程序,接收表示碳氢化合物名称的字符串或字符列表,并生成或输出碳氢化合物分子中碳原子和氢原子的数目。
对于30个碳氢化合物名称中的每一个,代码必须至少接受该名称的一个可能大写。例如,如果您的代码适用于mEthane,而不是methane,ETHAnE而不是ETHANE,以及Propane而不是propane,这是很好的。输入methene和methyne可能会提供未定义的输出,因为它们不是真正的化学品。
输入和输出可以采用任何方便的格式。你不需要标记哪个数字代表碳,哪个代表氢,只需保持数字的顺序一致。
你可以假设输入将对应一个有效的碳氢化合物,最多有10个碳原子。
Possible Input -> Possible Output
Methane -> 1 4
propane -> 3 8
Heptyne -> 7 12
Decene -> 10 20发布于 2019-12-06 01:41:08
与其他答案一样,除以Prop-或Hept-开头的名称外,所有名称都必须是小写。
lambda x:(c:=' mePbphHond'.find(x[0]),c+'ea'.find(x[-3])<<1)-4字节感谢@Arnauld
我观察到的另一个有趣的事实是:
我不认为我可以用这种方式修改我的答案成为更少的字节感谢它是现在,但我认为它是值得一提的,也许另一个答案可以有效地使用它!
上述思想的一个实现是后一:
lambda x:(c:=' mePbphHond'.find(x[0]),2*c+reduce(lambda i,j:i-j,map(int,str(ord(x[-3])))))
from functools import reduce这显然是更多的字节(119)。
发布于 2019-12-05 21:26:06
发布于 2019-12-05 23:59:08
≔⊘⁺³⌕”↶↓>AkQN!{a⁶⟧”…θ⁻Lθ⁵ηI⟦η⊗⁻⁺η№θa№θy在网上试试!链接是详细的代码版本。在较低的情况下输入,并输出碳原子和氢原子在不同的线上。解释:
…θ⁻Lθ⁵删除输入的最后5个字符。
⌕”↶↓>AkQN!{a⁶⟧”...在压缩字符串e prb peh heo n d中搜索结果前缀。请注意,在e之前有一个空格,因此前缀可以在-1 (th?ne)、1表示e(th?ne)、3表示pr(op?ne)等位置找到。
≔⊘⁺³...η将3加到该位置,然后将产生的碳原子数目减半并存储起来。
I⟦η输出碳原子。
⊗⁻⁺η№θa№θy..。并调整输入中是否有a或y,然后加倍给出氢原子的数目。
https://codegolf.stackexchange.com/questions/196667
复制相似问题