Основано на Практическом Гольфе - США
Ваша задача - найти аббревиатуру (символ) элемента с указанным именем элемента, вплоть до ununoctium (118). Используйте периодическую таблицу в Википедии .
Благодаря Squeamish Ossifrage, вы можете найти полный список элементов к аббревиатурам на http://pastebin.com/DNZMWmuf .
Вы не можете использовать какие-либо внешние ресурсы. Кроме того, вы не можете использовать какие-либо встроенные данные конкретно об элементах периодической таблицы. Применяются стандартные лазейки.
вход
Входные данные могут быть из стандартного ввода, файла, prompt
, и input
т.д.
Формат ввода:
Все следующие данные являются действительными:
Carbon
carbon
CARBON
cArBOn
По сути, имя элемента - без учета регистра.
Вам не нужно обрабатывать орфографические ошибки или любое неверное имя элемента. Неверный ввод - неопределенное поведение.
Выход :
Символ для элемента. Первый символ должен быть капитализированы , а остальные должны быть в нижнем регистре.
Пример вывода: C
Тестовые случаи:
Carbon -> C
NiTROGen -> N
Sodium -> Na
Gold -> Au
Silver -> Ag
Tin -> Sn
Элементов гораздо больше, чем состояний, поэтому я ожидаю, что будет сложнее найти общее правило для них.
Это код гольф. Самый короткий код выигрывает!
источник
Au
или что-то еще. @Paul R Если есть много способов записать элемент (например, сера против серы или алюминий против алюминия), используйте тот, который делает вашу программу короче. Вам не нужно обрабатывать оба случая.Ответы:
CJam,
337297293232220201200 байтовПриведенный выше код использует символ каретки, поскольку он содержит управляющие символы.
При стоимости 24 дополнительных байта (всего 224) этих символов можно избежать.
Вы можете попробовать этот код в интерпретаторе CJam .
Контрольные примеры
Как это устроено
Первым шагом является чтение имени элемента из STDIN и применение довольно сложной хэш-функции, которая отображает все имена элементов в диапазоне [0, 225] :
Многие символы элемента образованы первым и вторым, первым и третьим, первым и четвертым, первым и пятым или первым и десятым (который является только первым) символом английского имени элемента. Мы будем представлять эти элементы числами от 0 до 4 соответственно. Все остальные элементы (представленные 5) потребуют справочную таблицу.
Результирующая таблица может быть выдвинута следующим образом:
Массив кодов символов преобразуется из базы 256 в базу 7, а 6 заменяются сериями из трех нулей.
Это таблица решений D:
Необходимое действие для элемента с хешем 1 , например, соответствует первому элементу массива this. Элементы массива, которые не соответствуют ни одному хешу элемента, также равны нулю, что позволяет сжатие (0 0 0) compression 6 .
Теперь мы интерпретируем D как хеш H.
Далее мы нажимаем таблицу поиска. Если мы добавим j к односимвольным символам и заменим Uu на Q , каждый символ будет иметь длину ровно два символа. Это можно нажать следующим образом:
Массив кодов символов преобразуется из базы 256 в базу 25, код символа A добавляется ко всем цифрам (в процессе происходит приведение к символу ), и результат разбивается на куски длины два.
Это таблица соответствия L:
Теперь мы приступаем к вычислению потенциальных имен элементов.
Стек теперь содержит
где B - логическое значение D [H-1] / 5 , M - имя, полученное из таблицы поиска, а N - имя элемента, сформированное путем выбора символов из E.
Мы почти закончили:
источник
С, 452
Хорошая хеш-функция помогает. Там могут быть лучше. (Улучшения, предложенные @ugoren et al.)
Разоблаченный с комментариями:
Я использовал грубую силу, чтобы найти этот хэш; Это был единственный файл с размером хеша ≤512, в котором не было столкновений. Хотя я не проверял альтернативное написание, и могли бы быть лучшие функции с разными алгоритмами (например, используя XOR вместо сложения).
Хеш-функция отображает текстовые строки в значения от 0 до 440. «Tin» хэшируется до нуля, поэтому «Sn» находится в начале таблицы. Следующие 7 позиций пусты. Для сохранения компактности кода это указывается значением ASCII 34 + 7 = 41 (")"). Далее идут «Медь» (8), четыре пустых ячейки (34 + 4 = 38 = «&») и «Ванадий» (13). После вычисления хеша программа проходит по таблице, вычитая 1 для каждой заглавной буквы, за которой следуют 0 или более строчных букв, и вычитая (ASCII VALUE) -34 для каждого не алфавитного символа. Когда значение достигает нуля, мы нашли правильный результат.
источник
(h+c%32+74)*311%441
.. 2. Бросьтеp
и используйтеs
. 3.main(c)
сохраняет одну запятую.JavaScript ES6, 690
708байтПервый массив содержит символы, а второй массив содержит минимальное количество букв, необходимых для определения того, на какой элемент ссылаются. Спасибо core1024 и edc65 за помощь в сокращении. Тест на http://jsfiddle.net/xjdev4m6/2/ . Чуть более читабельно:
источник
Neo
до того, как попадет,Neon
потому что в нем меньше букв.if
утверждения (это идеальноеfor
условие), а также встроить или сместить позиции некоторых переменных, чтобы сократить код;)).toLowerCase(
->)[L='toLowerCase'](
затем в концеa.toLowerCase(
->a[L](
следует вырезать 4Ruby 1.9+,
565 471 447444Однострочник. Потому что ничто не «невозможно сделать с регулярными выражениями» ...
(Просто сохранил 94 символа, добавив еще одно регулярное выражение) ((и 24, упростив их))
(новая строка после строки добавлена для "читабельности", удалить для теста)
использование:
ruby periodic.rb aluminum
$>Объяснение:
Разделение строки на начальные заглавные буквы возвращает массив регулярных выражений для сопоставления с именами элементов. В каждом алфавите допускаются только буквы из аббревиатуры *. Они упорядочены таким образом, что первое совпадение, найденное при сравнении с аргументом командной строки,
*$*
является правильным. Конечный gsub удаляет не-буквенные символы перед печатью.* Нечетные сокращения, такие как «Fe» для «железа», обрабатываются
|
элементом: «Iro | Fe». Первый выбор - это то, что на самом деле соответствует; Затем gsub удаляет все символы вплоть до «|», оставляя фактическое сокращение.Тестовая структура (требуется список @ squeamish : загружается как «table.txt» в рабочем каталоге).
источник
Рубин, 1068 байт
Ввод через STDIN.
Кратчайшие уникальные подстроки имен элементов имеют второй или шестой символ (или конец имени, если он слишком короткий). Так что я просто получаю их и смотрю их в хэше. Я также сжал хеш, потому что это экономит еще 200 байтов. Вот как выглядит сам хеш:
источник
CJam,
462 449 434 401 391 384382С помощью Дениса.
Код
Вложенные троичные ifs, вероятно, не правильный способ сделать это в CJam.
С отступами:
Многие символы - это только первые две буквы имени элемента. Они обрабатываются на втором по глубине уровне вложенных операторов if. Многие другие являются первой и третьей буквой или первой и четвертой буквой - они обрабатываются в последовательных внешних слоях. Символы, где появляется только первая буква, и полные нерегулярные символы обрабатываются в пятом и третьем самых глубоких слоях соответственно.
Есть несколько, где это запутывается (
TelLurium
противThaLlium
илиSILicon
противSILver
, илиRUThenium
противRUTherfordium
). Они обрабатываются отдельно.Здесь можно много поиграть в гольф, в основном путем повторного использования блоков кода и улучшения обработки нерегулярных кодов.
источник
"RUTHENIUM"=
вы не сможете его использовать"RUTHEN"#!
. 2. Вам не нужноo
ни явно печатать ( ), ни удалять что-либо до фактического имени элемента (;"Si"
); просто добавьте]W=
в конец своего кода, чтобы удалить все, кроме самого верхнего элемента стека. 3. Это делает несколько блоков пустыми. ЕслиB
это логическое значение,B{...}{}?
иB{...}*
достичь того же. 4. Троичный, если принимает блоки или элементы стека, так что вы можете сократить{"Si"}
до"Si"
._
и;
повсеместноPHP,
507485476466 символовИспользование: введите имя элемента в виде параметра GET '0' - elements.php? 0 = carbon
Алгоритм: пробежаться по строке данных, вытянуть подстроку, пары кодов аббревиатур. Если подстрока соответствует началу переданного элемента, используйте код сокращения, чтобы определить, что выводить: если код начинается с буквы, выведите ее в виде строки. Если это число N, выведите первую букву элемента + N-ую букву. Элементы Unun имеют специальный регистр с кодом '|'. Если подстрока не найдена и соответствует переданному имени, выведите первые два символа имени в качестве сокращения.
Читаемый код:
Сгущенное:
источник
JavaScript (1100)
Наивная реализация сияет своей простотой. Уникальная подстрока в начале имени просто сопоставляется с символом.
источник
Питон -
652 649637Моя хеш-таблица основана на комбинации каждой секунды и каждого третьего символа имени в верхнем регистре:
Вот соответствующий генератор:
Вероятно, есть место для улучшений, особенно для сжатия двух длинных строк.
Протестировано с:
источник
Golfscript -
1052821Объяснение:
источник
n/
Haskell,
920817807776 символовПосле слишком долгой работы над созданием системы правил для того, какие символы имени элемента включаются в его символ, и немного переделок, мне удалось написать скрипт, который легко переводит элемент в символ. Железо было для меня проблемой, потому что я мог выбрать некоторые символы из GOld, SilVer, TiN, LEad, SoDium, MerCury, ANtimony, PotaSsium и TUngsten, преобразовав их в неиспользуемый периодический символ (я выбрал тот, который делал выборку проще для интеграции их в существующие правила), а затем переводить после символического преобразования; Железо, однако, было проблемой, потому что Ir, Io и In все уже используются. Первоначально это было 920 символов, но я понял, что не должно быть там последнего совпадения с шаблоном (самое большое), поскольку оно либо пропускало вещи (чего не было), либо соответствовало всем; следовательно, Я заменил его универсальным подстановочным знаком. После этого я продолжил игру в гольф с 817 по 808, сокращая некоторые паттерны с использованием подстановочных знаков таким образом, чтобы они все еще были уникальными для этого имени элемента (например, единственный элемент с буквой 'w' в названии - Lawrencium, поэтому "* w "соответствует тому, что на 1 символ меньше, чем" Law ").
Вот мой код. Я проверил его для всех элементов и закодировал так, чтобы он автоматически преобразовывал свои входные данные в заглавные буквы, чтобы не возникало проблем с чувствительностью к регистру.
РЕДАКТИРОВАТЬ 1
Я также уменьшил его до 776 символов, заменив выражение case в t на совпадение с шаблоном (это имеет смысл, поскольку выражение case проверяло необработанный операнд, а не выражение в терминах операнда), удаляя ненужные скобки и повторно Выражение
e
в виде строки с разделителями новой строки вместо списка строк и последующее разбиение в основной функции. Поскольку эти изменения являются чисто гольфом, я оставил читабельную версию без изменений.Человекочитаемая версия (переводы строк, пробелы, подробные имена, комментарии: 2311 символов)
Если кто-то заинтересован в объяснении какой-либо части этого, не стесняйтесь спрашивать.
источник
C # (826)
не самый лучший, но я думал, что попробую это с гандикапом c #.
Поэтому я написал программу для преобразования полного имени элементов (например, carbon) в наименьшую, но все же уникальную строку, и сделал это для всех элементов относительно всех других уникальных строк. Затем я сериализовал это в большую уродливую строку, где заглавные буквы обозначают начало «чанков», чанки чередуются между ключами и значениями. Как KeyValueKey2Value2 и т. Д.
Этот скрипт стерилизует эту большую строку и обрезает символ с конца введенной строки, пока не найдет его в словаре, составленном из большой строки.
(Я должен добавить, что мои знания C # не удивительны, и исходное представление, которое я сделал, было просто с использованием вещей, которые я знал, но впоследствии мне были даны некоторые уловки, на которые мне указывали другие.)
источник
var
. Вы можете сохранить еще несколько, удалив фигурные скобки после одного оператора if блоков. Если вы назначитеt.Substring(int, int)
дляFunc<int, int, string>
вы можете сохранить еще одну пару.var
используя 3,string[] r
и еще 3,var
используяstring t = Console....
, наконец, вы сэкономите еще 7, перейдяreturn new string[]
вreturn new[]
самый конец.if(...) break;
логику в условия выхода цикла for. Можно применить ряд других логических инверсий, например,do { } while(..)
в вашем методе извлечения. Это короче, чем добавление отдельной логической операции для случая ввода. Я разместил изменения в вашем коде, которые все еще нуждаются в проверке / принятии из-за моей низкой репутации на этом сайте. Получил до 870 символов.JavaScript (E6) 1433
Здесь верхний предел
Тест в консоли FireFox / FireBug
Выход
источник
SmileBASIC,
1763141812041128 байтЯ выбрал 3 персонажа, которые были в основном уникальными (0-й, 2-й и 3-й), что оставляет 2 особых случая: церий / кюрий - оба «Ciu», а рутений / рутерфордий - «Rhe». Для Ciu я проверяю, является ли второй символ имени «e» или «E», а для «Rhe» я проверяю длину имени.
VAR(name)
возвращает переменную с этим именем. Имена переменных не чувствительны к регистру.источник
T-SQL,
900 894676 байтВозвращает только для читабельности, вторая строка - одна очень длинная строка.
STRING_SPLIT
поддерживается в SQL 2016 и выше.Ввод осуществляется через уже существующую таблицу t с полем varchar e , в соответствии с нашими стандартами ввода-вывода . Вывод дополнен пробелами до 3 символов; правила были неясны, было ли это нормально. При необходимости я могу добавить
TRIM
.Входная таблица объединяется с таблицей, созданной со списком всех символов элемента (с добавлением 3 символов) с кратчайшим уникальным префиксом для каждого имени элемента (
X
достаточно для ксенона , но Rutherfordium требуетRuther
отличить его от рутения ).РЕДАКТИРОВАТЬ 1 : сохранил 218 символов, удалив из списка 44 записи, символ которых - первые две буквы их имени;
ISNULL
функция используется , чтобы увидеть , если первый запрос не возвращает строку, и если да, генерирует символ (правильно обсаженный) от имени входного элемента.источник