Электронная конфигурация

17

В атомной физике и квантовой химии , то электронная конфигурация является распределение электронов в качестве атома в атомных орбиталей . Например, электронная конфигурация атома неона равна 1s 2 2s 2 2p 6 . (Из Википедии )

Вызов

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

Железо (26) имеет электронную конфигурацию . Однако верхние индексы не нужны; вывод для 26 должен быть в соответствии с .1s2 2s2 2p6 3s2 3p6 3d6 4s21s2 2s2 2p6 3s2 3p6 3d6 4s2

Спецификация

  • Вам не нужно обрабатывать какие-либо входы за пределы диапазона 1 <= n <= 118.
  • Ваш результат должен выглядеть как в тестовых примерах, но вы можете использовать любые нецифровые символы / символы (кроме s, p, dи f) , чтобы разграничить различные орбитали.
  • Вы должны вернуть / напечатать строку, содержащую орбитальные имена / значения / делмитеры; Вы не можете просто вернуть / напечатать массив.
  • Вам не нужно обрабатывать какие-либо исключения из принципа Aufbau; там, где есть исключения, распечатка «неправильной» конфигурации - это нормально.

Примеры:

Input -> Valid output            -> Invalid output
16    -> 1s2 2s2 2p6 3s2 3p4     -> 1s22s22p63s23p4
16    -> 1s2, 2s2, 2p6, 3s2, 3p4 -> [[1, 2], [2, 2], [2, 6], [3, 2], [3, 4]]
17    -> 1s2+2s2+2p6+3s2+3p5     -> 1s2s2s2s2p6p3s2s3p5

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

name: 1s 2s 2p 3s 3p 3d 4s 4p 4d 5s 5p 4f 5d 6s 6p 5f 6d 7s 7p
max:  2  2  6  2  6  10 2  6  10 2  6  14 10 2  6  14 10 2  6

Тестовые случаи

Input -> Output
1     -> 1s1
2     -> 1s2
16    -> 1s2 2s2 2p6 3s2 3p4
50    -> 1s2 2s2 2p6 3s2 3p6 3d10 4s2 4p6 4d10 5s2 5p2
115   -> 1s2 2s2 2p6 3s2 3p6 3d10 4s2 4p6 4d10 5s2 5p6 4f14 5d10 6s2 6p6 5f14 6d10 7s2 7p3

Вот полный список и справочная реализация сортов ( попробуйте онлайн! )

Условие победы

Поскольку это , выигрывает самый короткий код!

MD XF
источник
2
Каждый вызов IIRC, который выполняется на конечном наборе входов с постоянным выходом, является кандидатом на тег Колмогорова. Хороший вызов.
Уриэль
6
В тестовых случаях, 3dкажется, заполняется до 4s, 4dдо 5s, 6sпосле 4fи 5d, что нарушает правило Маделунга . Должны ли мы играть в гольф программы, которые печатают неправильные электронные конфигурации на пастбине?
JungHwan Мин
5
Кроме того, существуют исключения из принципа Ауфбау (например, 4s1 3d5вместо хрома (атомный № 24) 4s2 3d4). Я вижу, что это было задано в песочнице, но так и не получил ответа. Мы игнорируем эту проблему?
JungHwan Мин
1
Боже мой, я клянусь, что собираюсь опубликовать этот же вопрос ... сегодня
FantaC

Ответы:

2

Желе , 63 62 56 55 байт

ḊFµi@€QḤ’Ḥ
“ŒµḊuÆẓƙỊ’D,“çƥ÷£ḟ’ṃ“spdf”¤µxÇZ
¢ḣŒg'µQ€żL€K

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

Спасибо пользователю 202729 за сохранение 6 байтов с базовой распаковкой!

объяснение

Сначала я строю список [[1,2,2,3,3,3,4,4,4,5,5,4,5,6,6,5,6,7,7],'sspspdspdspfdspfdsp']с кодом “ŒµḊuÆẓƙỊ’D,“çƥ÷£ḟ’ṃ“spdf”¤во второй ссылке.

  • “ŒµḊuÆẓƙỊ’это число, 1223334445545665677сжатое в базу 250. Dдает превращает это в список цифр.
  • “çƥ÷£ḟ’ṃ“spdf”изменяет число 250 “çƥ÷£ḟ’в базу 4 и индексирует ее в строку, “spdf”дающую 'sspspdspdspfdspfdsp'. Это было предоставлено пользователем 202729.

Затем список переходит к первой ссылке Ç. Первая ссылка делает следующее:

