Configurazione elettronica


17

Nella fisica atomica e nella chimica quantistica , la configurazione elettronica è la distribuzione degli elettroni di un atomo in orbitali atomici . Ad esempio, la configurazione elettronica dell'atomo al neon è 1s 2 2s 2 2p 6 . (Da Wikipedia )

Sfida

La tua sfida è prendere un numero che rappresenta il numero atomico di un elemento e produrre la configurazione elettronica di quell'elemento come definita dal principio di Aufbau .

Iron (26) ha la configurazione elettronica . Tuttavia, gli apice non sono necessari; l'uscita per 26 dovrebbe essere sulla falsariga di .1s2 2s2 2p6 3s2 3p6 3d6 4s21s2 2s2 2p6 3s2 3p6 3d6 4s2

specificazione

  • Non è necessario gestire alcun input al di fuori dell'intervallo 1 <= n <= 118.
  • L'output dovrebbe essere simile ai casi di test, ma è possibile utilizzare qualsiasi non-digit caratteri / caratteri (a parte s, p, d, e f) per delimitare i diversi orbitali.
  • È necessario restituire / stampare una stringa contenente i nomi / valori / delimitatori orbitali; non è possibile semplicemente restituire / stampare un array.
  • Non è necessario gestire alcuna eccezione al principio di Aufbau; dove ci sono eccezioni, la stampa della configurazione "errata" va bene.

Esempi:

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

Ecco un elenco di tutti gli orbitali elettronici. I valori massimi che possono contenere sono sotto il 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

Casi test

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

Ecco un elenco completo e un'implementazione di riferimento di sorta ( Provalo online! )

Condizioni vincenti

Dato che si tratta di , vince il codice più corto!


2
IIRC ogni sfida che viene eseguita su un set finito di input con output costante è un candidato per il tag kolmogorov. Bella sfida.
Uriel,

6
Nei casi di test, 3dsembra essere riempito prima 4s, 4dprima 5s, 6sdopo 4fe 5d, che violano la regola di Madelung . Dobbiamo programmi di golf che stampano le configurazioni di elettroni errate sul pastebin?
JungHwan Min,

5
Inoltre, ci sono eccezioni al principio di Aufbau (come il Chromium (atomico n. 24) che ha 4s1 3d5invece di 4s2 3d4). Vedo che è stato chiesto nel post sandbox ma non ha mai avuto risposta. Ignoriamo questo problema?
JungHwan Min

1
OMG, giuro che stavo per pubblicare questa stessa identica domanda ... oggi
FantaC,

Risposte:


2

Gelatina , 63 62 56 55 byte

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

Provalo online!

Grazie a user202729 per aver salvato 6 byte con decompressione di base!

Spiegazione

Per prima cosa costruisco la lista [[1,2,2,3,3,3,4,4,4,5,5,4,5,6,6,5,6,7,7],'sspspdspdspfdspfdsp']con il codice “ŒµḊuÆẓƙỊ’D,“çƥ÷£ḟ’ṃ“spdf”¤nel secondo link.

  • “ŒµḊuÆẓƙỊ’è il numero 1223334445545665677compresso nella base 250. Ddà la trasformazione in un elenco di cifre.
  • “çƥ÷£ḟ’ṃ“spdf”cambia il numero di base 250 “çƥ÷£ḟ’in base 4 e lo indicizza nella “spdf”resa della stringa 'sspspdspdspfdspfdsp'. Questo è stato contribuito dall'utente202729.

L'elenco viene quindi portato al collegamento del pugno da Ç. Il primo collegamento effettua le seguenti operazioni:

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

Ora torna al secondo link. Con ripetiamo ciascuno degli elementi in ogni sottoelenco di [[1,2,2,3...7],['sspspd...p']]dai numeri nel nostro nuovo elenco [2,2,6...]. Questo cede [[1,1,2,2,2,2...],['sssspp...']]. Zcomprime le due liste secondarie che producono [[1,'s'],[1,'s'],[2,'s']...].

Ora al collegamento principale. ¢chiama il secondo collegamento che fornisce l'elenco finale delle tuple sopra descritto. Supponiamo che l'ingresso al programma sia 5 come esempio.

¢ḣŒ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

Un modo per comprimere la sspspdspd...stringa?
MD XF,

@MDXF Ho provato ma alla fine è stato più lungo. Ho anche provato a costruirlo in vari modi e le singole parti erano più brevi ma nel complesso era più lungo
dylnan,

@dylnan “çƥ÷£ḟ’ṃ“spdf”¤per -6 byte. Usato questo per la base 250 intero e per la decompressione di base.
user202729

