MATLAB, 360 363 290 304 295 bytes
See at the bottom of the post for how to test the old code with Octave.
This code takes the name of the element (including Kalium, etc.) and displyas the output in ascii format now that the rules have changed.
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')
The rules changed since I wrote the code to require an ASCII output. I have updated my code to do this at the expense of 14 bytes. I have saved 9 bytes by getting rid of the reshape() and just making the a
matrix the right shape to begin with.
Here is an explanation of how it works:
%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')
This is the output for Hydrogen (ignore the dots, they are to avoid the lines being removed when showing here):
.
.
.
.
xH .
.
.
.
.
.
And here is the output for Calcium.
.
xx .
xx .
.
xxxCa xxx.
xxx xxx.
.
xx .
xx .
.
And the output for Natrium, which now works properly (before Natrium it would result in Nitrogen!).
.
x .
xx .
.
xxNa x .
xx x .
.
xx .
.
.
The new version of the code doesn't work with Octave as it uses spiral()
which is only present in MATLAB.
You can however test the old code using the Octave online interpreter:
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')
Run that, then enter a string like: 'Hydrogen' (including the quote marks). Once it is done, you will have to click the expand plot button (looks like a little graph symbol in the top right corner of the interpreter) to get it to show the full thing. In Octave it unfortunately add lines joining the points, this does not happen in MATLAB. But at least it allows you to test the logic behind it. As I say, this is still a graphical output, but you get the idea of how the elements are looked up.
1Do we need to show the electrons in pairs? – lirtosiast – 2015-10-28T21:34:59.917
5I recommend requiring one of ASCII art or graphical output, otherwise submissions aren't really comparable. – Alex A. – 2015-10-28T22:18:11.447
Is the first letter always capitalised (I hope so...) – Tom Carpenter – 2015-10-29T01:16:34.483
Also in the link they draw them differently - you have both electrons on the first shell at the top, they have one at the top, one at the bottom. – Tom Carpenter – 2015-10-29T01:38:58.490
I assume we can use any symbol to represent an electron (for example a large dot or even a square.) Do we need to include the element symbol in the centre? – Level River St – 2015-10-29T04:20:42.607
Oh and having just looked at the existing answer, do we have to draw the circles? – Level River St – 2015-10-29T04:21:47.080
Also, existing answers seem to have ignored the bit about charge. I suggest you remove it (you didn't specify a range for the charge anyway). Note that Ca-- is theoretically possible, though unlikely. Would the two additional electrons go into the expansion of the 3rd shell to from 8 to 18 (which is where they really belong) or elsewhere? – Level River St – 2015-10-29T04:31:13.470
1
For more accurate info on what happens after 20, see here: https://en.wikipedia.org/wiki/Electron_shell
– Level River St – 2015-10-29T04:34:35.740@TomCarpenter As long as you show
x
many electrons on each shell, it doesn't matter where you place the dots/crosses – Beta Decay – 2015-10-29T06:54:35.760