Nhà hóa học điên và lập trình viên thông minh


12

Backstory

Bạn thức dậy chóng mặt trong phòng thí nghiệm hóa học, và bạn nhận ra mình đã bị một nhà hóa học điên già bắt cóc. Vì anh ấy không thể nhìn rõ vì tuổi của anh ấy, anh ấy muốn bạn làm việc cho anh ấy và chỉ sau đó, bạn có thể thoát khỏi phòng thí nghiệm.

Bài tập

Nhiệm vụ của bạn là trả về các công thức cấu trúc của các phân tử có công thức hóa học sẽ được đưa ra làm đầu vào. Lưu ý rằng chỉ các nguyên tử carbon ( C), oxy ( O) và hydro ( H) sẽ được sử dụng làm đầu vào. Không giống như trong các công thức hóa học, a 0là một bộ định lượng hợp lệ và 1không thể bỏ qua (ví dụ: C1H4O0đầu vào hợp lệ, nhưng CH4không phải).

Để ngăn ngừa sự mơ hồ, chúng tôi giả sử liên kết đôi và ba không xuất hiện trong các phân tử. Tất cả các nguyên tử carbon cần 4 liên kết đơn, tất cả các nguyên tử oxy cần 2 và nguyên tử hydro cần một liên kết. Chúng tôi cũng cho rằng O-Otrái phiếu không tồn tại là tốt. Các phân tử không phải tồn tại cũng không ổn định.

Đầu vào sẽ không bao giờ chứa nhiều hơn 3các nguyên tử carbon để đảm bảo độ sáng trong màn hình của đầu ra.

Bạn chỉ nên hiển thị các phân tử có nguyên tử cacbon được sắp xếp theo một đường thẳng mà không bị gián đoạn. Ergo, không có C-O-Ctrái phiếu.

Bạn phải trả lại tất cả các phân tử có thể không bị loại trừ bởi các quy tắc trước đó. Bạn không cần phải xử lý các đầu vào không hợp lệ.

Ví dụ sau hiển thị tất cả các giải pháp bạn phải xử lý cho phân tử đó.

Xoay 180 độ trong mặt phẳng của trang của một trong các công thức của phân tử được coi là dự phòng và không cần phải hiển thị.

Trong ví dụ dưới đây, tôi sẽ hiển thị tất cả các công thức có thể có cho một phân tử, sau đó chỉ ra những công thức không cần hiển thị.

Thí dụ

Đầu vào: C2H6O2

Đầu tiên, đây là tất cả các công thức có thể có cho đầu vào này (Cảm ơn bạn @Jonathan Allan)

01        H
          |
          O   H
          |   |
  H - O - C - C - H
          |   |
          H   H

02            H
              |
          H   O
          |   |
  H - O - C - C - H
          |   |
          H   H

03        H   H
          |   |
  H - O - C - C - O - H
          |   |
          H   H

04        H   H
          |   |
  H - O - C - C - H
          |   |
          H   O
              |
              H

05        H   H
          |   |
  H - O - C - C - H
          |   |
          O   H
          |
          H

12        H   H
          |   |
          O   O
          |   |
      H - C - C - H
          |   |
          H   H

13        H
          |
          O   H
          |   |
      H - C - C - O - H
          |   |
          H   H

14        H
          |
          O   H
          |   |
      H - C - C - H
          |   |
          H   O
              |
              H


15        H
          |
          O   H
          |   |
      H - C - C - H
          |   |
          O   H
          |
          H

23            H
              |
          H   O
          |   |
      H - C - C - O - H
          |   |
          H   H

24            H
              |
          H   O
          |   |
      H - C - C - H
          |   |
          H   O
              |
              H

25            H
              |
          H   O
          |   |
      H - C - C - H
          |   |
          O   H
          |
          H

34        H   H
          |   |
      H - C - C - O - H
          |   |
          H   O
              |
              H

35        H   H
          |   |
      H - C - C - O - H
          |   |
          O   H
          |
          H

45        H   H
          |   |
      H - C - C - H
          |   |
          O   O
          |   |
          H   H

Và đây là các công thức nên có trong đầu ra nếu chúng ta lấy ra các góc quay 180 ° trong mặt phẳng của trang:

01        H
          |
          O   H
          |   |
  H - O - C - C - H
          |   |
          H   H



03        H   H
          |   |
  H - O - C - C - O - H
          |   |
          H   H


12        H   H
          |   |
          O   O
          |   |
      H - C - C - H
          |   |
          H   H

13        H
          |
          O   H
          |   |
      H - C - C - O - H
          |   |
          H   H

14        H
          |
          O   H
          |   |
      H - C - C - H
          |   |
          H   O
              |
              H


 15      H
         |
         O   H      
         |   |
     H - C - C - H
         |   |
         O   H
         |
         H 

23            H
              |
          H   O
          |   |
      H - C - C - O - H
          |   |
          H   H



25            H
              |
          H   O
          |   |
      H - C - C - H
          |   |
          O   H
          |
          H



35        H   H
          |   |
      H - C - C - O - H
          |   |
          O   H
          |
          H

Bạn không cần xuất nhãn của các công thức và bạn có thể xuất một trong hai phép quay khi hai tồn tại. Ví dụ: bạn có thể xuất 02 hoặc 35.

Dưới đây là một số đầu vào hợp lệ để kiểm tra mã của bạn:

C3H8O2 C1H4O0 C2H6O2 C1H4O1 C2H6O2

