Konfiguracja elektronów

17

W fizyce atomowej i chemii kwantowej The konfiguracja elektronowa jest rozkład elektronów o z atomem w orbitali atomowych . Na przykład konfiguracja elektronowa atomu neonu to 1s 2 2s 2 2p 6 . (Z Wikipedii )

Wyzwanie

Wyzwanie polega na pobraniu liczby reprezentującej liczbę atomową elementu i wysłaniu konfiguracji elektronowej tego elementu, zgodnie z zasadą Aufbau .

Żelazo (26) ma konfigurację elektronową . Jednak indeksy górne są niepotrzebne; wyjście dla 26 powinno być zgodne z .1s2 2s2 2p6 3s2 3p6 3d6 4s21s2 2s2 2p6 3s2 3p6 3d6 4s2

Specyfikacja

  • Nie musisz obsługiwać żadnych danych wejściowych poza zakresem 1 <= n <= 118.
  • Twój wynik powinien wyglądać mniej więcej przypadków testowych, ale można używać niż cyfra / znaków (oprócz s, p, d, i f), aby oddzielić różne orbitale.
  • Musisz zwrócić / wydrukować ciąg zawierający nazwy / wartości / ograniczniki orbitalne; nie można po prostu zwrócić / wydrukować tablicy.
  • Nie musisz zajmować się żadnymi wyjątkami od zasady Aufbau; w przypadku wyjątków drukowanie „niepoprawnej” konfiguracji jest w porządku.

Przykłady:

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

Oto lista wszystkich elektronicznych orbitali. Maksymalne wartości, które mogą zawierać, są poniżej nazwy:

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

Przypadki testowe

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

Oto pełna lista i rodzaj implementacji referencji ( Wypróbuj online! )

Warunki wygranej

Ponieważ jest to , wygrywa najkrótszy kod!

MD XF
źródło
2
IIRC każde wyzwanie, które działa na skończonym zestawie danych wejściowych ze stałą wydajnością, jest kandydatem na tag kolmogorov. Niezłe wyzwanie.
Uriel,
6
W przypadkach testowych 3dwydaje się być wypełniony przed 4s, 4dprzed 5s, 6spo 4fi 5d, co narusza zasadę Madelunga . Czy powinniśmy używać programów do golfa, które drukują nieprawidłowe konfiguracje elektronów na pastebinie?
JungHwan Min.
5
Istnieją również wyjątki od zasady Aufbau (jak chrom 4s1 3d5zamiast (atomowy nr 24) zamiast 4s2 3d4). Widzę, że został o to poproszony w piaskownicy, ale nigdy nie otrzymał odpowiedzi. Czy ignorujemy ten problem?
JungHwan Min.
1
OMG Przysięgam, że zamierzam zadać to samo pytanie ... dzisiaj
FantaC,
1
@Uriel status-complete
MD XF

Odpowiedzi:

2

Galaretka , 63 62 56 55 bajtów

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

Wypróbuj online!

Podziękowania dla user202729 za oszczędność 6 bajtów z podstawową dekompresją!

Wyjaśnienie

Najpierw tworzę listę [[1,2,2,3,3,3,4,4,4,5,5,4,5,6,6,5,6,7,7],'sspspdspdspfdspfdsp']z kodem “ŒµḊuÆẓƙỊ’D,“çƥ÷£ḟ’ṃ“spdf”¤w drugim łączu.

  • “ŒµḊuÆẓƙỊ’jest liczbą 1223334445545665677skompresowaną do bazy 250. Ddaje zamienia to w listę cyfr.
  • “çƥ÷£ḟ’ṃ“spdf”zmienia podstawę 250 ilość “çƥ÷£ḟ’na podstawie 4, z indeksami ją w ciągu “spdf”otrzymując 'sspspdspdspfdspfdsp'. Przyczynił się do tego użytkownik202729.

Lista jest następnie przenoszona do linku do pięści przez Ç. Pierwszy link wykonuje następujące czynności:

