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.