@utente202729 bello, grazie!
dylnan,

7

Tampio imperativo , 930 byte

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 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 Yo, jonkailoja 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äinenilo ja ujo ilo on ison yön ensimmäinenilo, jos iso luku on suurempi kuin ujo ilo, niin iso ilo näyttttä ujon ilon, iso nyy Tong" " , oman Tong iloiksi asetetaan oman Tong ilot toisesta partire , Ison yön iloiksi asetetaan ison yön ilot toisesta partire ja iso luku vähennettynä ujolla ilolla juo ison Tong ja , jos iso luku su 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 jaOman Muuttujan Arvo Juo Ison Sivun.

Versione online

È un'implementazione molto semplice. Nella versione golfed ho semplicemente sostituito le parole con brevi parole come ilo, , iso, oma, etc.

Ungolfed:

Listalla su 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 su lhyhyen orbitaalilistan ensimmäinenalkio ja nykyinen maksimi su lhyhyen 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 partire ,
    • lyhyen maksimilistan alkioiksi asetetaan lyhyen maksimilistan alkiot toisesta partire
    • 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.

Versione online

Traduzione:

Un elenco contiene elementi.

Lascia che la breve lista orbitale sia una nuova lista, i suoi elementi sono l'orbitale "1s", l'orbitale "2s", l'orbitale "2p", l'orbitale "3s", l'orbitale "3p", l'orbitale "3d", l'orbitale "4s", l'orbitale "4p", l'orbitale "4d", l'orbitale "5s", l'orbitale "5p", l'orbitale "4f", l' orbitale orbitale "5d", l'orbitale "6s", l'orbitale "6p", l'orbitale "5f", l'orbitale "6d", l'orbitale "7s" e l'orbitale "7p".

Lascia che il breve elenco massimo sia un nuovo elenco, i suoi elementi sono 2, 2, 6, 2, 6, 10, 2, 6, 10, 2, 6, 14, 10, 2, 6, 14, 10, 2 e 6 .

Quando un piccolo numero di elettroni viene diviso in orbitali nella pagina corrente,

  • la pagina corrente mostra l'orbitale corrente, in cui l'orbitale corrente è il primo elemento nell'elenco degli orbitali brevi e il massimo corrente è il primo elemento dell'elenco massimo breve,
  • se il piccolo numero di elettroni è maggiore del massimo corrente,
    • la pagina corrente mostra il massimo corrente,
    • la pagina corrente mostra lo spazio " ",
    • gli elementi dell'elenco orbitale breve sono impostati per essere gli elementi dell'elenco orbitale breve a partire dal secondo,
    • gli elementi dell'elenco massimo breve sono impostati per essere gli elementi dell'elenco massimo breve a partire dal secondo
    • e il piccolo numero di elettroni sottratto da uno è diviso per gli orbitali nella pagina corrente,
  • e , se il piccolo numero di elettroni è inferiore o uguale al massimo corrente,
    • la pagina corrente mostra il piccolo numero o gli elettroni.

Lascia che la bella variabile sia una nuova variabile.

Quando si apre la pagina corrente ,

  • un numero viene letto nella bella variabile
  • e il valore della bella variabile è diviso per gli orbitali nella pagina corrente.

La traduzione è approssimativa, ho dovuto cambiare l'ordine delle parole per rendere l'inglese più naturale.


1
wtf che va bene ...
FantaC

Sicuramente esiste un linguaggio più tacito che ha tutte le caratteristiche di questo.
Nessuno il

Potresti essere così gentile da aggiungere una traduzione in inglese in modo che possiamo capire questa lingua?
Zacharý,

@ Zacharý l'ho aggiunto.
Fergusq,



4

JavaScript (ES6), 102 byte

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

Casi test

Formattato e commentato

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

2

Rapido , 177 175 156 byte

Liberamente basato sulla risposta Javascript di @ 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}}

Provalo online!

Senza gli spazi nei gruppi di elettroni, 190 187 169 byte:

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

Provalo online!


1

C (gcc), 260 187 167 156 152 147 143 138 byte

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

Provalo online! Golfato dall'implementazione di riferimento.

StackExchange rimuove gli stampabili, quindi il valore di mviene sostituito con "...".

Ecco un hexdump reversibile del programma, poiché utilizza una stringa non stampabile, che sostituisce l'array di interi {2,2,6,2,6,10,2,6,10,2,6,14,10,2,6,14,10,2,6}con i valori di byte letterali degli interi.

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

In alternativa, puoi semplicemente copiare il codice dal link TIO.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.