Schematy konfiguracji elektronów

13

Wyzwanie

Biorąc pod uwagę nazwę elementu, wypisz jego konfigurację elektronową.

Wejście

Twój wkład będzie pełną nazwą każdego elementu (zakres od wodoru, 1, do wapnia, 20) z pewnymi wyjątkami - powinieneś być w stanie uwzględnić następujące dane wejściowe:

Natrium - This is sodium
Kalium - This is potassium

Pamiętaj, że dane wejściowe „sód” i „potas” muszą być nadal aktualne.

Pierwsza litera zawsze będzie pisana wielkimi literami.

Wynik

Na tej stronie można znaleźć wskazówki dotyczące generowania schematu konfiguracji elektronów.

Poniższa lista pokazuje maksymalną liczbę elektronów w każdej powłoce:

  • 1. skorupa - 2 elektrony
  • Druga powłoka - 8 elektronów
  • Trzecia skorupa - 8 elektronów
  • Czwarta powłoka - 14 elektronów (chociaż maksymalna wymagana liczba elektronów w tej powłoce to 2)

Przykładowy wynik konfiguracji elektronów jest następujący:

Na środku schematu musi znajdować się symbol składający się z jednej do dwóch liter.

Można użyć kropek lub krzyżyków, a ich położenie nie ma znaczenia.

Wyjście nie musi być dokładnie takie, ale musi być grafiką ASCII. Jedyną rzeczą, której nie może być, jest forma 2.8.8.1lub jakakolwiek inna forma tego typu.

Kręgi nie są konieczne

Wbudowane funkcje, które mają dostęp do układu okresowego pierwiastków lub tworzą diagramy lub konfiguracje elektronów, są niniejszym zabronione.

Zwycięski

Najkrótszy program w bajtach wygrywa.

Rozpad beta
źródło
1
Czy musimy pokazywać elektrony parami?
lirtosiast
5
Polecam wymaganie jednego z dzieł sztuki lub grafiki ASCII, w przeciwnym razie zgłoszenia nie są tak naprawdę porównywalne.
Alex A.
Czy pierwsza litera jest zawsze pisana wielkimi literami (mam nadzieję, że tak ...)
Tom Carpenter
Również w łączu rysują je inaczej - masz obie elektrony na pierwszej powłoce u góry, mają jeden na górze, jeden na dole.
Tom Carpenter
1
Aby uzyskać dokładniejsze informacje o tym, co dzieje się po 20, zobacz tutaj: en.wikipedia.org/wiki/Electron_shell
Level River St

Odpowiedzi:

3

MATLAB, 360 363 290 304 295 bajtów

Zobacz na dole postu, jak przetestować stary kod za pomocą Octave.

Ten kod przyjmuje nazwę elementu (w tym Kalium itp.) I wyświetla dane wyjściowe w formacie ascii po zmianie reguł.

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

Reguły uległy zmianie, ponieważ napisałem kod wymagający wyjścia ASCII. Zaktualizowałem swój kod, aby to zrobić kosztem 14 bajtów. Zaoszczędziłem 9 bajtów, pozbywając się reshape () i po prostu zmieniając amatrycę na właściwy kształt.

Oto wyjaśnienie, jak to dział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')

To jest wynik dla wodoru (zignoruj ​​kropki, aby uniknąć usuwania linii podczas pokazania tutaj):

          .
          .
          .
          .
   xH     .
          .
          .
          .
          .
          .

A oto wynik produkcji wapnia.

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

I wyjście dla Natrium, które teraz działa poprawnie (przed Natrium spowodowałoby to Azot!).

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

Nowa wersja kodu nie działa z Octave, ponieważ używa go spiral()tylko w MATLAB.

Możesz jednak przetestować stary kod za pomocą interpretera internetowego 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') 

Uruchom to, a następnie wprowadź ciąg typu: „Wodór” (w tym znaki cudzysłowu). Gdy to zrobisz, będziesz musiał kliknąć przycisk rozwijania wykresu (wygląda jak mały symbol wykresu w prawym górnym rogu interpretera), aby pokazać całą rzecz. Niestety w Octave dodaje linie łączące punkty, co nie dzieje się w MATLAB-ie. Ale przynajmniej pozwala przetestować logikę. Jak mówię, jest to nadal wyjście graficzne, ale masz pojęcie o tym, jak elementy są wyszukiwane.

Tom Carpenter
źródło
Teraz drukuje w ASCII.
Tom Carpenter
2

Python 3, 529 bajtów

dziękuję Thomasowi i Becie za wskazanie pewnych rzeczy, które powinny być dla mnie oczywiste, oszczędzając mi trochę bajtów

Ogromne ulepszenie: użycie odcinania łańcucha zamiast wyszukiwania dyktafonu

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

Nie najładniejszy z programów lub wyjść, ale hej, potrzebowaliśmy czegoś, aby rozpocząć to wyzwanie. Wypróbuj online .

Mego
źródło
Czy w słowniku nie można umieścić wartości w jednym ciągu, takim jak "H 1"i podzielić je później w przestrzeni?
Beta Decay
1
To długa filiżanka kawy;)
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)
użytkownik67059
źródło
3
Witamy na stronie. W jakim języku to jest? Polecam dodanie serca, podobnie jak innych zgłoszeń, ze wszystkimi istotnymi informacjami. Ponieważ jest to kod-golf , powinieneś dążyć do zminimalizowania długości twojego programu. Nie jestem pewien, ponieważ nie wiem, jakiego języka używasz tutaj, ale wygląda na to, że masz dużo nadmiaru białych znaków. Większość języków ma stronę ze wskazówkami zawierającą przydatne wskazówki dotyczące gry w golfa. Polecam sprawdzenie strony w języku, którego tu używasz.
Ad Hoc Garf Hunter
Jestem całkiem pewien, że jest to GML (zastrzeżony język Game Maker Language): en.wikipedia.org/wiki/GameMaker_Studio#GameMaker_Language i docs.yoyogames.com/source/dadiospice/002_reference/...
Jerry Jeremiah
@ WW oprócz dwóch pustych linii nie widzę żadnego oczywistego nadmiaru białych znaków. Wydaje się, że linie nie kończą się średnikami ani innym ogranicznikiem, więc nie byłbym zaskoczony, że w linii nie może znajdować się więcej niż jedna rzecz. Ale nazwy zmiennych mogą być krótsze ...
Jerry Jeremiah
Nie jestem pewien, jak działa część „sprite num” - z dokumentacji wynika, że ​​powinna ona być liczbą całkowitą, a spacje w nazwie zmiennej nie byłyby dozwolone: docs.yoyogames.com/source/dadiospice/002_reference/drawing/ …
Jerry Jeremiah