Схемы конфигурации электронов

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 байтов, избавившись от 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') 

Запустите его, затем введите строку, например: «Водород» (включая кавычки). Как только это будет сделано, вам нужно будет нажать кнопку развернуть график (выглядит как маленький символ графика в верхнем правом углу интерпретатора), чтобы он показывал все целиком. К сожалению, в Octave добавляются линии, соединяющие точки, в 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])

Не самая красивая из программ или результатов, но эй, нам нужно было что-то, чтобы начать этот вызов. Попробуйте онлайн .

Mego
источник
В словаре, вы не могли бы поместить значения в одну строку, как "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)
user67059
источник
3
Добро пожаловать на сайт. На каком это языке? Я бы порекомендовал добавить сердце, как и другие материалы со всей необходимой информацией. Также, поскольку это код-гольф, вы должны стремиться минимизировать продолжительность вашей программы. Я не могу быть уверен, потому что я не знаю, какой язык вы используете здесь, но, похоже, у вас много лишних пробелов. На большинстве языков есть страница с советами, где можно найти полезные советы по игре в гольф. Я бы порекомендовал проверить страницу для языка, который вы используете здесь.
Пост Рок Гарф Хантер
Я совершенно уверен , что это GML (The propietary Game Maker Language): en.wikipedia.org/wiki/GameMaker_Studio#GameMaker_Language и docs.yoyogames.com/source/dadiospice/002_reference/...
Джерри Иеремия
@WW кроме двух пустых строк, я не вижу очевидных лишних пробелов. Строки не заканчиваются точкой с запятой или каким-либо другим разделителем, поэтому я не удивлюсь, что в строке не может быть больше одной вещи. Но имена переменных могут быть короче ....
Джерри Иеремия
Я не уверен, как работает часть «sprite num» - из документации видно, что это должно быть целое число, а пробелы в имени переменной не допускаются: docs.yoyogames.com/source/dadiospice/002_reference/drawing/ …
Джерри Иеремия