Ḋ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...]

Teraz wróć do drugiego linku. Z powtarzamy każdego z elementów w każdym podmenu [[1,2,2,3...7],['sspspd...p']]numerami w naszej nowej listy [2,2,6...]. To daje [[1,1,2,2,2,2...],['sssspp...']]. Zzamyka dwie podlisty, które dają [[1,'s'],[1,'s'],[2,'s']...].

Teraz do głównego linku. ¢wywołuje drugi link, który daje końcową listę krotek opisanych powyżej. Załóżmy, że dane wejściowe do programu to 5 jako przykład.

¢ḣŒ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
źródło
Jakikolwiek sposób na skompresowanie sspspdspd...ciągu?
MD XF,
@MDXF Próbowałem, ale skończyło się to dłużej. Próbowałem też skonstruować go na różne sposoby, a poszczególne części były krótsze, ale jako całość były dłuższe
dylnan
@dylnan “çƥ÷£ḟ’ṃ“spdf”¤na -6 bajtów. Używane to za baza 250 i całkowitej dla bazowej dekompresji.
user202729,
@ user202729 miło, dziękuję!
dylnan
7

Tryb imperatywny , 930 bajtów

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ä na 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 , ilo , ilo "7s"ja ilo"7p" . Olkoon iso yö uusi yö, jonkailoja ovat 2 , 2, 6, 2, 6, 10, 2, 6, 10, 2, 6, 14, 10, 2, 6, 14, 10, 2 ja 6 . Kun izo luku juo Ison Daniel, izo ilo näyttää oman kierun, missa oma yö na oman Daniel ensimmäinenilo ja Ujo ilo na Ison kierun ensimmäinenMOP jos izo luku na suurempi kuin Ujo MOP niin izo ilo näyttää ujon Daniel, izo ilo näyttää Daniel" " , Oman Daniel iloiksi asetetaan oman Daniel ilot toisesta alkaen , Ison kierun iloiksi asetetaan Ison kierun ilot toisesta alkaen ja izo luku vähennettynä ujolla ilolla juo Ison Daniel ja , jos izo luku na pienempi tai yhtä suuri kuin Ujo MOP niin izo ilo näyttää Ison luvun. Olkoon oma muuttuja uusi muuttuja. Kun iso sivu avautuu , omaan muuttujaan luetaan luku jaoman muuttujan arvo juo ison sivun.

Wersja online

Jest to bardzo prosta implementacja. W wersji grałem po prostu zastąpione rozmowę z krótkich słowach podoba ilo, , iso, oma, etc.

Nie golfowany:

Listalla na alkiot.

Olkoon lyhyt orbitaalilista uusi 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 uusi 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 näyttää nykyisen orbitaalin, missä nykyinen orbitaali on lyhyen orbitaalilistan ensimmäinenalkio ja nykyinen maksimi on lyhyen maksimilistan ensimmäinenalkio,
  • jos pienehkö elektronimäärä on suurempi kuin nykyinen maksimi, niin

    • nykyinen sivu näyttää nykyisen maksimin,
    • nykyinen sivu näyttää välin " " ,
    • lyhyen orbitaalilistan alkioiksi asetetaan lyhyen orbitaalilistan alkiot toisesta alkaen ,
    • lyhyen maksimilistan alkioiksi asetetaan lyhyen maksimilistan 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,
    • niin nykyinen sivu näyttää pienehkön elektronimäärän.

Olkoon mukava muuttuja uusi muuttuja.

Kun nykyinen sivu avautuu ,

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

Wersja online

Tłumaczenie:

Lista zawiera elementy.

Niech krótka lista orbit będzie nową listą, jej elementami orbital "1s", orbital "2s", orbital "2p", orbital "3s", orbital "3p", orbital "3d", orbital "4s", orbital "4p", orbital "4d", orbital "5s", orbital "5p", orbital "4f", the orbital "5d", orbital "6s", orbital "6p", orbital "5f", orbital "6d", orbital "7s" i orbital "7p".

