CJam, 87 83 82 80 байт
0"hTHøìð¼Ä¿håêÛ¾ªÔ¼"256b6b5a/4a8**li<{[33:B_B*65_B*1]=\_B%8=B\#*+}/Bb0-`
Приведенный выше код содержит непечатаемые символы.
Попробуйте онлайн в интерпретаторе CJam . Если ссылка не работает для вас, скопируйте из этой вставки .
Фон
Чтобы получить электронную конфигурацию N-го атома, мы начинаем с атома без электронов и применяем к нему N- преобразования.
Чтобы уменьшить количество байтов реализации, мы представляем электронную конфигурацию атома как целое число. Каждая цифра этого целого числа в базе 33 соответствует числу электронов в определенных оболочках; наименее значимая цифра представляет внешнюю оболочку.
Например, электронная конфигурация молибдена (42) имеет вид [2 8 18 13 1] . Это соответствует целому числу 2 × 33 4 + 8 × 33 3 + 18 × 33 2 + 13 × 33 + 1 = 26,79,370 .
Палладий (48) - это особый случай, который мы рассматриваем как [2 8 18 18 0] вместо [2 8 18 18] .
Это удобное представление сводит вышеупомянутые преобразования к простой арифметике:
R += 1
(добавить электрон к внешней оболочке)
R += 33
(добавить электрон во вторую внешнюю оболочку)
R += 65
(добавьте два электрона ко второй внешней оболочке; удалите один из первого)
R += 1089
(добавить электрон в третью внешнюю оболочку)
R += 2145
(добавьте два электрона в третью внешнюю оболочку; удалите один из второго)
R *= 33, R += 1
(добавить новую оболочку, содержащую один электрон)
Осталось только как-то закодировать, какое преобразование нужно применить, чтобы перейти от определенного атома к следующему. Различия целочисленных представлений двух последовательных атомов заключаются в следующем:
[1 1 65 1 1 1 1 1 1 1 2369 1 1 1 1 1 1 1 78401 1 33 33 33 65 1 33 33 33 65 1 1 1 1 1 1 1 2598017 1 33 33 65 33 1 65 33 65 1 1 1 1 1 1 1 1 85745345 1 33 1089 2145 1089 1089 1089 1089 33 2145 1089 1089 1089 1089 1089 33 33 33 33 33 33 33 65 33 1 1 1 1 1 1 1 2830095041 1 33 33 2145 1089 1089 2145 1089 33 2145 1089 1089 1089 1089 1089 65 1 33 33 33 33 33 33 65 1 1 1 1 1 1 1]
Уникальные различия в этом массиве следующие:
[1 33 65 1089 2145 2369 78401 2598017 85745345 2830095041]
Все, кроме первых 5, соответствуют случаям, когда добавляется новая оболочка; их можно опустить, поскольку умножение на 33 и добавление 1 дает тот же результат, что и добавление разницы.
Поскольку мы должны добавить новую оболочку тогда и только тогда, когда текущий атом имеет ровно восемь электронов во внешней оболочке (за исключением He (2) ↦ Li (3) , который может быть закодирован как сложение 65 ), мы можем закодировать эти преобразования, как добавить 1 и определить необходимость умножения на лету.
Таким образом, если мы определим
X := 0
I := 0
L := [33 1089 65 2145 1]
T := [1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 3 1 0 0 0 3 1 1 1 1 1 1 1 1 1 0 0 3 0 1 3 0 3 1 1 1 1 1 1 1 1 1 1 0 2 4 2 2 2 2 0 4 2 2 2 2 2 0 0 0 0 0 0 0 3 0 1 1 1 1 1 1 1 1 1 0 0 4 2 2 4 2 0 4 2 2 2 2 2 3 1 0 0 0 0 0 0 3 1 1 1 1 1 1 1]
электронная конфигурация N-го атома может быть рассчитана следующим образом:
while(X < N):
R *= (33 ** (R % 33 == 8))
R += L[T[X]]
X += 1
Как это устроено
" Push 0, the initial value of R; convert the following array into an integer by
considering it a base 256 number, then back to the array of its digits in base 6. ";
0"hTHøìð¼Ä¿håêÛ¾ªÔ¼"256b6b
" Replace each 5 in the resulting array by [4 4 4 4 4 4 4 4]. This yields the array T
from the above section. ";
5a/4a8**
" Read an integer N from STDIN and discard all but the first N elements of T. ";
li<
" For each element Y of the remainder of T, do the following: ";
{
[33:B_B*65_B*1]=\ " Define B := 33, push L, retrieve L[Y] and swap it with R. ";
_B%8=B\#* " Execute R *= 33 ** (R % 33 == 8). ";
+ " Execute R += L[Y]. ";
}/
" Convert R into the array of its digits in base 33, remove eventual zeros (Palladium)
and replace the resulting array with its string representation. ";
Bb0-`
Пример запуска
$ base64 -d > electrons.cjam <<< MCJoVEgM+OzwErzEGL9o5erbvqrUB4YZhrwRIjI1NmI2YjVhLzRhOCoqbGk8e1szMzpCX0IqNjVfQioxXT1cX0IlOD1CXCMqK30vQmIwLWA=
$ cksum electrons.cjam
3709391992 80 electrons.cjam
$ for i in {1..118}; do LANG=en_US cjam electrons.cjam <<< $i; echo; done
[1]
[2]
[2 1]
[2 2]
[2 3]
[2 4]
[2 5]
[2 6]
[2 7]
[2 8]
[2 8 1]
[2 8 2]
[2 8 3]
[2 8 4]
[2 8 5]
[2 8 6]
[2 8 7]
[2 8 8]
[2 8 8 1]
[2 8 8 2]
[2 8 9 2]
[2 8 10 2]
[2 8 11 2]
[2 8 13 1]
[2 8 13 2]
[2 8 14 2]
[2 8 15 2]
[2 8 16 2]
[2 8 18 1]
[2 8 18 2]
[2 8 18 3]
[2 8 18 4]
[2 8 18 5]
[2 8 18 6]
[2 8 18 7]
[2 8 18 8]
[2 8 18 8 1]
[2 8 18 8 2]
[2 8 18 9 2]
[2 8 18 10 2]
[2 8 18 12 1]
[2 8 18 13 1]
[2 8 18 13 2]
[2 8 18 15 1]
[2 8 18 16 1]
[2 8 18 18]
[2 8 18 18 1]
[2 8 18 18 2]
[2 8 18 18 3]
[2 8 18 18 4]
[2 8 18 18 5]
[2 8 18 18 6]
[2 8 18 18 7]
[2 8 18 18 8]
[2 8 18 18 8 1]
[2 8 18 18 8 2]
[2 8 18 18 9 2]
[2 8 18 19 9 2]
[2 8 18 21 8 2]
[2 8 18 22 8 2]
[2 8 18 23 8 2]
[2 8 18 24 8 2]
[2 8 18 25 8 2]
[2 8 18 25 9 2]
[2 8 18 27 8 2]
[2 8 18 28 8 2]
[2 8 18 29 8 2]
[2 8 18 30 8 2]
[2 8 18 31 8 2]
[2 8 18 32 8 2]
[2 8 18 32 9 2]
[2 8 18 32 10 2]
[2 8 18 32 11 2]
[2 8 18 32 12 2]
[2 8 18 32 13 2]
[2 8 18 32 14 2]
[2 8 18 32 15 2]
[2 8 18 32 17 1]
[2 8 18 32 18 1]
[2 8 18 32 18 2]
[2 8 18 32 18 3]
[2 8 18 32 18 4]
[2 8 18 32 18 5]
[2 8 18 32 18 6]
[2 8 18 32 18 7]
[2 8 18 32 18 8]
[2 8 18 32 18 8 1]
[2 8 18 32 18 8 2]
[2 8 18 32 18 9 2]
[2 8 18 32 18 10 2]
[2 8 18 32 20 9 2]
[2 8 18 32 21 9 2]
[2 8 18 32 22 9 2]
[2 8 18 32 24 8 2]
[2 8 18 32 25 8 2]
[2 8 18 32 25 9 2]
[2 8 18 32 27 8 2]
[2 8 18 32 28 8 2]
[2 8 18 32 29 8 2]
[2 8 18 32 30 8 2]
[2 8 18 32 31 8 2]
[2 8 18 32 32 8 2]
[2 8 18 32 32 10 1]
[2 8 18 32 32 10 2]
[2 8 18 32 32 11 2]
[2 8 18 32 32 12 2]
[2 8 18 32 32 13 2]
[2 8 18 32 32 14 2]
[2 8 18 32 32 15 2]
[2 8 18 32 32 16 2]
[2 8 18 32 32 18 1]
[2 8 18 32 32 18 2]
[2 8 18 32 32 18 3]
[2 8 18 32 32 18 4]
[2 8 18 32 32 18 5]
[2 8 18 32 32 18 6]
[2 8 18 32 32 18 7]
[2 8 18 32 32 18 8]
GolfScript (96 байт)
Вывод в виде
Здесь используется волшебная строка, которая содержит непечатаемые символы, поэтому я даю сценарий в формате xxd:
Для онлайн-тестирования я пишу волшебную строку с escape-кодами:
но это эквивалентно, когда вы не сталкиваетесь с проблемами вставки символов в текстовые области браузера.
Подход заключается в создании виртуальной машины с 7 инструкциями, каждая из которых манипулирует списком электронных счетчиков. Затем для элемента
n
мы начинаем со списка счетчиков электронов0
и запускаем первыеn
инструкции из списка, закодированного магической строкой.Инструкции:
1
)
\)\
+)
. (Это используется только для палладия).+1
@)@@
@+\(2
более длинная@2+@(@
источник
Python 2 (46 + 271 = 327)
Код:
Файл
f
, содержащий следующий двоичный мусор (это коды символов)Base64:
По запросу теперь это полная программа, а не функция.
Старый ответ: Python (Наивный базовый уровень, 422):
Содержание почтового индекса:
И быстрый тест:
источник
:I
f
чтобы я мог его воспроизвести?print
как ключевое слово, а не функция).MATLAB -
248244241178 + 44 = 222 байтауменьшенная:
Expanded:
Зависимость двоичного файла (имя файла ' a '):
Я верю, что это «полная программа» в том смысле, что ее можно вызвать из командной строки, она читает
stdin
и выводит вstdout
.Он использует своего рода двухбайтовый байт-код для построения электронных конфигураций. Две инструкции
и
Инструкции закодированы в двух массивах. Первый хранит
D
аргумент во всех случаях. Второй хранитN
аргумент или0
для указанияpulldown
инструкции, посколькуN = 0
никогда не используется в качестве аргумента.Полная последовательность инструкций:
Стоит отметить, что 28 символов можно отбросить, если мы используем набор символов, специфичный для MATLAB, но я хотел, чтобы мое решение было представлено в виде открытого текста в Stack Exchange без каких-либо внешних ссылок на файлы.Ссылки на внешние файлы это.
Примеры выходов
39
:2 8 18 9 2
78
:2 8 18 32 17 1
117
:2 8 18 32 32 18 7
5
:2 3
источник
Perl 5, 235 (234 + 1 для -E)
Golfed:
Примечание: шестнадцатеричный дамп представлен внизу этого поста, так как некоторые строковые литералы содержат управляющие символы (которые были введены через шестнадцатеричный редактор).
Разоблаченный с комментариями:
Шестнадцатеричный дамп:
источник
CJam,
309289 байтРаботает, заменяя обычные прогоны (например,
2 8 18 32
) целыми числами больше 32 и рассматривая массив всех конфигураций как базовое число 38, которое кодируется в двоичном виде.Пример запуска
источник