Diagrammes de configuration des électrons

13

Défi

Étant donné un nom d'élément, sortez sa configuration électronique.

Contribution

Votre entrée sera le nom complet de chaque élément (la plage allant de l'hydrogène, 1, au calcium, 20) à quelques exceptions près - vous devriez pouvoir prendre en compte les entrées suivantes:

Natrium - This is sodium
Kalium - This is potassium

Notez que les entrées "sodium" et "potassium" doivent toujours être valides.

La première lettre sera toujours en majuscule.

Production

Vous pouvez vous référer à cette page Web pour savoir comment générer un diagramme de configuration d'électrons.

La liste suivante montre le nombre maximum d'électrons dans chaque coque:

  • 1ère coquille - 2 électrons
  • 2e coque - 8 électrons
  • 3e coquille - 8 électrons
  • 4e coquille - 14 électrons (bien que le nombre maximal d'électrons requis dans cette coquille soit de 2)

Un exemple de sortie de la configuration électronique est le suivant:

Au centre du diagramme doit se trouver le symbole à une ou deux lettres de l'élément.

Des points ou des croix peuvent être utilisés et leur emplacement n'a pas d'importance.

La sortie ne doit pas être exactement comme celle-ci, mais elle doit être un graphique ASCII. La seule chose qu'il ne peut pas être est sous la forme 2.8.8.1ou toute autre forme comme celle-ci.

Les cercles ne sont pas nécessaires

Les fonctions intégrées qui accèdent au tableau périodique des éléments ou produisent des diagrammes ou des configurations d'électrons sont interdites.

Gagnant

Le programme le plus court en octets gagne.

Beta Decay
la source
1
Avons-nous besoin de montrer les électrons par paires?
lirtosiast
5
Je recommande d'exiger l'un des graphiques ASCII ou une sortie graphique, sinon les soumissions ne sont pas vraiment comparables.
Alex A.
La première lettre est-elle toujours en majuscule (je l'espère ...)
Tom Carpenter
Toujours dans le lien, ils les dessinent différemment - vous avez les deux électrons sur la première coque en haut, ils en ont un en haut, un en bas.
Tom Carpenter
1
Pour des informations plus précises sur ce qui se passe après le 20, voir ici: en.wikipedia.org/wiki/Electron_shell
Level River St

Réponses:

3

MATLAB, 360 363 290 304 295 octets

Voir en bas de l'article pour savoir comment tester l'ancien code avec Octave.

Ce code prend le nom de l'élément (y compris Kalium, etc.) et affiche la sortie au format ascii maintenant que les règles ont changé.

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

Les règles ont changé depuis que j'ai écrit le code pour exiger une sortie ASCII. J'ai mis à jour mon code pour le faire au détriment de 14 octets. J'ai sauvé 9 octets en me débarrassant de la reshape () et en faisant juste lea matrice la bonne forme pour commencer.

Voici une explication de son fonctionnement:

%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')

C'est la sortie pour l'hydrogène (ignorez les points, ils sont pour éviter que les lignes soient supprimées lors de l'affichage ici):

          .
          .
          .
          .
   xH     .
          .
          .
          .
          .
          .

Et voici la sortie pour Calcium.

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

Et la sortie pour Natrium, qui fonctionne désormais correctement (avant Natrium, cela donnerait de l'azote!).

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

La nouvelle version du code ne fonctionne pas avec Octave car il utilise spiral() qui n'est présent que dans MATLAB.

Vous pouvez cependant tester l'ancien code à l'aide de l' interpréteur en ligne 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') 

Exécutez cela, puis entrez une chaîne comme: «Hydrogène» (y compris les guillemets). Une fois cela fait, vous devrez cliquer sur le bouton de développement de l'intrigue (qui ressemble à un petit symbole graphique dans le coin supérieur droit de l'interpréteur) pour qu'il affiche tout. Dans Octave, il ajoute malheureusement des lignes joignant les points, cela ne se produit pas dans MATLAB. Mais au moins, cela vous permet de tester la logique derrière cela. Comme je l'ai dit, c'est toujours une sortie graphique, mais vous avez une idée de la façon dont les éléments sont recherchés.

Tom Carpenter
la source
Imprime maintenant en ASCII.
Tom Carpenter
2

Python 3, 529 octets

remercie Thomas et Beta d'avoir souligné certaines choses qui auraient dû être évidentes pour moi, me faisant économiser quelques octets

amélioration massive: utilisation du découpage de chaîne au lieu de la recherche de 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])

Pas le plus joli des programmes ou des sorties, mais bon, nous avions besoin de quelque chose pour lancer ce défi. Essayez-le en ligne .

Mego
la source
Dans le dictionnaire, ne pourriez-vous pas mettre les valeurs dans une seule chaîne comme "H 1"et les diviser plus tard dans l'espace?
Beta Decay
1
C'est une longue tasse de café;)
Beta Decay
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)
user67059
la source
3
Bienvenue sur le site. Dans quelle langue est-ce? Je recommanderais d'ajouter un cœur comme les autres soumissions avec toutes les informations pertinentes. De plus, comme il s'agit de code-golf, vous devez viser à minimiser la durée de votre programme. Je ne peux pas en être sûr car je ne sais pas quelle langue vous utilisez ici, mais il semble que vous ayez beaucoup d'espace blanc en excès. La plupart des langues ont une page de conseils répertoriant un tas de conseils de golf utiles que vous pouvez utiliser. Je recommanderais de consulter la page de la langue que vous utilisez ici.
Post Rock Garf Hunter
@WW autre que les deux lignes vides, je ne vois aucun espace blanc excessif évident. Les lignes ne semblent pas se terminer par des points-virgules ou un autre délimiteur, je ne serais donc pas surpris qu'il ne puisse y avoir plus d'une chose sur une ligne. Mais les noms des variables pourraient être plus courts ....
Jerry Jeremiah
Je ne sais pas comment fonctionne la partie "sprite num" - d'après la documentation, il semble que ce devrait être un entier et les espaces dans un nom de variable ne seraient pas autorisés: docs.yoyogames.com/source/dadiospice/002_reference/drawing/ …
Jerry Jeremiah