MATLAB, 360 363 290 304 295 bytes
Veja na parte inferior da postagem como testar o código antigo com o Octave.
Esse código pega o nome do elemento (incluindo Kalium, etc.) e exibe a saída no formato ascii agora que as regras foram alteradas.
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')
As regras foram alteradas desde que escrevi o código para exigir uma saída ASCII. Eu atualizei meu código para fazer isso à custa de 14 bytes. Eu salvei 9 bytes, livrando-me da reformulação () e apenas tornando a a
matriz a forma correta para começar.
Aqui está uma explicação de como 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 é a saída do hidrogênio (ignore os pontos, eles devem evitar que as linhas sejam removidas ao serem exibidas aqui):
.
.
.
.
xH .
.
.
.
.
.
E aqui está a saída para o cálcio.
.
xx .
xx .
.
xxxCa xxx.
xxx xxx.
.
xx .
xx .
.
E a saída do Natrium, que agora funciona corretamente (antes do Natrium resultaria em nitrogênio!).
.
x .
xx .
.
xxNa x .
xx x .
.
xx .
.
.
A nova versão do código não funciona com o Octave, pois usa o spiral()
que está presente apenas no MATLAB.
No entanto, você pode testar o código antigo usando o interpretador 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')
Execute isso e insira uma sequência como: 'Hidrogênio' (incluindo as aspas). Uma vez feito, você terá que clicar no botão de expansão da plotagem (parece um pequeno símbolo gráfico no canto superior direito do intérprete) para que ele mostre tudo. Infelizmente, no Octave, adicionamos linhas unindo os pontos, isso não acontece no MATLAB. Mas pelo menos permite testar a lógica por trás disso. Como eu disse, ainda é uma saída gráfica, mas você tem a idéia de como os elementos são pesquisados.