นักเคมีที่บ้าและโปรแกรมเมอร์ที่ฉลาด


12

backstory

คุณตื่นขึ้นมาอาการวิงเวียนศีรษะในห้องทดลองทางเคมีและคุณรู้ว่าคุณถูกนักเคมีอายุมากถูกลักพาตัวไป เนื่องจากเขาไม่สามารถมองเห็นได้ดีเนื่องจากอายุของเขาเขาต้องการให้คุณทำงานเพื่อเขาและเมื่อนั้นคุณสามารถหนีจากห้องปฏิบัติการได้

งาน

เป็นหน้าที่ของคุณในการส่งคืนสูตรโครงสร้างของโมเลกุลที่จะให้สูตรทางเคมีเป็นอินพุต โปรดทราบว่าจะใช้เฉพาะอะตอมคาร์บอน ( C), ออกซิเจน ( O) และไฮโดรเจน ( H) เท่านั้นเป็นอินพุต ซึ่งแตกต่างจากในสูตรทางเคมี a 0คือตัวระบุปริมาณที่ถูกต้องและ1ไม่สามารถละเว้นได้ (เช่นC1H4O0อินพุตที่ถูกต้อง แต่CH4ไม่ใช่)

เพื่อป้องกันความคลุมเครือเราจะถือว่าพันธะคู่และสามไม่ปรากฏในโมเลกุล อะตอมคาร์บอนทั้งหมดต้องการ 4 พันธะเดี่ยวอะตอมออกซิเจนทั้งหมดต้องการ 2 และอะตอมไฮโดรเจนต้องการหนึ่ง นอกจากนี้เรายังสมมติว่าO-Oไม่มีพันธบัตรเช่นกัน โมเลกุลไม่จำเป็นต้องมีอยู่หรือไม่เสถียร

อินพุตจะไม่ประกอบด้วย3อะตอมของคาร์บอนมากกว่าเพื่อให้แน่ใจว่าความสว่างในการแสดงผลของเอาต์พุต

คุณควรแสดงโมเลกุลที่มีอะตอมของคาร์บอนจัดเรียงเป็นเส้นตรงโดยไม่หยุดชะงัก เออร์โกไม่มีC-O-Cพันธบัตร

คุณต้องส่งคืนโมเลกุลที่เป็นไปได้ทั้งหมดซึ่งไม่รวมอยู่ในกฎก่อนหน้านี้ คุณไม่จำเป็นต้องจัดการอินพุตที่ไม่ถูกต้อง

ตัวอย่างต่อไปนี้แสดงวิธีแก้ปัญหาทั้งหมดที่คุณต้องจัดการกับโมเลกุลนั้น

การหมุน 180 องศาในระนาบของหน้าหนึ่งในสูตรของโมเลกุลนั้นถือเป็นความซ้ำซ้อนและไม่จำเป็นต้องแสดง

ในตัวอย่างด้านล่างฉันจะแสดงสูตรที่เป็นไปได้ทั้งหมดสำหรับโมเลกุลจากนั้นชี้ให้เห็นสิ่งที่ไม่จำเป็นต้องแสดง

ตัวอย่าง

การป้อนข้อมูล: C2H6O2

อันดับแรกนี่คือสูตรทั้งหมดที่เป็นไปได้สำหรับข้อมูลนี้ (ขอบคุณ @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

และนี่คือสูตรที่ควรอยู่ในผลลัพธ์หากเราหมุนการหมุน 180 องศาในระนาบของหน้า:

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

คุณไม่จำเป็นต้องส่งออกเลเบลของสูตรและคุณสามารถเอาท์พุทของการหมุนเมื่อทั้งสองมีอยู่ ตัวอย่างเช่นคุณสามารถส่งออกทั้ง 02 หรือ 35

นี่คืออินพุตที่ถูกต้องในการทดสอบรหัสของคุณ:

C3H8O2 C1H4O0 C2H6O2 C1H4O1 C2H6O2

พีซีที่นักเคมีให้คุณทำงานของคุณค่อนข้างเก่าดังนั้นคุณไม่มีหน่วยความจำมากพอที่จะบันทึกรหัสของคุณดังนั้นนี่คือและจำนวนไบต์ที่สั้นที่สุดชนะ!


เราจำเป็นต้องจัดการกับโมเลกุลไซคลิกหรือไม่?
ลุค

@ ลุคอินพุตที่ฉันให้ไม่สามารถเป็นรอบได้ดังนั้นคุณไม่จำเป็นต้องจัดการกับมัน แต่ถ้าคุณต้องการจัดการโมเลกุลที่มี 4 C ขึ้นไปคุณสามารถทำได้และรับคะแนนโบนัส :) ขอบคุณสำหรับการแก้ไขโดยวิธี! ภาษาอังกฤษไม่ใช่ภาษาแม่ของฉัน ^^

1
ผลลัพธ์ที่คุณแนะนำไม่มีโมเลกุลที่มีศักยภาพมาก: คุณมี propan-1,2-diol อยู่สองชุด แต่หายไปอย่างน้อย propan-1,1-diol, propan-1,3-diol, propan -2,2-diol อีเทอร์แอลกอฮอล์จำนวนมากและสารประกอบต่าง ๆ ที่อะตอมออกซิเจนสองอะตอมเชื่อมต่อถึงกัน นอกจากนี้รูปแบบผลลัพธ์เป็นอย่างไร? ฉันสามารถจินตนาการถึงโมเลกุลที่บางส่วนของพันธะจะต้องถูกดึงออกมานานกว่าคนอื่น ๆ เพื่อให้พอดีกับทุกอย่างใน (เช่นไดเมทิลโพรเพนซึ่งเป็นสารเคมีจริง )

2
1. เป็นไปได้ไหมที่จะมี 2 OH กลุ่มบนคาร์บอนเดียวกัน? คุณดูเหมือนจะแยกมันออกจากตัวอย่าง แต่ฉันไม่เห็นที่ใดก็ได้ในสเป็คที่บอกว่าเราไม่ต้องพิจารณามัน (ฉันรู้ว่าในความเป็นจริงสารประกอบเหล่านี้มีอยู่ในสมดุลกับอัลดีไฮด์) 2. ทำไม HOCH2CH2OH กลุ่ม OH ทั้งสองชี้ว่ามีข้อผิดพลาดหายไปจากตัวอย่าง มันไม่ได้เป็นผลลัพธ์ที่จำเป็น?
เลเวลริเวอร์เซนต์

1
3. เป็นที่ยอมรับหรือไม่ที่จะให้เอาท์พุตด้วยโซ่คาร์บอนแนวตั้งแทนที่จะเป็นแนวนอน?
เลเวลริเวอร์เซนต์

คำตอบ:


3

ทับทิม, 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)}}

สูตรผสมสำหรับด้านข้างและด้านขวาและตัวแปรที่ตัดออก h

ทับทิม, 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 ในโปรแกรมทดสอบ

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]

เอาท์พุต

การเว้นวรรคเป็นไปตามผลลัพธ์ของคำถาม Backbone ในแนวตั้งแทนที่จะได้รับอนุญาตตามความคิดเห็น การหมุนของจอแสดงผลทั้งหมดถึง 90 หรือ 180 องศาถือว่าเทียบเท่า

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

ดีฉันจะเรียกใช้เมื่อฉันกลับมาที่คอมพิวเตอร์ของฉัน :)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.