ḊFµQiЀµḤ’Ḥ
ḊF           Dequeue then flatten yields 'sspspd...'. Ṫ doesn't work because it modifies the input.
  µ          New monadic link
   Q         Unique elements → 'spdf'
    iЀ      The index of each of 'sspspd...' into the string 'spdf' → [1,1,2,1,2,3...]
       µ     New monadic link. This prevents Ḥ from acting on the right argument of iЀ.
        Ḥ’Ḥ  Takes [1,1,2,1...] and computes 2(2l+1) → [2,2,6,2,6,10...]

Теперь вернемся ко второй ссылке. При этом мы повторяем каждый из элементов в каждом подсписке [[1,2,2,3...7],['sspspd...p']]по номерам в нашем новом списке [2,2,6...]. Это дает [[1,1,2,2,2,2...],['sssspp...']]. Zмолнии два подсписка, который дает [[1,'s'],[1,'s'],[2,'s']...].

Теперь к основной ссылке. ¢вызывает вторую ссылку, которая дает окончательный список кортежей, описанных выше. Предположим, что вход для программы 5 в качестве примера.

¢ḣŒg'µQ€żL€K
¢             Calls the second link as a nilad which yields the final list of tuples described above
 ḣ            Takes the first 5 tuples → [[1,'s'],[1,'s'],[2,'s'],[2,'s'],[2,'p']]
  Œg'         Group together runs of equal elements → [[[1,'s'],[1,'s']],[[2,'s'],[2,'s']],[[2,'p']]]
     µ        New monadic link
      Q€      Unique elements of each of these runs
         L€   Length of each of these runs
        ż     Zip these together → [[[1,'s'],2],[[2,'s'],2],[[2,'p'],1]]
           K  Join this list with spaces → 1s2 2s2 2p1
dylnan
источник
Любой способ сжать sspspdspd...строку?
MD XF
@MDXF Я пытался, но это оказалось дольше. Я также пытался построить его различными способами, и отдельные части были короче, но в целом это было длиннее
Дилнан
@dylnan “çƥ÷£ḟ’ṃ“spdf”¤для -6 ​​байт. Использовал это для базовых 250 целых чисел и для базовой декомпрессии.
user202729
@ user202729 здорово, спасибо!
Дилнан
7

Императив Тампио , 930 байт

Yöllä on ilot.Olkoon oma ilo uusi yö, jonka iloja ovat ilo"1s",ilo"2s",ilo"2p",ilo"3s",ilo"3p",ilo"3d",ilo"4s",ilo"4p",ilo"4d",ilo"5s",ilo"5p",ilo"4f",ilo"5d",ilo"6s",ilo"6p",ilo"5f",ilo"6d",ilo"7s"ja ilo"7p".Olkoon iso yö uusi yö, jonka iloja ovat 2,2,6,2,6,10,2,6,10,2,6,14,10,2,6,14,10,2 ja 6.Kun iso luku juo ison ilon,iso ilo näyttää oman yön,missä oma yö on oman ilon ensimmäinen ilo ja ujo ilo on ison yön ensimmäinen ilo,jos iso luku on suurempi kuin ujo ilo,niin iso ilo näyttää ujon ilon,iso ilo näyttää ilon" ",oman ilon iloiksi asetetaan oman ilon ilot toisesta alkaen,ison yön iloiksi asetetaan ison yön ilot toisesta alkaen ja iso luku vähennettynä ujolla ilolla juo ison ilon ja,jos iso luku on pienempi tai yhtä suuri kuin ujo ilo,niin iso ilo näyttää ison luvun.Olkoon oma muuttuja uusi muuttuja.Kun iso sivu avautuu,omaan muuttujaan luetaan luku ja oman muuttujan arvo juo ison sivun.

Yöllä on ilot. Olkoon OMA мот Ууси YO, Jonka iloja ovat мот"1s" , мот"2s" , мот"2p" , мот"3s" , мот"3p" , мот"3d" , мот"4s" , мот"4p" , мот"4d" , мот"5s" , мот"5p" , мот"4f" , мот"5d" , мот"6s" , мот"6p" , мот"5f" , мот"6d" , мот "7s"JA мот"7p" . Olkoon iso yö uusi yö, Йонка iloja ovat 2 , 2, 6, 2, 6, 10, 2, 6, 10, 2, 6, 14, 10, 2, 6, 14, 10, 2 JA 6 .Kun iso luku juo ison ilon , iso ilo näyttää oman yon, мисса oma yö на Омане ilon ensimmäinenilo ja ujo ilo на ison yon ensimmäinenilo, jos iso luku на suurempi kuin ujo ilo, niin iso ilo näyttää ujon ilon гончар" " , Оман АТРИБУТИКА iloiksi asetetaan Оман АТРИБУТИКА Ilot toisesta alkaen , исон Йон iloiksi asetetaan исон Йон Ilot toisesta alkaen JA изо Luku vähennettynä ujolla ilolla juo исон АТРИБУТИКА JA , Jos изо Luku на pienempi таи yhtä Suuri Куин Ujo Ило, Niin изо моты näyttää исон luvun. Olkoon oma muuttuja uusi muuttuja. Kun изо Сиву avautuu , omaan muuttujaan luetaan Luku JAОмане muuttujan Арво juo исоном sivun.

