ไดอะแกรมการกำหนดค่าอิเล็กตรอน


13

ท้าทาย

ให้ชื่อองค์ประกอบส่งออกการกำหนดค่าอิเล็กตรอน

อินพุต

ข้อมูลที่คุณป้อนจะเป็นชื่อเต็มของแต่ละองค์ประกอบ (ช่วงคือจากไฮโดรเจน 1 ถึงแคลเซียม 20) โดยมีข้อยกเว้นบางประการ - คุณควรสามารถบัญชีสำหรับข้อมูลต่อไปนี้:

Natrium - This is sodium
Kalium - This is potassium

โปรดทราบว่าอินพุต "โซเดียม" และ "โพแทสเซียม" จะต้องยังคงใช้ได้

อักษรตัวแรกจะเป็นตัวพิมพ์ใหญ่เสมอ

เอาท์พุต

คุณสามารถอ้างอิงถึงหน้าเว็บนี้สำหรับคำแนะนำเกี่ยวกับวิธีสร้างไดอะแกรมการกำหนดค่าอิเล็กตรอน

รายการต่อไปนี้แสดงจำนวนอิเล็กตรอนสูงสุดในแต่ละเชลล์:

  • เปลือกที่ 1 - 2 อิเล็กตรอน
  • 2nd shell - 8 อิเล็กตรอน
  • เปลือกที่ 3 - 8 อิเล็กตรอน
  • 4th shell - 14 อิเล็กตรอน (แม้ว่าจำนวนสูงสุดของอิเล็กตรอนใน shell นี้คือ 2)

ตัวอย่างเอาต์พุตของการกำหนดค่าอิเล็กตรอนมีดังต่อไปนี้:

ในกึ่งกลางของแผนภาพจะต้องเป็นสัญลักษณ์ตัวอักษรหนึ่งถึงสององค์ประกอบ

อาจใช้จุดหรือกากบาทและตำแหน่งที่วางไม่สำคัญ

เอาต์พุตไม่จำเป็นต้องเป็นแบบนี้ แต่จะต้องเป็นกราฟิก ASCII สิ่งหนึ่งที่มันไม่สามารถอยู่ในรูปแบบ2.8.8.1หรือรูปแบบอื่น ๆ เช่นนี้

วงกลมไม่จำเป็น

ฟังก์ชั่นในตัวที่เข้าถึงตารางธาตุหรือสร้างไดอะแกรมหรือการกำหนดค่าอิเล็กตรอนไม่อนุญาต

การชนะ

โปรแกรมที่สั้นที่สุดในหน่วยไบต์ชนะ


1
เราจำเป็นต้องแสดงอิเล็กตรอนเป็นคู่หรือไม่?
lirtosiast

5
ฉันขอแนะนำให้ใช้หนึ่งในงานศิลปะ ASCII หรือเอาท์พุทกราฟิกมิฉะนั้นการส่งไม่ได้เปรียบจริง ๆ
Alex A.

ตัวอักษรตัวแรกเป็นตัวพิมพ์ใหญ่เสมอ (ฉันหวังว่าจะเป็น ... )
Tom Carpenter

นอกจากนี้ในการเชื่อมโยงพวกเขาดึงพวกมันแตกต่างกัน - คุณมีอิเล็กตรอนทั้งคู่อยู่ที่เปลือกแรกที่ด้านบน
Tom Carpenter

1
สำหรับข้อมูลที่แม่นยำยิ่งขึ้นเกี่ยวกับสิ่งที่เกิดขึ้นหลัง 20 ปีดูที่นี่: en.wikipedia.org/wiki/Electron_shell
Level River St

คำตอบ:


3

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 แต่อย่างน้อยก็ช่วยให้คุณทดสอบตรรกะได้ อย่างที่ฉันบอกว่านี่ยังคงเป็นกราฟิกเอาท์พุท แต่คุณได้รับความคิดเกี่ยวกับองค์ประกอบที่ค้นหา


ตอนนี้พิมพ์ใน ASCII
Tom Carpenter

2

Python 3, 529 ไบต์

ขอบคุณโทมัสและเบต้าสำหรับการชี้ให้เห็นบางสิ่งบางอย่างที่ควรจะชัดเจนกับฉัน

การปรับปรุงครั้งใหญ่: การใช้การแบ่งสตริงแทนการค้นหาแบบ Dict

