アルカンのルイス構造の描画


17

私は学校でアルカンについてのレッスンを受けたばかりで、おそらくそれが素晴らしいゴルフの挑戦に役立つと考えました!心配しないでください、見た目ほど複雑ではありません!

クイックリハッシュ

(注:この簡潔さを保つために、すべての情報が100%正確であるとは限りません。)

アルカンは炭素と水素のストリングです。すべての炭素原子には4つの結合があり、すべての水素原子には1つの結合があります。アルカンのすべての炭素原子は、各C原子が他の2つのC原子(ルイス構造の左右)と2つのH原子(上下)に接続されているストリングを形成します。 C原子は他の1つのCにのみ接続されていますが、3つのHに接続されています。ペンタン(5個のC原子と12個のH原子を持つアルカン)の基本的な例を次に示します。

  H H H H H
  | | | | |
H-C-C-C-C-C-H
  | | | | |
  H H H H H

アルカンは枝を持つこともできます。しかし、心配しないでください。この課題のすべてのアルカンは、1レベルの分岐だけで表現できます。例:

        H
        |
      H-C-H
  H H H | H
  | | | | |
H-C-C-C-C-C-H
  | | | | |
  H H H H H

この課題を完了するには、分岐アルカンのIUPAC命名規則も理解する必要があります。まず、ルートアルカンがあります。前の例では、これは「CCCCC」の部分です。このチェーンの長さに応じて、名前は異なります。1 Cはメタン、2 Cエタン、3 Cプロパン、ブタン、ペンタン、ヘキサン、ヘプタン、オクタン、ノナン、デカンと呼ばれます(10 C)。次に、各ブランチには、それに特定の接頭辞があります。最初に、ブランチが追加されるC原子のインデックス(オフセット)があります(左からカウント)。例では、これは4(別名、左から4番目のC原子)になります。次に、ハイフン(この記号: "-")があり、その後にブランチのサイズを示す別の名前があります。ブランチのサイズの命名は、ルートのサイズの命名とほぼ同じですが、「ane」の代わりに「yl」を追加するだけです。それで、例のフルネームは

4-methylpentane

複数のブランチがある場合、それらも別のハイフンで区切られて追加されます。例:

2-butyl-5-methylhexane

最後に、同じサイズのブラン​​チが複数ある場合、グループ化されます。それらのオフセットはコンマで区切られ、同じサイズ名を共有します。グループ化されるブランチの数に応じて、追加の音節が先頭に追加されます。このチャレンジにこれ以上必要はありません)。例:

2-ethyl-2,4,6-trimethyldecane

参考までに、これは次のようになります:(省略されたH原子)

   |
  -C-
   |       |
  -C-     -C-
 | | | | | | | | | |
-C-C-C-C-C-C-C-C-C-C-
 | | | | | | | | | |
  -C- -C-
   |   |

命名法チートシート

Prefixes indicating numbers:
| Num  | Prefix |
|------|--------|
| 1    | meth   |
| 2    | eth    |
| 3    | prop   |
| 4    | but    |
| 5    | pent   |
| 6    | hex    |
| 7    | hept   |
| 8    | oct    |
| 9    | non    |
| 10   | dec    |
Suffix root:   ane
Suffix branch: yl
Prefixes grouping: di, tri, tetra

ルール

そのようなIUPAC名をSTDIN、プログラム引数、または同等のものから読み取り、ASCIIアートルイス構造としてSTDOUT(または同等物)に描画するプログラムを作成します。

  • 簡単にするために、H原子を描画する必要はありません(そうしないと、スペースの問題が発生します)
  • 空の先頭または末尾の水平線を印刷することはできません
  • 解析する必要があるチェーンは10を超えず、「グループ」内のブランチの最大数は4に制限されます。
  • ブランチの最大「オフセット」は9です(1桁以上を解析する必要がないことを意味します)
  • ブランチは、新しいブランチごとに上下に交互に移動する必要があります。このスペースが同じオフセットで別のブランチによって既に使用されている場合、ルートの反対側にそれを描画する必要があります。(上->下、下->上)
  • 破損した、正しくフォーマットされていない、または描画できない入力では、プログラムは指定されていない動作をする場合があります。

これはコードゴルフで、バイト単位の最短コードが勝ちです!

ハッピーゴルフ!:)


4-methylpropane言うべき4-methylpentaneですか?4-<anything>propane私が何かを完全に誤解していない限り、ありそうにない。
ピーターテイラー

はい、あなたが正しい。それを編集しました!
トーマスオルトマン

4
あなたが持っている最後の分子は3-3-5-7-methyldodecane、最長の連続した炭素鎖が12の長さだからです。また、あなたは質問のすべての情報が正確であるとは言いませんでしたが、2番目の分子が最も近い分岐を持つ炭素から始まるためでは2-methylpentaneなく、2番目の分子であることを指摘する価値があると思います4-methylpentane
アークトゥルス

私は知っていますが、それはまさに私が否認していた不正確さでした。これは、コードゴルフチャレンジに十分な長さを保つためのトレードオフです!:)
トーマスオルトマン

1
1. Your branches have to alternate between going up and down after every new branch.あなたの例はこの規則に違反しています。2.サポートしなければならない最大チェーン長は何ですか(プレフィックスの解析はチャレンジの一部になります。)命名法のリストをリンク(またはできればコピー)する必要があります。
レベルリバーセント

回答:


3

Python 2、620バイト

import re
i=input()
s='m|e|pr|b|p|hex|h|o|n|de';d=dict(zip(s.split('|'),range(1,11)))
z=[[eval('['+a+']'),d[b]]for a,b in re.findall('(?:(\d[,\d]*).*?[\-ia]|l)('+s+')',i[:-3])]
v=z[-1][1]
l=[[0,0]for _ in range(v)]
c=0
for a,b in sorted([(i,b)for a,b in z[:-1]for i in a]):l[a-1][c]=b;c=~c
m=[max(x) for x in zip(*l)]
L,R=[[[' 'for _ in '_'*2*i]for _ in '_'*(2*v+1)]for i in m]
c=[' |'*v+' ']
C=c+['-C'*v+'-']+c
for i in range(len(l)):
 X=L;q=2*i+1
 for a in l[i]:
  if a>0:
   for j in range(0,2*a,2):
    X[q][j]='C'
    X[q-1][j]=X[q+1][j]='-'
    X[q][j+1]='|'
  X=R
for l in zip(*L)[::-1]+C+zip(*R):print ''.join(l)

説明

入力: '2-ethyl-2,4,6-trimethyldecane'

最初に正規表現を使用して文字列に解析します(最後のグループはルートです):

[[[2], 2], [[2, 4, 6], 1], [[], 10]]

各ブランチは、長さの配列で書き込まれますlen(root)(アップ/ダウンの代替はここで処理されます)。

[[0, 0], [1, 2], [0, 0], [1, 0], [0, 0], [0, 1], [0, 0], [0, 0], [0, 0], [0, 0]]

'Left'および 'Right'(L,R)および 'root'(C)文字列ブランチが初期化されます。

各ブランチは、対応する「string」ブランチに追加されます(大きなループ)。

両端と中央は最後に印刷されます:

   |   |             
  -C- -C-            
 | | | | | | | | | | 
-C-C-C-C-C-C-C-C-C-C-
 | | | | | | | | | | 
  -C-     -C-        
   |       |         
  -C-                
   |                 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.