Codegolf – Степень Ненасыщенности

  • Автор темы Евгений Пестов
  • Обновлено
  • 22, Oct 2024
  • #1

Степень ненасыщенности

Это не особо сложная головоломка с кодом, но мне интересно увидеть несколько способов ее решения.

Степень ненасыщенности — это количество двойных химических связей между атомами и/или количество колец в химическом соединении.

Вам будет предоставлена ​​молекулярная формула химического соединения в виде XaYbZc (где a, b и c — количество атомов X, Y или Z в соединении) — формула может быть любой длины и содержать любой химический элемент. в таблице Менделеева (хотя элементы, кроме C, H, N, F, Cl, Br, I можно игнорировать, поскольку они не фигурируют в формуле). Соединение будет содержать по меньшей мере один атом углерода. Вы должны рассчитать и отобразить степень ненасыщенности.

Например, соединение бензола (на фото ниже) имеет DoU 4, поскольку оно имеет три двойные связи (показаны двойной линией между атомами) и одно кольцо (количество атомов, соединенных в петлю):

codegolf – степень ненасыщенности

Как определено Свободные тексты:

DoU знак равно (2C + 2 + N - X - ЧАС) / 2

Где:

  •  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
     
    is the number of carbon atoms
  • H is the number of nitrogen atoms
  • I is the number of halogen atoms ( Br , Cl , F , X )
  • N is the number of hydrogen atoms

Тестовые случаи:

C

Для объяснения CH см. здесь

По сути, вы должны определить, есть ли в соединении какие-либо из вышеперечисленных элементов (C, H, N, F, Cl, Br, I), и если да, то сколько их. Затем рассчитайте степень ненасыщенности, используя приведенную выше формулу.

Только C, H, N, F, Cl, Br и I являются допустимыми входными данными для формулы DoU. Для целей этой головоломки любые другие элементы можно полностью игнорировать (например, если бы соединение было C6H6Mn, результат все равно был бы 4). Если ни одно из вышеперечисленных соединений не существует, ответ будет нулевым.

Вы можете предположить, что все введенные соединения химически возможны, содержат хотя бы один атом углерода и известны о своем существовании. Если введенные данные недействительны, программа может вывести либо 0, либо -1, либо не дать никакого результата.

Правила

Стандартные правила ввода-вывода и лазейки применять. Ввод должен быть стандартной строкой, и вы можете предположить, что он не будет пустым. Это кодгольф — поэтому побеждает самый короткий код в байтах.

#код-гольф #математика #химия

Евгений Пестов


Рег
21 Oct, 2020

Тем
80

Постов
191

Баллов
651
  • 26, Oct 2024
  • #2

JavaScript (ES6), 117 112 байт

Возврат

 
 
 
 
 
 
 
 
 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);}
 
for invalid inputs.

`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

Тестовые случаи

2C + N − X − H

Альтернативная версия, 103 байта

Если бы входные данные были гарантированно действительными (как это ошибочно предполагает введение задачи), мы могли бы просто сделать:

V

Демо

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) ||answer||

Питон 3, 142 151 148 байт

0

Возвращает 0 в случае ошибки.

Спасибо @HyperNeutrino, сократившему количество байтов.

Попробуйте онлайн!

 

Zhbanq


Рег
21 Nov, 2010

Тем
66

Постов
195

Баллов
565
  • 26, Oct 2024
  • #3

Пип, 70 67 байт

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

Принимает химическую формулу в качестве аргумента командной строки. Выходы 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) for invalid inputs. Попробуйте онлайн!

Объяснение

Использует серию замен регулярных выражений, чтобы превратить химическую формулу в математическую формулу, вычисляет ее и вносит пару изменений, чтобы получить окончательное значение.

Замены (немного негольфированная версия):

let f = 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) console.log(f("C6H6")) // --> 4 console.log(f("C9H20")) // --> 0 console.log(f("C9H9N1O4")) // --> 6 console.log(f("C1H1")) // --> 1.5

Мы оцениваем полученную строку с помощью 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) . This gives us let f = 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 console.log(f("C6H6")) // --> 4 console.log(f("C9H20")) // --> 0 console.log(f("C9H9N1O4")) // --> 6 console.log(f("U1Pt1")) // --> 0 (invalid) console.log(f("Na2O1")) // --> 0 (invalid) console.log(f("C1H1")) // --> 1.5 console.log(f("N1H3")) // --> 0 (invalid) . Чтобы получить правильное значение, вносим следующие корректировки:

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

С (ГКК), 195 197 202 байты

Наверное, самый длинный ответ.

0

Попробуйте онлайн!

Возвращает 0 в случае ошибки.

 

Nv63


Рег
23 Mar, 2006

Тем
79

Постов
173

Баллов
578
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно