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 a
matriz 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.