Diagrammi di configurazione elettronica


13

Sfida

Dato un nome di elemento, emette la sua configurazione elettronica.

Ingresso

Il tuo input sarà il nome completo di ciascun elemento (l'intervallo va da Idrogeno, 1, a Calcio, 20) con alcune eccezioni: dovresti essere in grado di tenere conto dei seguenti input:

Natrium - This is sodium
Kalium - This is potassium

Si noti che gli input "sodio" e "potassio" devono essere ancora validi.

La prima lettera sarà sempre in maiuscolo.

Produzione

È possibile fare riferimento a questa pagina Web per indicazioni su come generare un diagramma di configurazione elettronica.

Il seguente elenco mostra il numero massimo di elettroni in ciascuna shell:

  • 1a shell - 2 elettroni
  • 2a shell - 8 elettroni
  • 3a shell - 8 elettroni
  • 4a shell - 14 elettroni (sebbene il numero massimo di elettroni in questa shell richiesto sia 2)

Un esempio di output della configurazione elettronica è il seguente:

Al centro del diagramma deve essere presente il simbolo da una a due lettere dell'elemento.

È possibile utilizzare punti o croci e la loro posizione non ha importanza.

L'output non deve essere esattamente così, ma deve essere un grafico ASCII. L'unica cosa che non può essere è nella forma 2.8.8.1o in qualsiasi altra forma come questa.

I cerchi non sono necessari

Sono vietate le funzioni integrate che accedono alla tavola periodica degli elementi o producono diagrammi o configurazioni di elettroni.

vincente

Vince il programma più breve in byte.


1
Dobbiamo mostrare gli elettroni in coppia?
lirtosiast,

5
Raccomando di richiedere una grafica ASCII o un output grafico, altrimenti gli invii non sono realmente comparabili.
Alex A.

La prima lettera è sempre in maiuscolo (lo spero ...)
Tom Carpenter,

Anche nel collegamento li disegnano in modo diverso: hai entrambi gli elettroni sul primo guscio in alto, ne hanno uno in alto, uno in basso.
Tom Carpenter,

1
Per informazioni più precise su ciò che accade dopo le 20, vedi qui: en.wikipedia.org/wiki/Electron_shell
Level River St

Risposte:


3

MATLAB, 360 363 290 304 295 byte

Vedi in fondo al post per come testare il vecchio codice con Octave.

Questo codice prende il nome dell'elemento (incluso Kalium, ecc.) E visualizza l'output in formato ASCII ora che le regole sono cambiate.

f=input('');e=1;a=['CPACxxSAMSNxxxxxBLHxCKACSPSAMNNFONCBBLHH';'aorhxxilaoexxxxxeiexa rl  ilgae     eie '];for s=a;n=s(s~=32);if strncmpi(n,f,nnz(n));break;end;e=mod(e,20)+1;end;s=spiral(10);p=[8,18,33,28,23,39,60,53,46,95];p=[p;p+1];o=s*0;o(ismember(s,p(1:21-e)))='x';o(45:46)=a(:,e+20);char(o')

Le regole sono cambiate da quando ho scritto il codice per richiedere un output ASCII. Ho aggiornato il mio codice per farlo a scapito di 14 byte. Ho salvato 9 byte eliminando reshape () e rendendo la amatrice la forma giusta per cominciare.

Ecco una spiegazione di come funziona:

%Get the name - actually we only need at most the first two characters, but the whole thing will do
f=input('');
e=1;
%This bit makes a map which allows us to find the element (including with
%the names like Kalium. All of the elements appear twice, with the actual
%symbols being the second set. The first set gets all those whose names are
%either more than one character, or don't begin with the first two
%characters of the short for (e.g. Sodium). The string is reshaped into a
%2x40 array. 'Natrium' is a pain in the neck as it as it would get caught
%by 'N' for 'Nitrogen'. I have reversed the element order - so that all the
%ones beginning with N come before N. Some maths is done later on to
%correct for the number of electrons - basically 21-e so 1 becomes 20.
a=['CPACxxSAMSNxxxxxBLHxCKACSPSAMNNFONCBBLHH';'aorhxxilaoexxxxxeiexa rl  ilgae     eie '];

%For each group of 2 in the array of elements
for s=a

    %Remove any spaces from the name
    n=s(s~=32);

    %Do a comparison of the first one or two characters of the requested string
    if (strncmpi(n,f,nnz(n))) 

        %break once the element is found
        break; 
    end

    %If not this element add another electron. We wrap around after 20 as there are two copies of each
    e=mod(e,20)+1; 
end
%e is now number of electrons

%Generate an array of points for each electron
s=spiral(10);
p=[8,18,33,28,23,39,60,53,46,95];p=[p;p+1];

%make an output array
o=s*0;

%Plot all the points in is up to and including the number of electrons (see the notes above for why 21-e)
o(ismember(s,p(1:21-e)))='x';

%And add the text in the centre - we extract the element name from the second group appearance in the 'a' array, hence adding 20.
o(45:46)=a(:,e+20);

%Display the result
char(o')

Questo è l'output di Hydrogen (ignora i punti, sono per evitare che le linee vengano rimosse quando vengono mostrate qui):

          .
          .
          .
          .
   xH     .
          .
          .
          .
          .
          .

Ed ecco l'uscita per il calcio.

          .
    xx    .
    xx    .
          .
 xxxCa xxx.
 xxx   xxx.
          .
    xx    .
    xx    .
          .

E l'output per Natrium, che ora funziona correttamente (prima di Natrium si tradurrebbe in azoto!).

          .
     x    .
    xx    .
          .
  xxNa x  .
  xx   x  .
          .
    xx    .
          .
          .

La nuova versione del codice non funziona con Octave in quanto utilizza, spiral()presente solo in MATLAB.

Puoi comunque testare il vecchio codice usando l' interprete online Octave :

f=input('');e=1;a=['CPACxxSAMSNxxxxxBLHxCKACSPSAMNNFONCBBLHH';'aorhxxilaoexxxxxeiexa rl  ilgae     eie '];for s=a;n=s(s~=32);if strncmpi(n,f,nnz(n));break;end;e=mod(e,20)+1;end;u=14:(34-e);r=floor(u/8);t=u*pi/4;polar(t,r,'o');text(0,0,a(:,e+20)','horizontalalignment','c') 

Eseguilo, quindi inserisci una stringa come: 'Idrogeno' (inclusi i segni di virgolette). Una volta fatto, dovrai fare clic sul pulsante Espandi trama (si presenta come un piccolo simbolo grafico nell'angolo in alto a destra dell'interprete) per farlo mostrare tutto. In Octave sfortunatamente aggiunge linee che uniscono i punti, questo non accade in MATLAB. Ma almeno ti consente di testare la logica dietro di esso. Come ho già detto, questo è ancora un output grafico, ma hai l'idea di come vengono cercati gli elementi.


Ora stampa in ASCII.
Tom Carpenter,

2

Python 3, 529 byte

grazie Thomas e Beta per avermi segnalato alcune cose che avrebbero dovuto essere ovvie per me, salvandomi alcuni byte

enorme miglioramento: utilizzo dell'affettatura delle stringhe anziché della ricerca di dict

s="""    {18}
    {10}{14}
    {2}{6}
    {0}{1}
 {17}{9} %s {3}{11}
 {13}{5}    {7}{15}

    {8}{4}
    {16}{12}
    {19}"""
e="H HeLiBe B C N O F NeNaMgAlSiP S ClArK Ca"
r="hydrogen   helium     lithium    beryllium  boron      carbon     nitrogen   oxygen     fluorine   neon       natrium    sodium     magnesium  aluminium  silicon    phosphoroussulfur     chlorine   argon      kalium     potassium  calcium    "
n=r.find(input().lower())//11
n-=(n>10)+(n>18)
print(s.format(*[' *'[i<=n]for i in range(20)])%e[n*2+1:n*2+3])

Non il più grazioso dei programmi o dei risultati, ma ehi, avevamo bisogno di qualcosa per dare il via a questa sfida. Provalo online .


Nel dizionario, non potresti mettere i valori in una singola stringa come "H 1"e dividerli nello spazio in un secondo momento?
Decadimento beta

1
È una lunga tazza di caffè;)
Decadimento beta

0
j=0
do
{
if(elnum=1)
{
draw_circle(100,100,50)
draw_sprite_ext(spr_electron,sprite num,100,100+50,direction,c_white,c_alpha)

}
else
{
if(elnum=2)
{
draw_circle(100,100,50)
draw_sprite_ext(spr_electron,sprite num,100,100+50,direction,c_white,c_alpha)
draw_sprite_ext(spr_electron,sprite num,100,100+50,direction,c_white,c_alpha)
}
if(j>1&&j<=8)
{
if(j>5)
angdeviation=5
else
angdeviation=-5
draw_circle(100,100,100)
draw_sprite_ext(spr_electron,sprite num,100+length_dirx(j*100+angdeviation),100+length_diry(j*100+angdeviation),direction,c_white,c_alpha)
}
}

}until(j<=enum)

3
Benvenuti nel sito. In che lingua è? Consiglierei di aggiungere un cuore come altri contributi con tutte le informazioni pertinenti. Inoltre, poiché si tratta di code-golf , dovresti mirare a ridurre al minimo la durata del tuo programma. Non posso esserne sicuro perché non so quale lingua stai usando qui, ma sembra che tu abbia una buona quantità di spazio bianco in eccesso. La maggior parte delle lingue ha una pagina di suggerimenti che elenca una serie di utili suggerimenti sul golf che è possibile utilizzare. Consiglierei di controllare la pagina per la lingua che usi qui.
Post Rock Garf Hunter,

Sono abbastanza sicuro che si tratti di GML (il propietario Game Maker Language): en.wikipedia.org/wiki/GameMaker_Studio#GameMaker_Language e docs.yoyogames.com/source/dadiospice/002_reference/…
Jerry Jeremiah,

@WW oltre alle due righe vuote non vedo alcuno spazio bianco evidente. Le righe non sembrano terminare con punto e virgola o qualche altro delimitatore, quindi non sarei sorpreso che non ci possa essere più di una cosa su una riga. Ma i nomi delle variabili potrebbero essere più brevi ....
Jerry Jeremiah,

Non sono sicuro di come funzioni la parte "sprite num" - dalla documentazione sembra che dovrebbe essere un numero intero e gli spazi in un nome variabile non sarebbero consentiti: docs.yoyogames.com/source/dadiospice/002_reference/drawing/ ...
Jerry Jeremiah,
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.