Doymamışlık Derecesi


11

Doymamışlık Derecesi

Bu özellikle zor bir kod bulmaca değil - ama bunu çözmek için birden fazla yol görmek istiyorum.

Doygunluk Derecesi, atomlar arasındaki çift kimyasal bağ sayısı ve / veya kimyasal bir bileşikteki halka sayısıdır.

XaYbZc formunda bir kimyasal bileşiğin moleküler formülü verilecektir (burada a, b ve c, bileşikteki X, Y veya Z atomlarının sayısıdır) - formül herhangi bir uzunlukta olabilir ve herhangi bir kimyasal element içerebilir periyodik tabloda (C, H, N, F, Cl, Br, I dışındaki elementler formülde bulunmadığı için yok sayılabilir). Bileşik en az bir karbon atomu içerecektir. Doymamışlık Derecesini hesaplamalı ve göstermelisiniz.

Örneğin, bileşik benzen (aşağıda resmedilmiştir), üç çift bağa (atomlar arasında çift çizgi ile gösterilmiştir) ve tek bir halkaya (bir döngüye bağlı birkaç atoma) sahip olduğu için DoU 4'e sahiptir:

benzen halkası

LibreTexts tarafından tanımlandığı gibi :

DoU = (2C + 2 + N - X - H) / 2

Nerede:

  • C karbon atomu sayısı
  • N azot atomlarının sayısıdır
  • X halojen atomlarının sayısı ( F, Cl, Br, I)
  • H hidrojen atomu sayısıdır

Test senaryoları:

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'nin açıklaması için buraya bakın

Özünde, bileşikte yukarıdaki elementlerden herhangi birinin (C, H, N, F, Cl, Br, I) olup olmadığını ve varsa kaç tane olduğunu tanımlamanız gerekir. Ardından, yukarıdaki formülü kullanarak Doygunluk Derecesini hesaplayın.

DoU formülü için yalnızca C, H, N, F, Cl, Br ve I geçerli girişlerdir. Bu bulmacanın amaçları doğrultusunda, diğer elementler tamamen göz ardı edilebilir (örneğin, bileşik C6H6Mn olsaydı sonuç yine de 4 olacaktır). Yukarıdaki bileşiklerin hiçbiri yoksa, cevap sıfır olacaktır.

Tüm bileşik girdilerinin kimyasal olarak mümkün olduğunu, en az bir karbon atomu içerdiğini ve var olduğu biliniyor olabilirsiniz. Giriş geçersizse, program 0 veya -1 çıktısını verebilir veya sonuç vermeyebilir.

kurallar

Standart IO kuralları ve boşlukları geçerlidir. Giriş standart bir dize olmalıdır ve girişin boş olmayacağını varsayabilirsiniz. Bu codegolf - bayttaki en kısa kod kazanıyor.


Önerilen test vakaları: Sodyum oksit: Na2Ove Metilidin: CHve CCl4He. Bunlar birkaç çözümü kırabilecek bazı köşe durumlarıdır. Bu arada, Mathematica (muhtemelen) dışında herhangi biri için önemli değil, ama bileşiklerin var olabileceğini varsayabilir miyiz?
Stewie Griffin

Anlamıyorum C9H2O1 --> 0. 9 olmamalı mı? (2*9+2+0-0-2)/2
DLosc

son paragrafa göre, kodun geçersiz girdilerle başa çıkabilmesi gerektiği anlamına mı geliyor? Bu arada, bileşikteki her bir elementin C1H1'deki gibi bir '1' değerine sahip olması garanti edilir mi?
Keyu Gan

@KeyuGan evet ve evet.
Archie Roques

Yanıtlar:


2

JavaScript (ES6), 117 112 bayt

0Geçersiz girişleri döndürür .

s=>s.split(/(\d+)/).reduce((p,c,i,a)=>p+[0,k=a[i+1]/2,2*k,-k][n='NCFHIClBr'.search(c||0)+1,s|=n==2,n>2?3:n],1)*s

Test senaryoları

Alternatif sürüm, 103 bayt

Girdinin geçerli olması garanti edilirse - meydan okuma girişinin yanıltıcı bir şekilde önerdiği gibi - şunları yapabiliriz:

s=>s.split(/(\d+)/).reduce((p,c,i,a)=>p+[0,k=a[i+1]/2,2*k,-k][n='NCFHIClBr'.search(c||0)+1,n>2?3:n],1)

gösteri


2

Piton 3 , 142 151 148 bayt

import re
l=dict(re.findall("(\D+)(\d+)",input()))
m=lambda k:int(l.get(k,0))
print(m("C")and m("C")+1+(m("N")-sum(map(m,"F I H Cl Br".split())))/2)

Hata durumunda 0 döndürür.

@HyperNeutrino sayesinde baytları düşürüyor.

Çevrimiçi deneyin!


ayy - test senaryoları güncellendi!
Archie Roques


@HyperNeutrino Test vakaları biraz belirsizdi. Şimdi geçersiz girişte çıktı yok.
MooseOnTheRocks


dictOrada güzel kullanımı !
DLosc

0

Pip , 70 67 bayt

`C\d`Na&1+/2*VaR+XDs._R['C'NC`H|F|I|Cl|Br`].s["+2*"'+'-]RXU.XX"+0*"

Kimyasal formülü komut satırı argümanı olarak alır. Çıkışlar 0geçersiz girişler için. Çevrimiçi deneyin!

açıklama

Kimyasal formülü matematiksel bir formüle dönüştürmek için bir dizi normal ifadeyi kullanır, geliştirir ve son değeri elde etmek için birkaç değişiklik yapar.

Değiştirmeler (hafifçe çözülmemiş versiyon):

aR+XDs._R"C ""+2*"R"N "'+R`(H|F|I|Cl|Br) `'-RXU.XX"+0*"

a                    Cmdline arg
 R+XD                 Replace runs of 1 or more digits (\d+)
     s._               with a callback function that prepends a space
                       (putting a space between each element and the following number)
 R"C "                Replace carbon symbol
      "+2*"            with +2* (add 2* the number of carbon atoms to the tally)
 R"N "                Replace nitrogen symbol
      '+               with + (add the number of nitrogen atoms to the tally)
 R`(H|F|I|Cl|Br) `    Replace hydrogen or halogen symbol
                  '-   with - (subtract the number of atoms from the tally)
 RXU.XX               Replace uppercase letter followed by another char ([A-Z].)
       "+0*"           with +0* (cancel out numbers of all other kinds of atoms)

Ortaya çıkan dizeyi ile değerlendiririz V. Bu bize verir 2C + N − X − H. Doğru değeri elde etmek için aşağıdaki ayarlamaları yaparız:

`C\d`Na&1+/2*V...

             V...  Value of expression calculated above
          /2*      multiplied by 1/2
        1+         plus 1
`C\d`Na            Is carbon in the original formula? (i.e. C followed by a digit)
       &           Logical AND: if no carbon, return 0, otherwise return the formula value

0

C (gcc) , 195197 202 bayt

Muhtemelen en uzun cevap.

d,c,b,e,n;f(char*a){for(c=d=0;b=*a;d+=e?e-1?b-66?b-67?0:e-2?0:-n:e-3?0:-n:b-67?b-78?b/70*73/b?-n:0:n:(c=2*n):0)e=*++a>57?*a-108?*a-114?0:3:2:1,a+=e>1,n=strtol(a,&a,10);printf("%.1f",c?d/2.+1:0);}

Çevrimiçi deneyin!

Hata durumunda 0 döndürür.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.