MATLAB, 360 363290304 295 바이트
옥타브로 이전 코드를 테스트하는 방법은 게시물 하단을 참조하십시오.
이 코드는 요소의 이름 (Kalium 등 포함)을 취하고 규칙이 변경되었으므로 출력을 ASCII 형식으로 표시합니다.
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')
ASCII 출력이 필요한 코드를 작성한 이후 규칙이 변경되었습니다. 14 바이트를 희생 하여이 작업을 수행하도록 코드를 업데이트했습니다. reshape ()을 제거하고 a
행렬을 올바른 모양으로 만들어 9 바이트를 절약 했습니다.
작동 방식에 대한 설명은 다음과 같습니다.
%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')
이것은 수소의 출력입니다 (점을 무시하십시오. 여기에 표시 될 때 선이 제거되는 것을 피해야합니다).
.
.
.
.
xH .
.
.
.
.
.
그리고 여기 칼슘에 대한 결과가 있습니다.
.
xx .
xx .
.
xxxCa xxx.
xxx xxx.
.
xx .
xx .
.
그리고 Natrium에 대한 결과는 이제 제대로 작동합니다 (Natrium 이전에는 질소가 발생합니다!).
.
x .
xx .
.
xxNa x .
xx x .
.
xx .
.
.
새로운 버전의 코드는 spiral()
MATLAB에만있는 옥타브에서 작동하지 않습니다 .
그러나 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')
이를 실행 한 다음 'Hydrogen'(따옴표 포함)과 같은 문자열을 입력하십시오. 완료되면 플롯 확장 버튼 (인터프리터의 오른쪽 상단 모서리에있는 작은 그래프 기호)을 클릭하여 전체 내용을 표시해야합니다. 옥타브에서는 불행히도 포인트를 결합하는 선을 추가하지만 MATLAB에서는 발생하지 않습니다. 그러나 적어도 그것은 당신이 그 배후의 논리를 테스트 할 수있게합니다. 내가 말했듯이, 이것은 여전히 그래픽 출력이지만 요소가 어떻게 조회되는지에 대한 아이디어를 얻습니다.