Diagramas de configuración electrónica


13

Desafío

Dado un nombre de elemento, genera su configuración electrónica.

Entrada

Su entrada será el nombre completo de cada elemento (el rango es de Hidrógeno, 1, a Calcio, 20) con algunas excepciones: debe poder tener en cuenta las siguientes entradas:

Natrium - This is sodium
Kalium - This is potassium

Tenga en cuenta que las entradas "sodio" y "potasio" aún deben ser válidas.

La primera letra siempre estará en mayúscula.

Salida

Puede consultar esta página web para obtener orientación sobre cómo generar un diagrama de configuración electrónica.

La siguiente lista muestra el número máximo de electrones en cada capa:

  • 1ra caparazón - 2 electrones
  • 2a capa - 8 electrones
  • Tercera caparazón - 8 electrones
  • 4.a capa : 14 electrones (aunque el número máximo de electrones requerido en esta capa es 2)

Un ejemplo de salida de la configuración electrónica es el siguiente:

En el centro del diagrama debe estar el símbolo de una o dos letras del elemento.

Se pueden usar puntos o cruces y no importa dónde se coloquen.

La salida no tiene que ser exactamente así, pero tiene que ser un gráfico ASCII. Lo único que no puede ser es la forma 2.8.8.1o cualquier otra forma como esta.

Los círculos no son necesarios

Las funciones integradas que acceden a la tabla periódica de elementos o producen diagramas o configuraciones electrónicas no están permitidas.

Victorioso

El programa más corto en bytes gana.


1
¿Necesitamos mostrar los electrones en pares?
lirtosiast

55
Recomiendo que se requiera una salida gráfica o gráfica ASCII, de lo contrario, las presentaciones no son realmente comparables.
Alex A.

Es la primera letra siempre en mayúscula (espero que sí ...)
Tom Carpenter

También en el enlace los dibujan de manera diferente: tienes ambos electrones en la primera capa en la parte superior, tienen uno en la parte superior, uno en la parte inferior.
Tom Carpenter

1
Para obtener información más precisa sobre lo que sucede después de los 20, vea aquí: en.wikipedia.org/wiki/Electron_shell
Level River St

Respuestas:


3

MATLAB, 360 363 290 304 295 bytes

Vea al final de la publicación cómo probar el código antiguo con Octave.

Este código toma el nombre del elemento (incluido Kalium, etc.) y muestra la salida en formato ASCII ahora que las reglas han cambiado.

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

Las reglas cambiaron desde que escribí el código para requerir una salida ASCII. He actualizado mi código para hacer esto a expensas de 14 bytes. He ahorrado 9 bytes al deshacerme de la remodelación () y simplemente haciendo que la amatriz tenga la forma correcta para empezar.

Aquí hay una explicación de cómo funciona:

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

Esta es la salida para Hidrógeno (ignore los puntos, son para evitar que las líneas se eliminen cuando se muestran aquí):

          .
          .
          .
          .
   xH     .
          .
          .
          .
          .
          .

Y aquí está la salida de calcio.

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

Y la salida de Natrium, que ahora funciona correctamente (¡antes de Natrium daría lugar a Nitrógeno!).

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

La nueva versión del código no funciona con Octave, ya que utiliza spiral() que solo está presente en MATLAB.

Sin embargo, puede probar el código anterior con el intérprete en línea de 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') 

Ejecute eso, luego ingrese una cadena como: 'Hidrógeno' (incluidas las comillas). Una vez hecho esto, tendrá que hacer clic en el botón para expandir el diagrama (se ve como un pequeño símbolo gráfico en la esquina superior derecha del intérprete) para que muestre todo. Desafortunadamente, en Octave agrega líneas que unen los puntos, esto no sucede en MATLAB. Pero al menos le permite probar la lógica detrás de esto. Como digo, esto sigue siendo una salida gráfica, pero te haces una idea de cómo se buscan los elementos.


Ahora imprime en ASCII.
Tom Carpenter

2

Python 3, 529 bytes

gracias Thomas y Beta por señalar algunas cosas que deberían haber sido obvias para mí, ahorrándome algunos bytes

mejora masiva: uso de corte de cadena en lugar de búsqueda 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])

No es el más bonito de los programas o productos, pero bueno, necesitábamos algo para iniciar este desafío. Pruébalo en línea .


En el diccionario, ¿no podría poner los valores en una sola cadena como "H 1"y dividirlos en el espacio más tarde?
Beta Decay

1
Esa es una larga taza 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)

3
Bienvenido al sitio. ¿En qué idioma es esto? Recomendaría agregar un corazón como otras presentaciones con toda la información relevante. Además, dado que se trata de código de golf , debe intentar minimizar la duración de su programa. No puedo estar seguro porque no sé qué idioma estás usando aquí, pero parece que tienes una gran cantidad de espacio en blanco en exceso. La mayoría de los idiomas tienen una página de consejos que enumera un montón de consejos útiles de golf que puede utilizar. Recomendaría revisar la página del idioma que usa aquí.
Post Rock Garf Hunter

Estoy bastante seguro de que esto es GML (el lenguaje propietario de Game Maker): en.wikipedia.org/wiki/GameMaker_Studio#GameMaker_Language y docs.yoyogames.com/source/dadiospice/002_reference/…
Jerry Jeremiah

@WW aparte de las dos líneas en blanco, no veo ningún espacio en blanco excesivo obvio. Las líneas no parecen terminar con punto y coma o algún otro delimitador, por lo que no me sorprendería que no pueda haber más de una cosa en una línea. Pero los nombres de las variables podrían ser más cortos ...
Jerry Jeremiah

No estoy seguro de cómo funciona la parte "sprite num": de la documentación parece que debería ser un número entero y no se permitirían espacios en un nombre de variable: docs.yoyogames.com/source/dadiospice/002_reference/drawing/ ...
Jerry Jeremiah
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.