Codegolf - Полярна Ли Эта Молекула?

  • Автор темы Hedogekeeni93
  • Обновлено
  • 22, Oct 2024
  • #1

Отказ от ответственности

Рисовать молекулы в двух измерениях — плохая практика, потому что это не так. Я решил сделать это в 2D, потому что это легче объяснить.

Обратите внимание, что валентные углы тоже неверны: угол в CH4 равен 109,5°, а не 90°, как я сказал, и валентный угол в NH4 составляет 107°. БХКл2 однако имеет валентный угол 120 ° и является 2D.

Испытание

Учитывая формулу простой молекулы в качестве входных данных, выведите истинное значение, если молекула полярна (асимметрична), или ложное значение, если молекула неполярна (симметрична).

Определение полярности

Чтобы определить, полярна молекула или нет, нам придется посмотреть на ее форму. Для целей этой задачи мы предположим, что молекулы двумерны.

Чтобы продемонстрировать, как определить полярность молекулы, воспользуемся тремя примерами: метан (CH4), аммиак (NH3) и BHCl2.

CH4

Во-первых, давайте возьмем центральную молекулу — углерод. Углерод находится в четвертой группе периодической таблицы, поэтому у него четыре электрона на внешней оболочке, как показано ниже:

codegolf - Полярна ли эта молекула?

Теперь добавим атомы водорода (каждый атом водорода отдает свой электрон для образования пары):

Поскольку неподеленных пар электронов нет, мы можем нарисовать его под углом 90 ° между каждой связью, поскольку все связи отталкиваются одинаково:

Теперь мы видим, что метан симметричен, поэтому он неполярный.

NH3

Как и выше, мы берем центральную молекулу, азот, и вытягиваем электроны ее внешней оболочки:

Добавляя атомы водорода, мы замечаем, что имеется неподеленная пара электронов:

codegolf - Полярна ли эта молекула?

Поскольку неподеленная пара находится ближе к атому, она отталкивается сильнее, чем связующая пара, поэтому угол между связями меньше:

codegolf - Полярна ли эта молекула?

Очевидно, NH3 не симметричен, поэтому полярный.

BHCl2

Приняв бор в качестве центральной молекулы, мы нарисуем три внешних электрона:

codegolf - Полярна ли эта молекула?

Затем мы добавляем водород и хлоры:

codegolf - Полярна ли эта молекула?

Неподеленных пар нет, поэтому связи отталкиваются одинаково, образуя угол 120°:

codegolf - Полярна ли эта молекула?

Хотя форма симметрична, атом водорода делает молекулу асимметричной, поэтому BHCl2 полярный.

Правила

Встроенные модули, имеющие доступ к информации о молекулах, запрещены. Вы можете получить доступ к данным таблицы Менделеева, используя встроенные функции или не добавляя файл к вашему счетчику байтов. Эти данные могут храниться так, как вы пожелаете.

Вводными данными всегда будет только действительная простая молекула: один центральный атом (элемент p-блока), который стоит первым в формуле, и до восьми внешних атомов (водорода, фтора, хлора, брома, йода, астата), которые используют только одинарные связи. .

Вы никогда не получите на входе многоатомный ион или молекулу с координационными (дативными ковалентными) связями. Например, с

 Input -> Output
OH2 -> Falsey
CCl4 -> Falsey
OF4 -> Truthy
CH4 -> Falsey
NH3 -> Truthy
BHCl2 -> Truthy
 
, there would be a single unpaired electron, so the only for NH4 to form a stable molecule would be to lose the extra electron and become an ion (a polyatomic ion, since there is more than one atom in the ion).

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

Если существуют неполярные и полярные изомеры молекулы (например, SiF2кл.2) вы должны предположить, что молекула неполярна.

Примеры

NH4

Победа

Выигрывает самый короткий код в байтах.

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

Hedogekeeni93


Рег
25 Oct, 2024

Тем
65

Постов
202

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

Питон 3, 296 байт

 a 

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

-29 байт благодаря ovs

Принты P.py or H .

Для этого требуется привести все символы элементов p-блока к количеству имеющихся у них валентных электронов. True is not necessary since it will only be one of the surrounding atoms. The dict is stored in False как переменная с именем import P,re,itertools r="[A-Z][a-z]?" f=re.findall(r,re.sub("(%s)(\d)"%r,lambda g:g.group(1)*int(g.group(2)),input())) print(all(any(any(q[:len(q)//i]*i==q for i in range(2,len(q)))for q in[j[i:]+j[:i]for i in range(len(j))])<1for j in itertools.permutations(f+['e']*-(len(f)-P.a[f.pop(0)]>>1)))) (it's written in the input for TIO and then placed into a Python file by the header)

 

Nsveta


Рег
03 May, 2020

Тем
99

Постов
184

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

Интересно