MATLAB, 360363 290304295 bayt
Octave ile eski kodun nasıl test edileceğini görmek için yazının altına bakın.
Bu kod, elemanın adını (Kalium vb. Dahil) alır ve çıktıyı kurallar değiştiğinden ascii formatında gönderir.
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')
Bir ASCII çıkışı gerektirecek kodu yazdığım için kurallar değişti. 14 bayt pahasına bunu yapmak için kodumu güncelledim. Yeniden şekillendirmeden () kurtularak ve sadece a
matrisi başlamak için doğru şekli yaparak 9 bayt kurtardım .
İşte nasıl çalıştığına dair bir açıklama:
%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')
Bu Hidrojen için çıktıdır (noktaları görmezden gelin, burada gösterildiğinde çizgilerin kaldırılmasını önlemek içindir):
.
.
.
.
xH .
.
.
.
.
.
Ve işte Kalsiyum için çıktı.
.
xx .
xx .
.
xxxCa xxx.
xxx xxx.
.
xx .
xx .
.
Ve şimdi düzgün çalışan Natrium çıkışı (Natrium'dan önce Azot ile sonuçlanır!).
.
x .
xx .
.
xxNa x .
xx x .
.
xx .
.
.
Kodun yeni sürümü spiral()
, yalnızca MATLAB'da bulunan Octave ile çalışmaz .
Ancak Octave çevrimiçi yorumlayıcısını kullanarak eski kodu test edebilirsiniz :
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')
Bunu çalıştırın, sonra 'Hidrojen' gibi bir dize girin (tırnak işaretleri dahil). Tamamlandığında, tüm şeyi göstermesi için çizimi genişlet düğmesine (yorumlayıcının sağ üst köşesinde küçük bir grafik simgesine benziyor) tıklamanız gerekir. Octave'de maalesef noktalara katılan çizgiler ekliyor, bu MATLAB'da gerçekleşmiyor. Ama en azından arkasındaki mantığı test etmenizi sağlar. Dediğim gibi, bu hala grafiksel bir çıktı, ancak öğelerin nasıl arandığı hakkında fikir sahibi oluyorsunuz.