MATLAB, 360 363 290 304 295 byte
Xem ở dưới cùng của bài viết để biết cách kiểm tra mã cũ với Octave.
Mã này lấy tên của phần tử (bao gồm Kalium, v.v.) và loại bỏ đầu ra ở định dạng ascii bây giờ khi các quy tắc đã thay đổi.
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')
Các quy tắc đã thay đổi kể từ khi tôi viết mã để yêu cầu đầu ra ASCII. Tôi đã cập nhật mã của mình để làm điều này với chi phí 14 byte. Tôi đã lưu 9 byte bằng cách loại bỏ việc định hình lại () và chỉ cần làm cho a
ma trận có hình dạng phù hợp để bắt đầu.
Dưới đây là một lời giải thích về cách thức hoạt động của nó:
%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')
Đây là đầu ra cho Hydrogen (bỏ qua các dấu chấm, chúng là để tránh các dòng bị xóa khi hiển thị ở đây):
.
.
.
.
xH .
.
.
.
.
.
Và đây là đầu ra cho Canxi.
.
xx .
xx .
.
xxxCa xxx.
xxx xxx.
.
xx .
xx .
.
Và đầu ra cho Natrium, hiện đang hoạt động bình thường (trước Natrium, nó sẽ tạo ra Nitơ!).
.
x .
xx .
.
xxNa x .
xx x .
.
xx .
.
.
Phiên bản mới của mã không hoạt động với Octave vì nó sử dụng spiral()
chỉ có trong MATLAB.
Tuy nhiên, bạn có thể kiểm tra mã cũ bằng trình thông dịch trực tuyến 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')
Chạy nó, sau đó nhập một chuỗi như: 'Hydrogen' (bao gồm cả dấu ngoặc kép). Sau khi hoàn thành, bạn sẽ phải nhấp vào nút mở rộng cốt truyện (trông giống như một biểu tượng biểu đồ nhỏ ở góc trên cùng bên phải của trình thông dịch) để làm cho nó hiển thị toàn bộ. Trong Octave, không may thêm các dòng nối các điểm, điều này không xảy ra trong MATLAB. Nhưng ít nhất nó cho phép bạn kiểm tra logic đằng sau nó. Như tôi nói, đây vẫn là một đầu ra đồ họa, nhưng bạn có ý tưởng về cách các yếu tố được tìm kiếm.