电子配置图


13

挑战

给定一个元素名称,输出其电子构型。

输入值

输入将是每个元素的全名(范围从氢1到钙20),但有些例外-您应该能够考虑以下输入:

Natrium - This is sodium
Kalium - This is potassium

请注意,输入“钠”和“钾”必须仍然有效。

首字母将始终大写。

输出量

您可以参考该网页以获取有关如何生成电子组态图的指导。

下表显示了每个壳中的最大电子数:

  • 第一壳 -2个电子
  • 第二壳 -8个电子
  • 第三弹 -8个电子
  • 第四层壳 -14个电子(尽管此壳中需要的最大电子数为2)

电子配置的示例输出如下:

在图的中心必须是元素的一到两个字母符号。

点或十字都可以使用,它们的放置位置无关紧要。

输出不必完全像这样,但必须是ASCII图形。它不能以一形式2.8.8.1或其他任何形式。

圈不是必须的

因此,禁止访问元素周期表或生成图表或电子配置的内置函数。

获奖

以字节为单位的最短程序获胜。


1
我们需要成对显示电子吗?
lirtosiast,2015年

5
我建议要求使用ASCII艺术作品或图形输出中的一种,否则提交实际上就无法比较。
Alex A.

是第一个字母总是大写吗(我希望是...)
汤姆·卡彭特

同样在链接中,它们以不同的方式绘制它们-您在第一个外壳的顶部都有两个电子,在顶部有一个电子,在底部有一个电子。
汤姆·卡彭特

1
有关20点后发生的情况的更准确信息,请参见此处:en.wikipedia.org/wiki/Electron_shell
Level River St

Answers:


3

MATLAB,360个363 290 304 295字节

请参阅文章底部的内容,了解如何使用Octave测试旧代码。

由于规则已更改,因此该代码采用元素的名称(包括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    .
          .
          .

新版本的代码不适用于Octave,因为它使用了spiral()仅在MATLAB中提供的Octave 。

但是,您可以使用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打印。
汤姆·卡彭特

2

Python 3,529字节

感谢Thomas和Beta指出对我来说应该是显而易见的一些事情,为我节省了一些字节

大规模改进:使用字符串切片而不是字典查找

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"然后再将其在空格处分割吗?
Beta Decay 2015年

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's


@WW除了两个空白行之外,我看不到任何明显的多余空格。这些行似乎没有以分号或其他定界符结尾,因此我不会感到惊讶,一行上不能有多个事物。但是,变量名可以更短....
杰里耶

我不确定“ sprite num”部分的工作方式-从文档中看,
杰里·耶利米
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.