Рассмотрим следующую строку:
Tin Snips
Эта строка содержит несколько атомарных символов в периодической таблице . Мы могли бы переписать эту строку, чтобы идентифицировать несколько из них:
[Ti][N] [Sn][I][P][S]
Конечно, мы могли бы написать это так:
T[In] [S][Ni][P][S]
Правила переписывания ввода следующие:
- Случай ввода не имеет значения с точки зрения соответствия атомных символов.
- Если элемент используется в атомарном символе, его регистр должен измениться, чтобы символ был правильным. Пример:
h
станет[H]
. - Все символы элементов заключены в квадратные скобки ASCII
[
и]
. - Пробелы сохраняются:
Big ego
нельзя объединить «g» и «e» в[Ge]
. - Не все входные символы нужно объединять в атомарный символ: если входной символ не помещается в символ, он передается как есть (регистр не имеет значения).
- Если символ может быть сделан, он должен быть сделан. Другими словами,
Tin
в приведенном выше примере не разрешается выводить данные, поскольку в этом слове можно создать хотя бы один символ. Единственный раз, когда символ может быть пропущен через неиспользованный, это когда он не может быть использован для создания атомарного символа. - Для целей этой задачи, все элементы от водорода (1) до Oganesson (118) являются действительными. Никакие высшие элементы не действительны.
- Некоторые из высших элементов имеют неоднозначные имена и символы: для целей этого испытания должна использоваться версия из Википедии . Для удобства допустимые атомные символы находятся здесь: H, He, Li, Be, B, C, N, O, F, Ne, Na, Mg, Al, Si, P, S, Cl, Ar, K, Ca, Sc, Ti, V, Cr, Mn, Fe, Co, Ni, Cu, Zn, Ga, Ge, As, Se, Br, Kr, Rb, Sr, Y, Zr, Nb, Mo, Tc, Ru, Rh, Pd, Ag, Cd, In, Sn, Sb, Te, I, Xe, Cs, Ba, La, Ce, Pr, Nd, Pm, Sm, Eu, Gd, Tb, Dy, Ho, Er, Tm, Yb, Lu, Hf, Ta, W, Re, Os, Ir, Pt, Au, Hg, Tl, Pb, Bi, Po, At, Rn, Fr, Ra, Ac, Th, Pa, U, Np, Pu, Am, Cm, Bk, Cf, Es, Fm, Md, No, Lr, Rf, Db, Sg, Bh, Hs, Mt, Ds, Rg, Cn, Nh, Fl, Mc, Lv, Ts, Og.
Напишите программу или функцию, которая генерирует все возможные выходы из одного предоставленного ввода. И вход, и выход могут быть в любой форме по вашему выбору. Это может быть строка, массив символов или какая-то другая структура данных: все, что удобно и четко представляет ввод и вывод. И вход, и выход могут быть переданы в / из вашего кода, однако вы выбираете: стандартный ввод / вывод, аргумент / возврат функции или что-то еще.
- Входные данные должны быть строкой (см. Предыдущий абзац) положительной длины, содержащей только символы ASCII произвольного регистра и
0x20
символ пробела ( ). - Ваш код должен генерировать все выходные строки, которые могут быть созданы с использованием приведенных выше правил ввода.
- Порядок вывода определяется реализацией. Единственное требование - все выходные строки присутствуют.
- Если представлена допустимая входная строка, которая не содержит атомарных символов, просто выведите входную строку.
- Если она представлена входной строкой, которая недопустима в соответствии с приведенными выше правилами (ноль, ноль символов, содержит недопустимые символы и т. Д.), Ваша программа может делать что угодно (сбой, пустой вывод и т. Д.)
- Вывод нечувствителен к регистру, кроме атомарных символов, которые должны соответствовать периодической таблице.
- Стандартные лазейки не допускаются.
Тестовые случаи:
Tin Snips
[Ti][N] [Sn][I][P][S]
[Ti][N] [S][Ni][P][S]
[Ti][N] [S][N][I][P][S]
T[In] [Sn][I][P][S]
T[In] [S][Ni][P][S]
T[In] [S][N][I][P][S]
T[I][N] ...
Quack
Q[U][Ac][K]
Q[U]a[C][K]
hehe
[H]e[H]e
[H]e[He]
[He][H]e
[He][He]
Stack Exchange
[S][Ta][C][K] Ex[C][H]a[N][Ge]
[S]t[Ac][K] Ex[C][H]a[N][Ge]
Это код гольф, так что позвольте мне увидеть ваш самый короткий код!
T[I][N]
не[T][I][N]
потому, что T не является элементом. Мой вопрос (и, возможно, вопрос Расара) таков: должны ли мы давать только 1. Только результаты, в которых сделано максимальное количество замен элементов? 2. Только минимальное количество отходов? (HeHe с водородом указывает, что ответ на этот вопрос - нет) 3. Все выходы, где совпадения полностью исчерпаны? (в этом случаеT[I][N]
так же, как иT[In]
было бы действительным.) Я думаю, что правильная интерпретация - 3.Q[U][Ac][K]
иQ[U]a[C][K]
. Право?Ответы:
Python 3,
289263 байтаНашел более полную библиотеку на Pypi:
mendeleev
Старый ответ:
Использует библиотеку
elements.py
от http://www.lfd.uci.edu/~gohlke/code/elements.py.html . В нем отсутствуют элементы от 110 до 118, но это была самая современная библиотека, которую я мог найти. Стоимость 40 байтов, чтобы добавить недостающие элементы.Самая хитрая часть заключалась в логике, когда символ может быть пройден, не будучи частью символа элемента.
источник
mendeleev
пользователь, не библиотека?Желе ,
192191 байт-1 при использовании
Ɗ
(разработано быстро)Попробуйте онлайн! - Слишком неэффективно, чтобы тестовый сценарий «Stack Exchange» не был выполнен в течение 60 секунд (его автономный запуск дает правильный результат в течение 2 минут).
Как?
Первая строка кода представляет собой нулевую ссылку для создания списка, содержащего все 118 элементов символов. Для этого он объединяет два списка, первый из которых содержит все списки символов длиной 2 (т. Е. Строки), второй - список символов и заголовок с результирующим списком. Сами два списка создаются, главным образом, поиском слов в словаре Jelly для создания отдельных строк.
Первое из этих сжатий:
который дает
Где все, кроме последней записи (разделенной пробелами), являются записями в словаре Jelly. Пробелы отфильтровываются
ḟ⁶
, а затем результат разбивается на две части:Секунда,
формируется из конкатенации слов «зяблик», «паб», «небо» и «клятва» (без пробелов) и, как таковой, представляет собой список символов:
Два списка объединяются,
;
и каждая запись имеет титр, используяŒt
:Список, содержащий все 118 элементов по мере необходимости (есть дубликаты, но это нормально).
Вторая строка кода - это монадическая ссылка (вспомогательная функция, предназначенная для получения одного ввода), которая возвращает 1, если вход, с титровальным регистром, существует в списке, созданном выше, и 0 в противном случае.
Третья строка кода - это основная ссылка, монадическая функция, которая принимает строку и возвращает требуемый список списков символов (т.е. строк):
источник
C ++ 11,
944928 байтВот кусок действительно ужасного кода, но он должен работать. Возможно, все еще можно сделать намного короче.
Звоните с:
источник