Diagram Konfigurasi Elektron

13

Tantangan

Diberi nama elemen, output konfigurasi elektronnya.

Memasukkan

Input Anda akan menjadi nama lengkap setiap elemen (rentangnya dari Hidrogen, 1, hingga Kalsium, 20) dengan beberapa pengecualian - Anda harus dapat memperhitungkan input berikut:

Natrium - This is sodium
Kalium - This is potassium

Perhatikan bahwa input "sodium" dan "potassium" masih harus valid.

Huruf pertama akan selalu ditulis dengan huruf besar.

Keluaran

Anda dapat merujuk ke halaman web ini untuk panduan tentang cara membuat diagram konfigurasi elektron.

Daftar berikut menunjukkan jumlah maksimum elektron di setiap kulit:

  • Shell 1 - 2 elektron
  • Shell ke-2 - 8 elektron
  • Shell ke-3 - 8 elektron
  • Shell ke-4 - 14 elektron (walaupun jumlah maksimum elektron dalam shell ini adalah 2)

Contoh output dari konfigurasi elektron adalah sebagai berikut:

Di tengah diagram harus simbol satu hingga dua huruf elemen.

Baik titik atau garis silang dapat digunakan dan di mana mereka ditempatkan tidak masalah.

Outputnya tidak harus persis seperti ini tetapi harus berupa grafik ASCII. Satu hal yang tidak mungkin adalah dalam bentuk 2.8.8.1atau bentuk lain seperti ini.

Lingkaran tidak perlu

Fungsi bawaan yang mengakses tabel elemen periodik atau menghasilkan diagram atau konfigurasi elektron dengan ini tidak diizinkan.

Kemenangan

Program terpendek dalam byte menang.

Peluruhan Beta
sumber
1
Apakah kita perlu menunjukkan elektron berpasangan?
lirtosiast
5
Saya sarankan memerlukan salah satu seni ASCII atau output grafis, jika tidak pengiriman tidak benar-benar sebanding.
Alex A.
Apakah huruf pertama selalu ditulis dengan huruf besar (saya harap begitu ...)
Tom Carpenter
Juga di tautan mereka menggambarnya secara berbeda - Anda memiliki kedua elektron di kulit pertama di atas, mereka memiliki satu di bagian atas, satu di bagian bawah.
Tom Carpenter
1
Untuk info lebih akurat tentang apa yang terjadi setelah 20, lihat di sini: en.wikipedia.org/wiki/Electron_shell
Level River St

Jawaban:

3

MATLAB, 360 363 290 304 295 byte

Lihat di bagian bawah pos untuk cara menguji kode lama dengan Oktaf.

Kode ini mengambil nama elemen (termasuk Kalium, dll.) Dan mengeluarkan output dalam format ascii sekarang karena aturan telah berubah.

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

Aturan berubah sejak saya menulis kode untuk meminta keluaran ASCII. Saya telah memperbarui kode saya untuk melakukan ini dengan mengorbankan 14 byte. Saya telah menyimpan 9 byte dengan menghilangkan bentuk ulang () dan hanya membuata matriks bentuk yang tepat untuk memulai.

Berikut ini penjelasan cara kerjanya:

%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')

Ini adalah output untuk Hidrogen (abaikan titik-titiknya, mereka harus menghindari garis yang dihapus saat ditampilkan di sini):

          .
          .
          .
          .
   xH     .
          .
          .
          .
          .
          .

Dan inilah output untuk Kalsium.

          .
    xx    .
    xx    .
          .
 xxxCa xxx.
 xxx   xxx.
          .
    xx    .
    xx    .
          .

Dan output untuk Natrium, yang sekarang berfungsi dengan baik (sebelum Natrium akan menghasilkan Nitrogen!).

          .
     x    .
    xx    .
          .
  xxNa x  .
  xx   x  .
          .
    xx    .
          .
          .

Versi baru kode tidak berfungsi dengan Oktaf saat digunakan spiral() yang hanya ada di MATLAB.

Namun Anda dapat menguji kode lama menggunakan penerjemah online 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') 

Jalankan itu, lalu masukkan string seperti: 'Hidrogen' (termasuk tanda kutip). Setelah selesai, Anda harus mengklik tombol Expand Plot (terlihat seperti simbol grafik kecil di sudut kanan atas penerjemah) untuk membuatnya menampilkan hal yang lengkap. Di Octave sayangnya menambahkan garis yang menghubungkan titik, ini tidak terjadi di MATLAB. Tapi setidaknya itu memungkinkan Anda untuk menguji logika di baliknya. Seperti yang saya katakan, ini masih merupakan keluaran grafis, tetapi Anda mendapatkan gagasan tentang bagaimana elemen-elemen tersebut dilihat.

Tom Carpenter
sumber
Sekarang mencetak dalam ASCII.
Tom Carpenter
2

Python 3, 529 byte

terima kasih Thomas dan Beta untuk menunjukkan beberapa hal yang seharusnya sudah jelas bagi saya, menyelamatkan saya beberapa byte

peningkatan besar-besaran: menggunakan string slicing daripada lookup 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])

Bukan program atau output tercantik, tapi hei, kami membutuhkan sesuatu untuk memulai tantangan ini. Cobalah online .

Mego
sumber
Dalam kamus, tidak bisakah Anda meletakkan nilai-nilai dalam string tunggal seperti "H 1"dan membaginya di ruang nanti?
Beta Decay
1
Secangkir kopi yang panjang;)
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)
pengguna67059
sumber
3
Selamat datang di situs ini. Bahasa apa ini? Saya akan merekomendasikan menambahkan hati seperti kiriman lainnya dengan semua informasi yang relevan. Juga karena ini adalah kode-golf Anda harus berusaha untuk meminimalkan panjang program Anda. Saya tidak yakin karena saya tidak tahu bahasa apa yang Anda gunakan di sini tetapi sepertinya Anda memiliki banyak spasi kosong. Sebagian besar bahasa memiliki halaman tips yang mencantumkan banyak tips golf yang dapat Anda gunakan. Saya akan merekomendasikan memeriksa halaman untuk bahasa yang Anda gunakan di sini.
Posting Rock Garf Hunter
@ HP selain dari dua baris kosong saya tidak melihat kelebihan spasi yang jelas. Garis-garis tampaknya tidak berakhir dengan titik koma atau pembatas lain jadi saya tidak akan terkejut bahwa tidak ada lebih dari satu hal dalam satu baris. Tetapi nama-nama variabel bisa lebih pendek ....
Jerry Jeremiah
Saya tidak yakin bagaimana bagian "sprite num" bekerja - dari dokumentasi sepertinya harus bilangan bulat dan spasi dalam nama variabel tidak akan diizinkan: docs.yoyogames.com/source/dadiospice/002_reference/drawing/ ...
Jerry Jeremiah