Вот там самый важный класс молекул имеет такое описание https://cheminfo.github.io/openchemlib-js/docs/classes/molecule.html
Думаю, просто надо для графа-молекулы список смежных вершин хранить типа List<List<(string, integer)>>
, где string – название атома (если вдруг двухбуквенные), а integer – валентность (чтобы потом количество водородов считать). Сами атомы по-прежнему – в словарь. Задача: по формуле SMILES получить граф. Потом обходим его, например, в глубину, и считаем веса уже с водородами.
Восхитительно! Я понял, что такое “регулярные выражения” и разобрался в опубликованном ранее коде!
Значит, выучить программирование проще, чем химию.
Из переписки этой следует мораль: Коль хочешь правильно химичить, тогда учи паскаль.
Не согласен. Химия интуитивно понятна. Если вы потратите вечер и разберётесь с таблицей Менделеева, поймёте её логику, то можете считать, что неорганическая химия вами освоена. Органическая химия тоже достаточно линейна - есть знакомые из неорганической химии элементы, которые собираются в разных сочетаниях, определяя свойства новых молекул.
Самое сложное - это точный синтез и проектирование аппаратов под конкретный процесс. Но даже тут пришла автоматизация в виде “Компаса”.
Лично для меня в химии всегда сложными были разделы, где надо просто учить последовательность процессов и где нельзя логикой решить. Например, это многочисленные циклы в биохимии.
Цикл Крэбса, например… вот где разрыв мозга: Восхититься циклом Кребса
Тут всё совершенно понятно: профессионалы в оласти химии говорят, что разобраться в химии можно за неделю, профессионалы в области программирования говорят, что научиться программированию можно за неделю.
А скажите - как там с лямбда-выражениями? Стали ли они более понятными или нужны еще пояснения? Мне очень интересно, как непрофессионалы усваивают это базовое понятие.
Лично у меня проблема с лямбда-выражениями следующая: в большинстве описывающих их текстах делает упор на удобство их использования. Этот факт даже у меня не вызывает возражений - действительно, написать две закорючки гораздо проще, чем целую строку. За такой подачей материала видятся годы мучений несчастных кодеров, которые до кровавых мозолей… Однако я пока не понял, как эти лямбда-выражения конструируются. Когда они нужны, а когда нет? Если мне вдруг в тексте СМС надо сократить, то я напишу “СПСБ” и всем будет ясно, что я таким образом выразил свою глубокую признательность, но если я наляпаю целую строку сокращений, то совершенно ничего понятно не будет. Подозреваю, что и с лямбдами так. Когда читаешь про эти функции, то регулярно всплывает тема мусорщика в сборщике. Они идут рука об руку и у меня остаётся ещё много вопросов. Нужно ли думать о мусорщике при каждом акте написания функции, или всё это для каких-то особых случаев?
Это где так? Дайте примеры.
Весь смысл сборщиками мусора состоит в том - чтоб о нём забыть. Если, конечно, вы не занимаетесь external
подпрограммами, тогда забыть не выйдет.
Именно так. Лямбда-выражения это аналог “СПСБ”. Поэтому если вы не написали 100500 функций , не надо переживать, если лямбда выражения сразу “не заходят”. В целом (v, i) - например из кода выше это краткая запись функции которая на входе принимает эти пораметры.
На выходе она выдёт во первых i+1
во вторых Mass(v)
В самой функции Select идёт цикл и ваша функция, которая на входе принимает параметры v и i, вызывается несколько раз.
Вместо Select вы например сами могли бы написать цикл for… Но это было бы дольше, во первых. Во вторых могли бы глюк посадить. Зато было бы легче понять, что делает ваш код , не заглядывая в справку.
Ну если только процедурному программированию с минимум операторов то да, можно за неделю. Но не лямбда-выражениям скажем. Подозреваю и в химии за неделю можно выучить, что такое валентность, но не то, почему иногда SO4, а иногда SO3 . И не факт , что в SMILES содержиться информация, почему в обоих случаях нужно два атома водорода ставить.
По Википедии во всяком случае на визуальной схеме, показано , что в первом случае у нас к сере идёт 6 связей. А во втором 4. Я должен конечно же предположить, что остальные 2 забивает водород. А фиг вам! Потому, что валентность видимо другая. И в химии так постоянно.
Был победителем городской олимпиады по химии в 10 классе. Это было давно, но правда.
Моя жена работала учителем химии в школе. Так что мне есть что и с чем сравнивать.
Химия сложнее!
Лямбда-выражения - это, по сути, математические функции, поэтому они отличаются от функций в ЯП. Всё остальное - только другая запись этих функций.
Всё нужно начинать с изучения математики.
Химия, конечно, бездонна, но неделю на валентность - это очень много. Как я уже писал, гениальность периодической таблицы Менделеева в том, что имея только её вы можете валентность высчитать просто посчитав количество электронов на внешних орбиталях. Смена валентности происходит в некоторых случаях из-за разного заполнения орбиталей атома. Это зависит от внешних условий: чем доступнее внешняя энергия, тем большее заполнение орбиталей произойдёт. Накачивание энергией атома серы ведет к переходу одного из 3s-электронов на 3d-уровень. В результате атом серы получает шесть неспаренных электронов, которые предоставляются уже трем атомам кислорода для образования молекулы SO3. строение внешних орбителей серы (S)
Но в органической химии этого практически не нужно, так как свойства органических молекул определяются в большей степени их пространственным строением и именно для этого нужен СМАИЛ (описание молеклы в пространстве), а валентности важную роль играют в неорганической химии. Есть такое современное хай-тековое направление, когда свойство сложных биологических соединений моделируют сравнительно простыми молекулами, скручивая их нужным образом в пространстве.
Вы застали меня врасплох! Совершенно точно, я сам такого выдумать не мог, но где конкретно я это прочитал надо поискать. Там писалось (как я понял), что лямбда-функции нужны для облегчения работы мусорщика, который их автоматически чистит, что снижает ресурсоёмкость программы. Я поэтому на них и внимание особое не обращал, так как тогда подумал, что нужны они, скорее всего, при организации работы атомных станций или ещё чего-то технически сложного, где программы пишутся прямо под “железо”, а мне с моими табличками лямбда не понадобятся.
Вот это верно. Старые, известные ещё со школы, циклы for …- греют душу и радуют как родные в этом холодном мире регулярных выражений…
Предположим, что у нас есть функция
y=1/x.
Можно ли данную функцию выразить в лямбда-форме?
Можно, конечно: x -> 1 / x
. Только @Admin выше правильный вопрос задал: как непрофессионалы усваивают это базовое понятие. Тут дело в том, что изначальный флер таинственности и (якобы) сложности иногда мешает восприятию простых идей. Я вот помню, что у меня были трудности с лямбдами. Правда, я тогда их не использовал, а всё больше читал о них. Но тут, – как ни странно, в Matlab, – я их встретил лицом к лицу в простом примере. Как раз функция, которая строит график другой функции, передаваемой параметром. В Matlab иногда приходится функции делать в отдельных файлах. Так что морока была ещё та! Напиши функцию, сложи её в отдельный файл, потом вызывай построение графика для неё. С лямбдами всё просто: написал их в скобках у вызывающей функции – и всё. Когда я понял, что всё это для моего же блага (а не для суперпрофессионалов или чтобы меня запутать), настало просветление
Кстати, с лямбдами в PascalABC.NET можно поиграть для начала в этом же ключе:
uses GraphWPF;
begin
DrawGraph(x -> sin(1 / x))
end.
Во-от, правильный вопрос.
Сейчас отвечу.
По-существу, Вы уже написали лямбда-функцию, только в другом виде.
Давайте разбираться. Что делает ваша функция y = 1/x
? Она переводит каждый x в 1/x. y - это её имя.
Можно записать этот факт как делают математики:
y(x) = 1/x
А можно так как делают программисты:
y: x -> 1/x
Но читается одинаково: y - это имя функции, переводящей x в 1/x
А теперь ещё один маленький шаг. При описании функции так ли нам важно её имя y
? Нет конечно. Назвать её можно как угодно. А можно вообще её никак не называть, оставив безымянной! И получим безымянную функцию вида
x -> 1/x
Так вот: лямбда-функция или лямбда-выражение - это другое имя безымянной функции.
Лучше ли стало понятно после этого объяснения или стало только хуже?
Очень понятное объяснение! Спасибо. Думаю, Вам нужно потратить немного времени и опубликовать это в википедии, а то там какой-то ужас написали. Теперь осталось научиться всем этим пользоваться.
Научиться - это следующий этап. Вначале надо понять, что это такое. А потом надо понять, что с этим можно делать. Набор действий или операций.
Вот что Вы умеете делать с функциями или хотели бы с ними делать?
Второй вопрос - где в химии возникают функции?
Только никогда этого не произносите в сообществе программистов )))
– Берегите пенсне, Киса, – в отчаянии крикнул Остап, бросая весла, – сейчас начнется!
– Господа! – воскликнул вдруг Ипполит Матвеевич петушиным голосом. – Неужели вы
будете нас бить?!
– Еще как! – загремели васюкинские любители, собираясь прыгать в лодку.
Есть предложение: давайте за вечер с Вами и таблицей Менделеева разберемся с химией кристаллогидратов.