알칸의 루이스 구조 그리기


17

방금 학교에서 알칸에 관한 교훈을 얻었고 코드 골프에 큰 도전을 할 것이라고 생각했습니다! 걱정하지 마십시오. 보이는 것처럼 복잡하지 않습니다!

빠른 리 해쉬

(참고 :이 간략한 정보를 유지하기 위해 모든 정보가 100 % 정확하지는 않습니다.)

알칸은 탄소와 수소의 끈입니다. 모든 탄소 원자에는 4 개의 결합이 있으며 모든 수소 원자에는 1 개의 결합이 있습니다. 알칸의 모든 탄소 원자는 스트링의 끝을 제외하고 각 C- 원자가 2 개의 다른 C- 원자 (Lewis 구조에서 왼쪽 및 오른쪽)와 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"부분입니다. 이 체인의 길이에 따라 이름이 다릅니다. 1C는 메탄, 2C 에탄, 3C 프로판,이어서 부탄, 펜탄, 헥산, 헵탄, 옥탄, 노난 및 데칸 (10C)으로 불린다. 그런 다음 각 브랜치마다 그 접두사가 있습니다. 첫째, 브랜치가 추가 된 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

규칙

STDIN에서 이러한 IUPAC 이름으로 읽거나 프로그램 인수 또는 이와 동등한 프로그램을 작성하여 ASCII 아트 루이스 구조로 STDOUT (또는 이와 동등한)으로 작성하는 프로그램을 작성하십시오.

  • 간단하게하기 위해 H- 원자를 그릴 필요가 없습니다 (그렇지 않으면 간격 문제가 발생할 수 있습니다)
  • 빈 선행 또는 후행 수평선을 인쇄 할 수 없습니다
  • 구문 분석해야하는 체인은 10을 넘지 않으며 "그룹"의 최대 분기는 4로 제한됩니다.
  • 분기의 최대 "오프셋"은 9입니다 (두 자리 이상을 구문 분석 할 필요가 없음).
  • 당신의 지점은 모든 새로운 지점 이후에 위아래로 번갈아 가야합니다. 이 공간이 동일한 오프셋에서 다른 분기에 의해 이미 사용 된 경우 루트의 다른쪽에 그려야합니다. (위-> 아래, 아래-> 위)
  • 손상되었거나 형식이 잘못되었거나 그릴 수없는 입력에 프로그램이 지정되지 않은 것처럼 보일 수 있습니다.

이것은 코드 골프, 바이트 단위의 최단 코드입니다!

행복한 골프! :)


해야 4-methylpropane말을 4-methylpentane? 4-<anything>propane내가 완전히 오해하지 않는 한 가능성이 없습니다.
피터 테일러

네 말이 맞아. 편집했습니다!
토마스 올트 만

4
마지막 분자 3-3-5-7-methyldodecane는 가장 긴 연속 탄소 사슬이 12 개이기 때문입니다. 또한, 당신은 문제가없는 모든 정보가 정확했다,하지만 난 그것의 가치는 두 번째 분자가 있음을 지적 생각했다 2-methylpentane하지, 4-methylpentane당신이 가장 가까운 분기와 탄소에서 시작하기 때문이다.
Arcturus

나는 알고 있지만 그것이 내가 부인했던 부정확성이었다. 그것은 코드 골프 도전을 위해 충분히 짧게 유지하는 것의 절충입니다! :)
Thomas Oltmann

1
1. Your branches have to alternate between going up and down after every new branch.귀하의 예가이 규칙을 위반합니다. 2. 지원해야하는 최대 체인 길이는 무엇입니까 (접두사 구문 분석은 문제의 일부입니다.) 명명 목록을 연결 (또는 바람직하게 복사)해야합니다.
Level River St

답변:


3

파이썬 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) 문자열 분기가 초기화됩니다.

그런 다음 각 분기는 해당 '문자열'분기에 추가됩니다 (큰 루프).

양면과 중앙이 끝에 인쇄됩니다.

   |   |             
  -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.