不飽和度
これは特に難しいコードのパズルではありませんが、それを解決する複数の方法を見てみたいと思います。
不飽和度は、原子間の二重化学結合の数、および/または化合物の環の数です。
XaYbZc(a、b、cは化合物中のX、Y、Zの原子数)の形式で化合物の分子式が与えられます-式は任意の長さで、任意の化学元素を含むことができます周期表では(ただし、C、H、N、F、Cl、Br以外の元素は、式に含まれていないため無視されます)。化合物には、少なくとも1つの炭素原子が含まれます。不飽和度を計算して表示する必要があります。
たとえば、化合物ベンゼン(下図)は、3つの二重結合(原子間の二重線で表示)と単一の環(ループで接続された原子の数)があるため、DoUは4です。
LibreTextsで定義されているとおり:
DoU =(2C + 2 + N − X − H)/ 2
どこ:
C
は炭素原子の数ですN
は窒素原子の数ですX
あるハロゲン原子の数(F
、Cl
、Br
、I
)H
は水素原子の数です
テストケース:
C6H6 --> 4
C9H2O1 --> 0
C9H9N1O4 --> 6
U1Pt1 --> Not a valid input, no carbon
Na2O1 --> Not a valid input, no carbon
C1H1 --> 1.5, although in practice this would be one, but is a part of a compound rather than a compound in entirety.
N1H3 would return 0 - though in practice it isn't an organic compound (in other words it contains no carbon) so the formula wouldn't apply and it isn't a valid input
CHの説明については、こちらをご覧ください
本質的に、化合物に上記の要素(C、H、N、F、Cl、Br、I)のいずれかが存在するかどうか、および存在する場合はその数を識別する必要があります。次に、上記の式を使用して不飽和度を計算します。
DoU数式の有効な入力は、C、H、N、F、Cl、Br、およびIのみです。このパズルの目的上、他の要素は完全に無視される場合があります(たとえば、化合物がC6H6Mnの場合、結果は4のままになります)。上記の化合物がない場合、答えはゼロになります。
すべての化合物の入力は化学的に可能であり、少なくとも1つの炭素原子を含み、存在することがわかっていると仮定できます。入力が無効な場合、プログラムは0または-1を出力するか、結果を生成しません。
ルール
標準のIOルールと抜け穴が適用されます。入力は標準の文字列である必要があり、入力は空ではないと想定できます。これはcodegolfです。したがって、バイト単位の最短コードが優先されます。
C9H2O1 --> 0
。9であってはいけませんか?(2*9+2+0-0-2)/2
Na2O
およびメチリジン:CH
およびCCl4He
。これらはいくつかの解決策を壊すかもしれないいくつかのコーナーケースです。ちなみに、(おそらく)Mathematica以外の人にとっては重要ではありませんが、化合物が存在する可能性があると仮定できますか?