Діаграми конфігурації електронів


13

Виклик

Давши ім’я елемента, виведіть його електронну конфігурацію.

Вхідні дані

Вашим вкладом буде повна назва кожного елемента (діапазон від водню, 1, до кальцію, 20), за деякими винятками - ви повинні мати можливість враховувати наступні дані:

Natrium - This is sodium
Kalium - This is potassium

Зауважте, що введення "натрію" та "калію" повинно бути дійсним.

Перший лист завжди буде з великої літери.

Вихідні дані

Щоб дізнатися, як створити електронну діаграму конфігурації, ви можете звернутися до цієї веб-сторінки .

Наступний список показує максимальну кількість електронів у кожній оболонці:

  • 1-а оболонка - 2 електрона
  • 2-а оболонка - 8 електронів
  • 3-я оболонка - 8 електронів
  • 4-а оболонка - 14 електронів (хоча максимальна кількість електронів у цій оболонці потрібно 2)

Прикладом виходу електронної конфігурації є наступне:

У центрі діаграми повинен бути символ однієї та двох літер елемента.

Можна використовувати крапки або хрестики, і де вони розміщені, значення не має.

Вихід не повинен бути точно таким, але він повинен бути графіком ASCII. Єдине, чого не може бути, це у формі 2.8.8.1чи будь-якій іншій формі.

Гуртки не потрібні

Вбудовані функції, які отримують доступ до періодичної таблиці елементів або створюють діаграми або конфігурації електронів, забороняються.

Перемога

Виграє найкоротша програма в байтах.


1
Чи потрібно нам показувати електрони парами?
lirtosiast

5
Я рекомендую вимагати одне з графічних або графічних результатів ASCII, інакше подані матеріали насправді не порівнянні.
Алекс А.

Перший лист завжди з великої літери (я сподіваюся, що так ...)
Том Карпентер

Також у посиланні вони малюють їх по-різному - у вас обой електрони на першій оболонці вгорі, у них один вгорі, один внизу.
Том Карпентер

1
Більш точну інформацію про те, що станеться після 20, дивіться тут: en.wikipedia.org/wiki/Electron_shell
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 байт. Я врятував 9 байт, позбувшись від переформатування () і просто зробивши 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') 

Запустіть це, а потім введіть рядок типу: "Водень" (включаючи лапки). Як тільки це буде зроблено, вам доведеться натиснути кнопку розгортання сюжету (виглядає як маленький символ графіка у верхньому правому куті інтерпретатора), щоб відобразити його повністю. На жаль, в Октаві додають лінії, що приєднуються до точок, цього не відбувається в MATLAB. Але принаймні це дозволяє перевірити логіку за нею. Як я кажу, це все-таки графічний вихід, але ви отримуєте уявлення про те, як елементи виглядають.


Тепер друкується в ASCII.
Том Карпентер

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
Це довга чашка кави;)
бета-розпад

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

Я впевнений, що це GML (мова пропетаріальної ігрової програми): en.wikipedia.org/wiki/GameMaker_Studio#GameMaker_Language та docs.yoyogames.com/source/dadiospice/002_reference/…
Джеррі Єремія

@WW, крім двох порожніх рядків, я не бачу явного зайвого пробілу. Здається, рядки не закінчуються крапками з комою або іншим розмежувачем, тому я не здивуюся, що на лінії не може бути більше однієї речі. Але імена змінних можуть бути коротшими ....
Джеррі Єремія

Я не впевнений, як працює частина "спрайт" - з документації виглядає, що це має бути ціле число, а пробіли в імені змінної забороняються: docs.yoyogames.com/source/dadiospice/002_reference/drawing/ …
Джеррі Єремія
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.