Онлайн версия

Это очень простая реализация. В golfed версии я просто заменить слова с короткими словами нравится ilo, , iso, omaи т.д.

Ungolfed:

Листалла на Алкиот.

Olkoon lyhyt orbitaalilista Ууси Lista, Jonka alkioita ovat orbitaali "1s" , orbitaali "2s" , orbitaali "2p" , orbitaali "3s" , orbitaali "3p" , orbitaali "3d" , orbitaali "4s" , orbitaali "4p" , orbitaali "4d" , orbitaali "5s" , orbitaali "5p" , orbitaali "4f" , orbitaali "5d" , orbitaali "6s" , orbitaali "6p" , orbitaali "5f" , orbitaali "6d" , orbitaali "7s" ja orbitaali "7p" .

Olkoon lyhyt maksimilista Ууси Lista, Jonka alkioita ovat 2 , 2, 6, 2, 6, 10, 2, 6, 10, 2, 6, 14, 10, 2, 6 , 14, 10, 2 JA 6 .

Kun jaetaan orbitaaleille pienehkö elektronimäärä nykyisellä sivulla,

  • nykyinen sivu nyyttää nykyisen orbitaalin, missä nykyinen orbitaali on lyhyen orbitaalilistan ensimmäinenalio ja nykyinen maksimi on lyhyen maksimilistan ensimmäinenalio,
  • jos pienehkö elektronimäärä on suurempi kuin nykyinen maksimi, niin

    • Никинен Сиву Няйттяа Никисен Максимин,
    • никийнен сиву няйттяа валин " " ,
    • lyhyen orbitaalilistan alkioiksi asetetaan lyhyen orbitaalilistan alkiot toisesta alkaen ,
    • Lyhyen Максимилистан Alkioiksi Asetetaan Lyhyen Максимилистан Alkiot toisesta Alkaen
    • JA jaetaan orbitaaleille pienehkö elektronimäärä vähennettynä nykyisellä maksimilla nykyisellä sivulla,
  • ja , jos pienehkö elektronimäärä on pienempi tai yhtä suuri kuin nykyinen maksimi,
    • ниин никийнен сиву няйття пиенехкон электрон.

Olkoon mukava muuttuja Ууси muuttuja.

Кун никинен сиву аваууу ,

  • mukavaan muuttujaan luetaan luku
  • ja jaetaan orbitaaleille mukavan muuttujan arvo nykyisellä sivulla.

Онлайн версия

Перевод:

Список имеет предметы.

Пусть короткий орбитальный список будет новым списком, его элементами являются орбитальный "1s", орбитальный "2s", орбитальный "2p", орбитальный "3s", орбитальный "3p", орбитальный "3d", орбитальный "4s", орбитальный "4p", орбитальный "4d", орбитальный "5s", орбитальный "5p", орбитальный "4f", орбитальный "5d", орбитальный "6s", орбитальный "6p", орбитальный "5f", орбитальный "6d", орбитальный "7s" и орбитальный"7p" .

Пусть короткий максимальный список будет новым списком, его пунктами являются 2, 2, 6, 2, 6, 10, 2, 6, 10, 2, 6, 14, 10, 2, 6, 14, 10, 2 и 6 ,

Когда небольшое количество электронов делится на орбитали на текущей странице,

  • текущая страница показывает текущую орбиту, где текущая орбита является первым элементом в коротком орбитальном списке, а текущий максимум является первым элементом в коротком списке максимумов,
  • если небольшое количество электронов больше текущего максимума,
    • текущая страница показывает текущий максимум,
    • текущая страница показывает пространство" " ,
    • элементы короткого орбитального списка задаются как элементы короткого орбитального списка, начиная с второго,
    • элементы короткого списка максимумов задаются как элементы короткого списка максимумов, начиная со второго
    • и небольшое количество электронов, вычтенных одним , делится на орбитали на текущей странице,
  • и , если небольшое количество электронов меньше или равно текущему максимуму,
    • текущая страница показывает небольшое количество или электронов.

