電子配置図


13

チャレンジ

要素名を指定して、その電子配置を出力します。

入力

入力は、いくつかの例外を除き、各要素の完全な名前(水素1からカルシウム20まで)になります。次の入力を考慮できる必要があります。

Natrium - This is sodium
Kalium - This is potassium

入力「ナトリウム」と「カリウム」はまだ有効でなければならないことに注意してください。

最初の文字は常に大文字になります。

出力

電子配置図の生成方法に関するガイダンスについては、このWebページを参照できます。

次のリストは、各シェルの最大電子数を示しています。

  • 第1シェル -2電子
  • 2番目のシェル -8電子
  • 3番目のシェル -8電子
  • 4番目のシェル -14個の電子(ただし、必要なこのシェルの最大電子数は2です)

電子配置の出力例は次のとおりです。

ダイアグラムの中央には、要素の1〜2文字の記号が必要です。

ドットまたはクロスのいずれかを使用でき、それらの配置場所は重要ではありません。

出力はこのように正確である必要はありませんが、ASCIIグラフィックである必要があります。できないことの1つは、2.8.8.1このような形式または他の形式です。

円は必要ありません

元素の周期表にアクセスしたり、ダイアグラムや電子配置を作成したりする組み込み関数はここでは許可されません。

勝ち

バイト単位の最短プログラムが優先されます。


1
電子をペアで表示する必要がありますか?
リトシアスト

5
ASCIIアートまたはグラフィック出力のいずれかを要求することをお勧めします。そうでない場合、提出物は実際には比較できません。
アレックスA.

最初の文字は常に大文字ですか(そうだと思います...)
トムカーペンター

また、リンクでは、それらを異なる方法で描画します。最初のシェルに両方の電子があり、上部に1つ、下部に1つあります。
トムカーペンター

1
20日以降の出来事に関するより正確な情報については、en.wikipedia.org
Level River St

回答:


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    .
          .
          .

新しいバージョンのコードは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バイト

トーマスとベータに感謝します

大幅な改善:辞書検索の代わりに文字列スライスを使用

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
それはコーヒーの長いカップです;)
ベータ崩壊

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
サイトへようこそ。これは何語ですか?すべての関連情報を含む他の投稿のようなハートを追加することをお勧めします。また、これはコードゴルフなので、プログラムの長さを最小限に抑えることを目指してください。ここで使用している言語がわからないのでわかりませんが、余分な空白がたくさんあるようです。ほとんどの言語には、役立つゴルフのヒントをまとめたヒントページがあります。ここで使用する言語のページを確認することをお勧めします。
ポストロックガーフハンター

私はこれはかなり確信していますGML(propietaryゲームメーカー言語):en.wikipedia.org/wiki/GameMaker_Studio#GameMaker_Languagedocs.yoyogames.com/source/dadiospice/002_reference/...
ジェリーエレミヤ

2つの空白行以外の@WW明らかな余分な空白はありません。行はセミコロンまたは他の区切り文字で終わっていないように見えるので、行に複数の行が存在することはあっても驚かないでしょう。しかし、変数名は....短くすることができます
ジェリーエレミヤ

「スプライトnum」部分がどのように機能するのかわかりません-ドキュメントから、整数である必要があるように見え、変数名のスペースは許可されません:docs.yoyogames.com/source/dadiospice/002_reference/drawing/ …
ジェリーエレミヤ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.