전자 구성 다이어그램


13

도전

요소 이름이 주어지면 전자 구성을 출력하십시오.

입력

입력 내용은 일부 예외를 제외하고 각 원소의 전체 이름 (수소, 1, 칼슘, 20 범위)입니다. 다음 입력을 설명 할 수 있습니다.

Natrium - This is sodium
Kalium - This is potassium

"나트륨"및 "칼륨"입력은 여전히 ​​유효해야합니다.

첫 글자는 항상 대문자입니다.

산출

전자 구성 다이어그램을 생성하는 방법에 대한 지침은 이 웹 페이지 를 참조하십시오 .

다음 목록은 각 쉘의 최대 전자 수를 보여줍니다.

  • 첫 번째 껍질 -2 전자
  • 두 번째 껍질 -8 전자
  • 세 번째 껍질 -8 전자
  • 4 번째 쉘 -14 개의 전자 (필요한이 쉘의 최대 전자 수는 2이지만)

전자 구성의 출력 예는 다음과 같습니다.

다이어그램의 중앙에는 요소의 1 ~ 2 문자 기호가 있어야합니다.

점이나 십자가를 사용할 수 있으며 배치 된 위치는 중요하지 않습니다.

출력은 이와 정확히 같을 필요는 없지만 ASCII 그래픽이어야합니다. 그것이 될 수없는 것은 양식 2.8.8.1또는 이와 같은 다른 양식입니다.

원은 필요하지 않습니다

따라서 주기율표에 액세스하거나 다이어그램 또는 전자 구성을 생성하는 내장 기능이 허용되지 않습니다.

승리

바이트 단위의 최단 프로그램이 이깁니다.


1
전자를 쌍으로 표시해야합니까?
lirtosiast

5
ASCII 아트 또는 그래픽 출력 중 하나를 요구하는 것이 좋습니다. 그렇지 않으면 제출 내용이 실제로 비교할 수 없습니다.
Alex A.

항상 대문자로 첫 글자는 (나는 ... 그래서 희망)인가
톰 카펜터

또한 링크에서 그것들이 다르게 그려집니다. 당신은 두 전자가 상단의 첫 번째 껍질에 있고 상단에 하나, 하단에 하나 있습니다.
Tom Carpenter

1
20 년 이후에 발생하는 일에 대한보다 정확한 정보는 다음을 참조하십시오. en.wikipedia.org/wiki/Electron_shell
St. River St

답변:


3

MATLAB, 360 363290304 295 바이트

옥타브로 이전 코드를 테스트하는 방법은 게시물 하단을 참조하십시오.

이 코드는 요소의 이름 (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 바이트를 희생 하여이 작업을 수행하도록 코드를 업데이트했습니다. reshape ()을 제거하고 a행렬을 올바른 모양으로 만들어 9 바이트를 절약 했습니다.

작동 방식에 대한 설명은 다음과 같습니다.

%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    .
          .
          .

새로운 버전의 코드는 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') 

이를 실행 한 다음 'Hydrogen'(따옴표 포함)과 같은 문자열을 입력하십시오. 완료되면 플롯 확장 버튼 (인터프리터의 오른쪽 상단 모서리에있는 작은 그래프 기호)을 클릭하여 전체 내용을 표시해야합니다. 옥타브에서는 불행히도 포인트를 결합하는 선을 추가하지만 MATLAB에서는 발생하지 않습니다. 그러나 적어도 그것은 당신이 그 배후의 논리를 테스트 할 수있게합니다. 내가 말했듯이, 이것은 여전히 ​​그래픽 출력이지만 요소가 어떻게 조회되는지에 대한 아이디어를 얻습니다.


이제 ASCII로 인쇄합니다.
Tom Carpenter

2

파이썬 3, 529 바이트

나에게 분명해야 할 것들을 지적하여 약간의 바이트를 절약 해 준 Thomas와 Beta에게 감사한다.

대규모 개선 : 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"나중에 공백으로 분할 할 수 없었습니까?
Beta Decay

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)

3
사이트에 오신 것을 환영합니다. 이 언어는 무엇입니까? 모든 관련 정보가 포함 된 다른 제출물과 같은 마음을 추가하는 것이 좋습니다. 또한 이것은 코드 골프 이기 때문에 프로그램 길이를 최소화하는 것을 목표로해야합니다. 여기서 사용중인 언어를 모르기 때문에 확실하지 않지만 공백이 많이있는 것처럼 보입니다. 대부분의 언어에는 유용한 골프 팁이 나열된 팁 페이지가 있습니다. 여기에서 사용하는 언어의 페이지를 확인하는 것이 좋습니다.
Ad Hoc Garf Hunter


@WW 두 개의 빈 줄 이외의 여분의 공백은 보이지 않습니다. 줄은 세미콜론이나 다른 구분 기호로 끝나지 않으므로 줄에 둘 이상있을 수 있다는 사실에 놀라지 않을 것입니다. 그러나 변수 이름은 더 짧을 수 있습니다 ....
Jerry Jeremiah

"스프라이트 num"부분이 어떻게 작동하는지 잘 모르겠습니다. 문서에서 정수 여야하고 변수 이름에 공백이 허용되지 않는 것처럼 보입니다
Jerry Jeremiah
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.