MATLAB, 360 363 290 304 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 ไบต์ ฉันได้บันทึก 9 ไบต์โดยกำจัด reshape () และเพียงแค่ทำให้a
เมทริกซ์มีรูปร่างที่เหมาะสมเริ่มต้น
นี่คือคำอธิบายวิธีการทำงาน:
%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 .
.
.
รหัสรุ่นใหม่ใช้ไม่ได้กับ Octave เนื่องจากมีการใช้งาน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' (รวมถึงเครื่องหมายคำพูด) เมื่อทำเสร็จแล้วคุณจะต้องคลิกปุ่มขยายจุด (ดูเหมือนสัญลักษณ์กราฟเล็ก ๆ ที่มุมบนขวาของล่าม) เพื่อให้มันแสดงสิ่งที่สมบูรณ์ ใน Octave โชคไม่ดีที่เพิ่มบรรทัดที่รวมจุดเหล่านี้ไม่ได้เกิดขึ้นใน MATLAB แต่อย่างน้อยก็ช่วยให้คุณทดสอบตรรกะได้ อย่างที่ฉันบอกว่านี่ยังคงเป็นกราฟิกเอาท์พุท แต่คุณได้รับความคิดเกี่ยวกับองค์ประกอบที่ค้นหา