Diagramas de configuração eletrônica

13

Desafio

Dado o nome de um elemento, produza sua configuração eletrônica.

Entrada

Sua entrada será o nome completo de cada elemento (o intervalo é de hidrogênio, 1 a cálcio, 20), com algumas exceções - você deve ser capaz de considerar as seguintes entradas:

Natrium - This is sodium
Kalium - This is potassium

Observe que as entradas "sódio" e "potássio" ainda devem ser válidas.

A primeira letra será sempre maiúscula.

Resultado

Você pode consultar esta página da Web para obter orientações sobre como gerar um diagrama de configuração eletrônica.

A lista a seguir mostra o número máximo de elétrons em cada invólucro:

  • 1a camada - 2 elétrons
  • 2a camada - 8 elétrons
  • 3a camada - 8 elétrons
  • 4ª camada - 14 elétrons (embora o número máximo de elétrons nesta camada necessária seja 2)

Um exemplo de saída da configuração eletrônica é o seguinte:

No centro do diagrama deve estar o símbolo de uma a duas letras do elemento.

Pontos ou cruzes podem ser usados ​​e o local onde são colocados não importa.

A saída não precisa ser exatamente assim, mas precisa ser um gráfico ASCII. A única coisa que não pode ser é na forma 2.8.8.1ou em qualquer outra forma como esta.

Os círculos não são necessários

Funções incorporadas que acessam a tabela periódica de elementos ou produzem diagramas ou configurações eletrônicas são proibidas.

Ganhando

O programa mais curto em bytes vence.

Beta Decay
fonte
1
Precisamos mostrar os elétrons em pares?
lirtosiast
5
Eu recomendo exigir uma arte gráfica ou saída ASCII, caso contrário, os envios não são realmente comparáveis.
Alex A.
É a primeira letra maiúscula sempre (assim espero ...)
Tom Carpenter
Também no link eles os desenham de maneira diferente - você tem dois elétrons na primeira camada no topo, eles têm um na parte superior e outro na parte inferior.
Tom Carpenter
1
Para obter informações mais precisas sobre o que acontece depois dos 20, consulte aqui: en.wikipedia.org/wiki/Electron_shell
Level River St

Respostas:

3

MATLAB, 360 363 290 304 295 bytes

Veja na parte inferior da postagem como testar o código antigo com o Octave.

Esse código pega o nome do elemento (incluindo Kalium, etc.) e exibe a saída no formato ascii agora que as regras foram alteradas.

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

As regras foram alteradas desde que escrevi o código para exigir uma saída ASCII. Eu atualizei meu código para fazer isso à custa de 14 bytes. Eu salvei 9 bytes, livrando-me da reformulação () e apenas tornando a amatriz a forma correta para começar.

Aqui está uma explicação de como funciona:

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

Esta é a saída do hidrogênio (ignore os pontos, eles devem evitar que as linhas sejam removidas ao serem exibidas aqui):

          .
          .
          .
          .
   xH     .
          .
          .
          .
          .
          .

E aqui está a saída para o cálcio.

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

E a saída do Natrium, que agora funciona corretamente (antes do Natrium resultaria em nitrogênio!).

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

A nova versão do código não funciona com o Octave, pois usa o spiral()que está presente apenas no MATLAB.

No entanto, você pode testar o código antigo usando o interpretador 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') 

Execute isso e insira uma sequência como: 'Hidrogênio' (incluindo as aspas). Uma vez feito, você terá que clicar no botão de expansão da plotagem (parece um pequeno símbolo gráfico no canto superior direito do intérprete) para que ele mostre tudo. Infelizmente, no Octave, adicionamos linhas unindo os pontos, isso não acontece no MATLAB. Mas pelo menos permite testar a lógica por trás disso. Como eu disse, ainda é uma saída gráfica, mas você tem a idéia de como os elementos são pesquisados.

Tom Carpenter
fonte
Agora imprime em ASCII.
Tom Carpenter
2

Python 3, 529 bytes

obrigado Thomas e Beta por apontar algumas coisas que deveriam ter sido óbvias para mim, economizando alguns bytes

melhoria maciça: usando o corte de cordas em vez de pesquisa de ditado

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

Não é o mais bonito dos programas ou resultados, mas, ei, precisávamos de algo para lançar esse desafio. Experimente online .

Mego
fonte
No dicionário, você não poderia colocar os valores em uma única sequência "H 1"e dividi-los no espaço mais tarde?
Decay Beta
1
Essa é uma xícara de café longa;)
Decaimento beta 29/10
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
fonte
3
Bem vindo ao site. Em que idioma é esse? Eu recomendaria adicionar um coração como outros envios com todas as informações relevantes. Além disso, como esse é o código-golf, você deve tentar minimizar a duração do seu programa. Não sei ao certo porque não sei qual idioma você está usando aqui, mas parece que você tem um excesso de espaço em branco. A maioria dos idiomas possui uma página de dicas que lista várias dicas úteis sobre golfe que você pode usar. Eu recomendaria verificar a página para o idioma que você usa aqui.
Post Rock Garf Hunter
Estou bastante certo de que este é GML (a proprietária Game Maker Language): en.wikipedia.org/wiki/GameMaker_Studio#GameMaker_Language e docs.yoyogames.com/source/dadiospice/002_reference/...
Jerry Jeremias
@WW diferente das duas linhas em branco, não vejo nenhum excesso de espaço em branco óbvio. As linhas parecem não terminar com ponto-e-vírgula ou outro delimitador, portanto, não me surpreenderia que não possa haver mais de uma coisa na linha. Mas os nomes das variáveis ​​podem ser mais curtos ....
Jerry Jeremiah
Não tenho certeza de como a parte "sprite num" funciona - a partir da documentação que parece ser um número inteiro e os espaços em um nome de variável não seriam permitidos: docs.yoyogames.com/source/dadiospice/002_reference/drawing/ ...
Jerry Jeremiah