Configuração eletrônica

17

Na física atômica e na química quântica , a configuração eletrônica é a distribuição dos elétrons de um átomo nos orbitais atômicos . Por exemplo, a configuração eletrônica do átomo de néon é 1s 2 2s 2 2p 6 . (Da Wikipedia )

Desafio

Seu desafio é pegar um número representando o número atômico de um elemento e emitir a configuração eletrônica desse elemento, conforme definido pelo princípio de Aufbau .

O ferro (26) tem a configuração eletrônica . No entanto, sobrescritos são desnecessários; a saída para 26 deve estar na linha de .1s2 2s2 2p6 3s2 3p6 3d6 4s21s2 2s2 2p6 3s2 3p6 3d6 4s2

Especificação

  • Você não precisa manipular nenhuma entrada fora do intervalo 1 <= n <= 118.
  • Sua saída deve ser algo como os casos de teste, mas você pode usar qualquer não-dígito de caracteres / caracteres (além de s, p, d, e f) para delimitar as diferentes orbitais.
  • Você deve retornar / imprimir uma sequência contendo os nomes / valores / eliminadores orbitais; você não pode simplesmente devolver / imprimir uma matriz.
  • Você não precisa lidar com nenhuma exceção ao princípio Aufbau; onde houver exceções, a impressão da configuração "incorreta" é boa.

Exemplos:

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

Aqui está uma lista de todos os orbitais eletrônicos. Os valores máximos que eles podem conter estão abaixo do nome:

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

Casos de teste

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

Aqui está uma lista completa e uma implementação de referência das sortes ( Experimente online! )

Condição vencedora

Como se trata de , o código mais curto vence!

MD XF
fonte
2
No IIRC, todo desafio executado em um conjunto finito de entradas com saída constante é candidato à marca kolmogorov. Bom desafio.
Uriel
6
Nos casos de teste, 3dparece ser preenchido antes 4s, 4dantes 5s, 6sdepois 4fe 5dque violam a regra Madelung . Devemos jogar programas que imprimem as configurações eletrônicas incorretas na pasta?
JungHwan Min 12/12
5
Além disso, há exceções ao princípio de Aufbau (como o cromo (número atômico 24) tendo em 4s1 3d5vez de 4s2 3d4). Vejo que foi solicitado na postagem da sandbox, mas nunca foi respondido. Ignoramos esse problema?
JungHwan Min 12/12
1
OMG, eu juro que
postaria
1
@Uriel status-complete
MD XF

Respostas:

2

Geléia , 63 62 56 55 bytes

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

Experimente online!

Agradecemos a user202729 por salvar 6 bytes com descompressão de base!

Explicação

Primeiro eu construo a lista [[1,2,2,3,3,3,4,4,4,5,5,4,5,6,6,5,6,7,7],'sspspdspdspfdspfdsp']com o código “ŒµḊuÆẓƙỊ’D,“çƥ÷£ḟ’ṃ“spdf”¤no segundo link.

  • “ŒµḊuÆẓƙỊ’é o número 1223334445545665677compactado na base 250. Dtransforma isso em uma lista de dígitos.
  • “çƥ÷£ḟ’ṃ“spdf”muda o número da base 250 “çƥ÷£ḟ’para a base 4 e índices de TI para a cadeia “spdf”dando origem 'sspspdspdspfdspfdsp'. Isso foi contribuído por user202729.

A lista é então levada para o primeiro link por Ç. O primeiro link faz o seguinte:

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

Agora, de volta ao segundo link. Com repetimos cada um dos elementos em cada sub-lista [[1,2,2,3...7],['sspspd...p']]pelos números da nossa nova lista [2,2,6...]. Isso produz [[1,1,2,2,2,2...],['sssspp...']]. Zfecha a sub-lista que produz [[1,'s'],[1,'s'],[2,'s']...].

Agora, para o link principal. ¢chama o segundo link que gera a lista final de tuplas descritas acima. Suponha que a entrada para o programa seja 5 como exemplo.

¢ḣŒ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
fonte
Alguma maneira de comprimir a sspspdspd...string?
MD XF
@MDXF Eu tentei, mas acabou sendo mais longo. Eu também tentou construí-la de várias maneiras e peças individuais eram mais curtos, mas como um todo já não era
dylnan
@dylnan “çƥ÷£ḟ’ṃ“spdf”¤por -6 bytes. Utilizado este para a base 250 inteiro e para descompressão base.
user202729
@ user202729 legal, obrigado!
dylnan
7