Пусть хорошая переменная будет новой переменной.

Когда откроется текущая страница ,

  • число читается в хорошую переменную
  • и значение переменной nice делится на орбитали на текущей странице.

Перевод приблизительный, мне пришлось изменить порядок слов, чтобы сделать английский более естественным.

fergusq
источник
1
Это хорошо ...
FantaC
Конечно, есть более молчаливый язык, который имеет все особенности этого.
Никто не
Не могли бы вы добавить перевод на английский, чтобы мы могли понимать этот язык?
Захари
@ Zacharý Я добавил это.
fergusq
4

JavaScript (ES6), 102 байта

n=>'0010120120132013201'.replace(/./g,k=>n?++p[m=k*4+2,n-=e=m>n?n:m,k]+'spdf'[k]+e+' ':'',p=[0,1,2,3])

Контрольные примеры

Отформатировано и прокомментировано

n =>                          // given the atomic number n
  '0010120120132013201'       // list of azimuthal quantum numbers
  .replace(/./g, k =>         // replace each character k in the above string with:
    n ?                       //   if n does not equal 0:
      ++p[                    //     ++p[k] = updated principal quantum number
        m = k * 4 + 2,        //       m = maximum number of electrons
        n -=                  //       subtract from n:
          e = m > n ? n : m,  //         e = min(m, n) = number of electrons
        k                     //       index actually used to access the p[] array
      ] +                     //     followed by:
      'spdf'[k] +             //     the label
      e + ' '                 //     and the number of electrons
    :                         //   else:
      '',                     //     an empty string
    p = [0, 1, 2, 3]          //   initial list of principal quantum numbers
  )                           // end of replace()
Arnauld
источник
2

Swift , 177 175 156 байт

Похоже на ответ Javascript @ Arnauld's

func f(n:Int){var i=n,a=0,b=[0,1,2,3];[0,0,1,0,1,2,0,1,2,0,1,3,2,0,1,3,2,0,1].map{a=$0*4+2;b[$0]+=1;i>0 ?print(b[$0],"spdf".map{$0}[$0],min(a,i)):();i-=a}}

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

Без пробелов в электронных группах 190 187 169 байт:

func f(n:Int){var i=n,a=0,b=[0,1,2,3];[0,0,1,0,1,2,0,1,2,0,1,3,2,0,1,3,2,0,1].map{a=$0*4+2;b[$0]+=1;i>0 ?print(b[$0],"spdf".map{$0}[$0],min(a,i),separator:""):();i-=a}}

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

Герман Л
источник
1

C (gcc), 260 187 167 156 152 147 143 138 байт

i,*m;f(e){for(m=L"...",i=0;e>0;printf("%.2s%d ","1s2s2p3s3p3d4s4p4d5s5p4f5d6s6p5f6d7s7p"+i++*2,(e-=*m)<0?*m+e:*m++));}

Попробуйте онлайн!Гольф от эталонной реализации.

StackExchange удаляет непечатаемые, поэтому значение m заменяется на"..." .

Вот обратимый hexdump программы, так как он использует непечатаемые в строке, который заменяет целочисленный массив {2,2,6,2,6,10,2,6,10,2,6,14,10,2,6,14,10,2,6}буквенными байтовыми значениями целых чисел.

00000000: 692c 2a6d 3b66 2865 297b 666f 7228 6d3d  i,*m;f(e){for(m=
00000010: 4c22 0202 0602 065c 6e02 065c 6e02 060e  L".....\n..\n...
00000020: 5c6e 0206 0e5c 6e02 0622 2c69 3d30 3b65  \n...\n..",i=0;e
00000030: 3e30 3b70 7269 6e74 6628 2225 2e32 7325  >0;printf("%.2s%
00000040: 6420 222c 2231 7332 7332 7033 7333 7033  d ","1s2s2p3s3p3
00000050: 6434 7334 7034 6435 7335 7034 6635 6436  d4s4p4d5s5p4f5d6
00000060: 7336 7035 6636 6437 7337 7022 2b69 2b2b  s6p5f6d7s7p"+i++
00000070: 2a32 2c28 652d 3d2a 6d29 3c30 3f2a 6d2b  *2,(e-=*m)<0?*m+
00000080: 653a 2a6d 2b2b 2929 3b7d                 e:*m++));}

Кроме того, вы можете просто скопировать код из ссылки TIO.

MD XF
источник