Niech krótka lista maksymalna będzie nową listą, jej pozycje to 2, 2, 6, 2, 6, 10, 2, 6, 10, 2, 6, 14, 10, 2, 6, 14, 10, 2 i 6 .

Gdy niewielka liczba elektronów zostanie podzielona na orbitale na bieżącej stronie,

  • bieżąca strona pokazuje bieżący orbital, gdzie aktualny orbital jest pierwszym elementem na krótkiej liście orbit, a bieżące maksimum jest pierwszym elementem na krótkiej liście maksimum,
  • jeśli niewielka liczba elektronów jest większa niż obecne maksimum,
    • bieżąca strona pokazuje aktualne maksimum,
    • bieżąca strona pokazuje miejsce " ",
    • elementy krótkiej listy orbitalnej są ustawione jako elementy krótkiej listy orbitalnej rozpoczynającej się od drugiej,
    • elementy krótkiej maksymalnej listy są ustawione jako elementy krótkiej maksymalnej listy zaczynającej się od drugiej
    • a niewielka liczba elektronów odejmowana przez jeden jest dzielona na orbitale na bieżącej stronie,
  • i , jeżeli mała ilość elektronów jest mniejsza niż lub równa aktualnej maksimum
    • bieżąca strona pokazuje małą liczbę lub elektrony.

Niech ładna zmienna będzie nową zmienną.

Gdy bieżąca strona otwiera ,

  • liczba jest odczytywana do ładnej zmiennej
  • a wartość zmiennej nice jest dzielona na orbitale na bieżącej stronie.

Tłumaczenie jest przybliżone, musiałem zmienić kolejność słów, aby angielski był bardziej naturalny.

fergusq
źródło
1
wtf to dobrze ...
FantaC,
Z pewnością istnieje bardziej milczący język, który ma wszystkie cechy tego języka.
Nikt
Czy możesz być tak uprzejmy, aby dodać tłumaczenie na angielski, abyśmy mogli zrozumieć ten język?
Zacharý
@ Zacharý Dodałem to.
fergusq
6

Python 2 , 129 128 bajtów

-1 bajt dzięki notjagan

n=input()
d='spdf'.find
s='sspspdspdspfdspfdsp'
i=0
while n>0:c=s[i];t=d(c)*4+2;print`s[:i].count(c)-~d(c)`+c,min(t,n);n-=t;i+=1

Wypróbuj online!

Pręt
źródło
-1 bajt.
notjagan,
5

Węgiel drzewny , 72 bajty

Nθ≔”{⊞″I⌀⁼C$Pπ3”α≔⁰ιW›θ⁰«§”o⧴∨c▷⎇_'l|”ι§αι≔⁺×⁴⌕spdf§αι²εI⌊⟦εθ⟧→≔⊕ιι≔⁻θεθ

Wypróbuj online!

Tutaj masz pełną wersję .

Charlie
źródło
4

JavaScript (ES6), 102 bajty

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])

Przypadki testowe

Sformatowane i skomentowane

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
źródło
2

Szybki , 177 175 156 bajtów

Loosly na podstawie odpowiedzi JavaScript @ Arnauld

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}}

Wypróbuj online!

Bez spacji w grupach elektronów 190 187 169 bajtów:

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}}

Wypróbuj online!

Herman L.
źródło
1

C (gcc), 260 187 167 156 152 147 143 138 bajtów

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

Wypróbuj online! Grał w golfa od realizacji referencyjnej.

StackExchange usuwa niedrukowalne, więc wartość parametru mjest zastępowana przez "...".

Oto odwracalny zrzut heksowy programu, ponieważ używa on niedrukowalnych znaków w ciągu, który zastępuje tablicę liczb całkowitych {2,2,6,2,6,10,2,6,10,2,6,14,10,2,6,14,10,2,6}literałowymi wartościami bajtów liczb całkowitych.

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++));}

Alternatywnie możesz po prostu skopiować kod z linku TIO.

MD XF
źródło