Tampio imperativo , 930 bytes

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 ilo uusi Yo, jonka iloja ovat ilo"1s" , OIT"2s" , OIT"2p" , OIT"3s" , OIT"3p" , OIT"3d" , OIT"4s" , OIT"4p" , OIT"4d" , OIT"5s" , OIT"5p" , OIT"4f" , OIT"5d" , OIT"6s" , OIT"6p" , iloja ovat , , , , , , , , , , ja . Kun ilo"5f" , ilo"6d" , ilo "7s"ja ilo"7p" . Olkoon iso yö uusi yö, jonka 22 , 6, 2, 6, 10, 2, 6, iso luku juo Ison ilon, iso ilo näyttää oman Yon, missa oma yö em oman ilon ilo ja Ujo OIT em Ison yön ilo, jos iso luku em suurempi kuin Ujo ilo, niin iso ilo näyttää ujon ilon, iso ilo näyttää102614102614102 6ensimmäinenensimmäinen 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 ilollaKun iso sivu avautuu , omaan muuttujaan luetaan luku jajuo 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. oman muuttujan arvo juo ison sivun.

Versão online

É uma implementação muito simples. Na versão golfed eu simplesmente substituiu as palavras com palavras curtas, como ilo, , iso, oma, etc.

Ungolfed:

Listalla on alkiot.

Olkoon lyhyt orbitaalilista uusi list , 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 , 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, missy 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 alkiottoisesta alkaen ,
    • lyhyen maksimilistan alkioiksi asetetaan lyhyen maksimilistan alkiottoisesta 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.

Versão online

Tradução:

Uma lista tem itens.

Que a lista orbital curta seja uma nova lista, seus itens são o orbital "1s", o orbital "2s", o orbital "2p", o orbital "3s", o orbital "3p", o orbital "3d", o orbital "4s", o orbital "4p", o orbital"4d" , o orbital "5s", o orbital "5p", o orbital "4f", o orbital , o orbital "5d", o orbital "6s", o orbital "6p", o orbital "5f", o orbital "6d", o orbital "7s" e o orbital "7p".

Deixe a lista curta máxima ser uma nova lista, seus itens são 2, 2, 6, 2, 6, 10, 2, 6, 10, 2, 6, 14, 10, 2, 6, 14, 10, 2 e 6. .

Quando um pequeno número de elétrons é dividido nos orbitais na página atual,

  • a página atual mostra o orbital atual, onde o orbital atual é o primeiro item na lista curta de orbitais e o máximo atual é o primeiro elemento da lista curta máxima,
  • se o pequeno número de elétrons for maior que o máximo atual,
    • a página atual mostra o máximo atual,
    • a página atual mostra o espaço" " ,
    • os elementos da lista orbital curta são definidos para serem os elementos da lista orbital curta a partir de da segunda,
    • os elementos da lista curta máxima são definidos para serem os elementos da lista curta máxima, iniciando no segundo
    • e o pequeno número de elétrons subtraídos por um é dividido nos orbitais da página atual,
  • e , se o pequeno número de elétrons for menor ou igual ao máximo atual,
    • a página atual mostra o pequeno número ou elétrons.

Deixe a variável agradável ser uma nova variável.

Quando a página atual aberta ,

  • um número é lido na variável agradável
  • e o valor da variável nice é dividido pelos orbitais na página atual.

A tradução é aproximada, tive que mudar a ordem das palavras para tornar o inglês mais natural.

fergusq
fonte
1
wtf isso é bom ...
FantaC 13/12
Certamente existe uma linguagem mais tácita que possui todos os recursos desta.
Ninguém
Você poderia adicionar uma tradução para o inglês para que possamos entender esse idioma?
Zachary
@ Zacharý eu adicionei.
Fergusq
6

Python 2 , 129 128 bytes

-1 byte graças a 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

Experimente online!

Cajado
fonte
-1 byte.
notjagan
5

Carvão , 72 bytes

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

Experimente online!

Aqui você tem a versão detalhada .

Charlie
fonte
4

JavaScript (ES6), 102 bytes

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

Casos de teste

Formatado e comentado

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
fonte
2

Swift , 177 175 156 bytes

Basicamente baseado na resposta Javascript de @ 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}}

Experimente online!

Sem os espaços nos grupos de elétrons, 190 187 169 bytes:

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

Experimente online!

Herman L
fonte
1

C (GCC), 260 187 167 156 152 147 143 138 bytes

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

Experimente online! Golfed a partir da implementação de referência.

StackExchange remove os não imprimíveis, portanto, o valor de m é substituído por"..." .

Aqui está um hexdump reversível do programa, já que ele usa não imprimíveis em uma string, que substitui a matriz inteira {2,2,6,2,6,10,2,6,10,2,6,14,10,2,6,14,10,2,6}pelos valores literais de bytes dos inteiros.

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

Como alternativa, você pode simplesmente copiar o código do link TIO.

MD XF
fonte