PC, nhà hóa học đã cho bạn hoàn thành nhiệm vụ của mình khá cũ nên bạn không có nhiều bộ nhớ để lưu mã, do đó đây là và số lần thắng byte ngắn nhất!


Chúng ta có cần xử lý các phân tử tuần hoàn không?
Lu-ca

@Luke Các đầu vào tôi đưa ra không thể tuần hoàn nên bạn không cần phải xử lý. Nhưng nếu bạn muốn xử lý các phân tử chứa 4 C trở lên, bạn có thể làm điều đó và kiếm được điểm thưởng :) Cảm ơn bạn đã chỉnh sửa bằng cách này! tiếng anh không phải là ngôn ngữ mẹ đẻ của tôi ^^

1
Sản lượng bạn đề xuất thiếu rất nhiều phân tử tiềm năng: bạn có hai bản sao propan-1,2-diol ở đó, nhưng thiếu ít nhất propan-1,1-diol, propan-1,3-diol, propan -2,2-diol, một số lượng lớn ete rượu và các hợp chất khác nhau trong đó hai nguyên tử oxy kết nối với nhau. Ngoài ra, định dạng đầu ra được chỉ định như thế nào? Tôi có thể tưởng tượng các phân tử trong đó một số liên kết cần phải được rút ra lâu hơn các liên kết khác để phù hợp với mọi thứ trong đó (ví dụ dimethylpropane, rõ ràng là một hóa chất thực sự ).

2
1. Có thể có 2 nhóm OH trên cùng một carbon không? Bạn dường như đã loại trừ nó khỏi các ví dụ, nhưng tôi không thấy bất cứ nơi nào trong thông số nói rằng chúng ta không phải xem xét nó (tôi biết trong thực tế các hợp chất này tồn tại ở trạng thái cân bằng với aldehyd) 2. Tại sao HOCH2CH2OH với cả hai nhóm OH chỉ ra nhược điểm từ ví dụ? Nó không phải là một đầu ra cần thiết?
Cấp sông St

1
3. Có thể chấp nhận đầu ra với chuỗi carbon dọc thay vì ngang?
Cấp sông St

Câu trả lời:


3

Ruby, 275

->s{(k=4<<2*c=s[1].to_i).times{|i|z=" "*8
t=("  H|O|"[i%2*2,4]+"C|"*c+"O|H   "[i>>c&2^2,4]).chars.map{|j|z+j+z}
(c*2).times{|j|t[4+j&-2][j%2*10,7]="    H - O - H    "[[i>>j/2-1&4,-7-(i>>c*2-j/2-1&4)][j%2],7]}
i*(k+1)>>c+1&k-1<i||("%b"%i).sum%16!=s[5].to_i||i%7>c*3||puts(t)}}

Công thức kết hợp cho sidechains trái và phải và biến loại bỏ h

Hồng ngọc, 279

->s{(k=1<<h=2+2*c=s[1].to_i).times{|i|t=("  H|O|"[i%2*2,4]+"C|"*c+"O|H   "[i>>c&2^2,4]).chars.map{|j|(z=" "*8)+j+z}
c.times{|j|t[4+j*2][0,7]="    H - O -"[i>>j-1&4,7]
t[4+j*2][10,7]="- O - H    "[i>>h-j-3&4^4,7]}
i*(k+1)>>h/2&k-1<i||("%b"%i).sum%16!=s[5].to_i||i%7>c*3||puts(t)}}

Ungolfed trong chương trình thử nghiệm

f=->s{
  (k=1<<h=2+2*c=s[1].to_i).times{|i|                       #c=number of C atoms. h=number of H (calculated)
                                                           #iterate i from 0 to (k=1<<h)-1

  t=("  H|O|"[i%2*2,4]+"C|"*c+"O|H   "[i>>c&2^2,4]).       #compose a backbone string H-C...C-H. Insert O at the top where bit 0 of i set, and O at the bottom where bit c+1 of i set
  chars.map{|j|(z=" "*8)+j+z}                              #convert string to an array of characters, pad each character left and right with 8 spaces

  c.times{|j|t[4+j*2][0,7]="    H - O -"[i>>j-1&4,7]       #overwrite spaces on left with H or HO according to bits 1 up to c
             t[4+j*2][10,7]="- O - H    "[i>>h-j-3&4^4,7]} #overwrite spaces on right with H or OH according to bits h-1 down to c+1

  i*(k+1)>>h/2&k-1<i||                                     #rotate the bits of i by h/2. if this is less than i, do not output the structure (eliminates rotations by 180deg by outputtng the lexically highest)
  ("%b"%i).sum%16!=s[5].to_i||                             #if the number of 1's in i differs from the number of O's indicated in the input, do not output
  i%7>c*3||                                                #if i%7>c*3, do not output (empirical solution to avoid 90deg rotations for C=1)
  puts(t)                                                  #if the above are all false, output the current structure.
  }
}

f[gets]

Đầu ra

Khoảng cách là theo đầu ra câu hỏi. Xương sống dọc thay vì ngang cho phép mỗi bình luận. Xoay của toàn bộ màn hình thông qua 90 hoặc 180 độ được coi là tương đương.

C2H6O2
        H
        |
        O
        |
H - O - C - H
        |
    H - C - H
        |
        H



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





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



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



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



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



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





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





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

Rất vui, tôi sẽ chạy nó khi tôi quay lại máy tính của mình :)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.