s="""    {18}
    {10}{14}
    {2}{6}
    {0}{1}
 {17}{9} %s {3}{11}
 {13}{5}    {7}{15}

    {8}{4}
    {16}{12}
    {19}"""
e="H HeLiBe B C N O F NeNaMgAlSiP S ClArK Ca"
r="hydrogen   helium     lithium    beryllium  boron      carbon     nitrogen   oxygen     fluorine   neon       natrium    sodium     magnesium  aluminium  silicon    phosphoroussulfur     chlorine   argon      kalium     potassium  calcium    "
n=r.find(input().lower())//11
n-=(n>10)+(n>18)
print(s.format(*[' *'[i<=n]for i in range(20)])%e[n*2+1:n*2+3])

ไม่ใช่โปรแกรมหรือผลลัพธ์ที่สวยที่สุด แต่เฮ้เราต้องการบางสิ่งบางอย่างเพื่อขจัดความท้าทายนี้ ลองมันออนไลน์


ในพจนานุกรมคุณไม่สามารถใส่ค่าในสตริงเดียว"H 1"และแยกพวกมันออกจากพื้นที่ในภายหลังได้หรือไม่
สลายตัวเบต้า

1
นั่นคือกาแฟหนึ่งถ้วยยาว ๆ )
Beta Decay

0
j=0
do
{
if(elnum=1)
{
draw_circle(100,100,50)
draw_sprite_ext(spr_electron,sprite num,100,100+50,direction,c_white,c_alpha)

}
else
{
if(elnum=2)
{
draw_circle(100,100,50)
draw_sprite_ext(spr_electron,sprite num,100,100+50,direction,c_white,c_alpha)
draw_sprite_ext(spr_electron,sprite num,100,100+50,direction,c_white,c_alpha)
}
if(j>1&&j<=8)
{
if(j>5)
angdeviation=5
else
angdeviation=-5
draw_circle(100,100,100)
draw_sprite_ext(spr_electron,sprite num,100+length_dirx(j*100+angdeviation),100+length_diry(j*100+angdeviation),direction,c_white,c_alpha)
}
}

}until(j<=enum)

3
ยินดีต้อนรับสู่เว็บไซต์ สิ่งนี้เป็นภาษาอะไร ฉันขอแนะนำให้เพิ่มหัวใจเหมือนกับการส่งอื่น ๆ ที่มีข้อมูลที่เกี่ยวข้องทั้งหมด นอกจากนี้เนื่องจากนี่เป็นโค้ดกอล์ฟคุณควรตั้งเป้าหมายที่จะลดความยาวของโปรแกรม ฉันไม่แน่ใจเพราะฉันไม่รู้ว่าคุณใช้ภาษาอะไร แต่ดูเหมือนว่าคุณมีพื้นที่ว่างเหลือเฟือ ภาษาส่วนใหญ่มีหน้าเคล็ดลับที่แสดงรายการเคล็ดลับการเล่นกอล์ฟที่เป็นประโยชน์ซึ่งคุณสามารถใช้ได้ ฉันขอแนะนำให้ตรวจสอบหน้าสำหรับภาษาที่คุณใช้ที่นี่
Ad Hoc Garf Hunter

ผมค่อนข้างแน่ใจว่านี้เป็น GML (คนชงกรรมสิทธิ์เกม Language): en.wikipedia.org/wiki/GameMaker_Studio#GameMaker_Language และdocs.yoyogames.com/source/dadiospice/002_reference/...
เจอร์รี่เยเรมีย์

@WW นอกเหนือจากสองบรรทัดว่างฉันไม่เห็นช่องว่างส่วนเกินที่ชัดเจนใด ๆ เส้นดูเหมือนจะไม่ลงท้ายด้วยเครื่องหมายอัฒภาคหรือตัวคั่นอื่นดังนั้นฉันจะไม่แปลกใจเลยที่จะมีมากกว่าหนึ่งอย่างในบรรทัด แต่ชื่อตัวแปรอาจสั้นลง ....
Jerry Jeremiah

ฉันไม่แน่ใจว่าส่วน "sprite num" ทำงานอย่างไร - จากเอกสารที่ดูเหมือนว่าควรเป็นจำนวนเต็มและช่องว่างในชื่อตัวแปรจะไม่ได้รับอนุญาต: docs.yoyogames.com/source/dadiospice/002_reference/drawing/ …
Jerry Jeremiah
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.