Elektronenkonfigurationsdiagramme


13

Herausforderung

Bei gegebenem Elementnamen wird dessen Elektronenkonfiguration ausgegeben.

Eingang

Ihre Eingabe ist der vollständige Name jedes Elements (der Bereich reicht von Wasserstoff, 1, bis Kalzium, 20). Mit einigen Ausnahmen sollten Sie in der Lage sein, die folgenden Eingaben zu berücksichtigen:

Natrium - This is sodium
Kalium - This is potassium

Beachten Sie, dass die Eingaben "Natrium" und "Kalium" weiterhin gültig sein müssen.

Der erste Buchstabe wird immer groß geschrieben.

Ausgabe

Sie können auf diese Webseite verweisen Anleitungen zum Erstellen eines Elektronenkonfigurationsdiagramms.

Die folgende Liste zeigt die maximale Anzahl von Elektronen in jeder Schale:

  • 1. Schale - 2 Elektronen
  • 2. Schale - 8 Elektronen
  • 3. Schale - 8 Elektronen
  • 4. Schale - 14 Elektronen (obwohl die maximale Anzahl von Elektronen in dieser Schale 2 beträgt)

Eine beispielhafte Ausgabe der Elektronenkonfiguration ist die folgende:

In der Mitte des Diagramms muss sich das Symbol mit einem bis zwei Buchstaben des Elements befinden.

Es können entweder Punkte oder Kreuze verwendet werden, und es spielt keine Rolle, wo sie platziert werden.

Die Ausgabe muss nicht genau so sein, sondern muss eine ASCII-Grafik sein. Das Einzige, was es nicht sein kann, ist die Form2.8.8.1 oder irgendeine andere Form wie diese.

Die Kreise sind nicht notwendig

Eingebaute Funktionen, die auf das Periodensystem der Elemente zugreifen oder Diagramme oder Elektronenkonfigurationen erzeugen, sind hiermit nicht zulässig.

Gewinnen

Das kürzeste Programm in Bytes gewinnt.


1
Müssen wir die Elektronen paarweise zeigen?
Lirtosiast

5
Ich empfehle, eine ASCII-Grafik oder eine grafische Ausgabe zu benötigen, da die Übermittlungen sonst nicht wirklich vergleichbar sind.
Alex A.

Wird der erste Buchstabe immer in Großbuchstaben geschrieben (ich hoffe es ...)
Tom Carpenter

Auch im Link zeichnen sie sie unterschiedlich - Sie haben beide Elektronen auf der ersten Schale oben, sie haben eines oben, eines unten.
Tom Carpenter

1
Genauere Informationen darüber, was nach 20 passiert, finden Sie hier: en.wikipedia.org/wiki/Electron_shell
Level River St

Antworten:


3

MATLAB, 360 363 290 304 295 Bytes

Lesen Sie am Ende des Beitrags, wie Sie den alten Code mit Octave testen können.

Dieser Code übernimmt den Namen des Elements (einschließlich Kalium usw.) und zeigt die Ausgabe im ASCII-Format an, sobald sich die Regeln geändert haben.

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

Die Regeln haben sich geändert, seit ich den Code geschrieben habe, um eine ASCII-Ausgabe zu erfordern. Ich habe meinen Code dazu auf Kosten von 14 Bytes aktualisiert. Ich habe 9 Bytes gespart, indem ich die Umformung () losgeworden bin und nur diea Matrix von Anfang an in die richtige Form gebracht habe.

Hier ist eine Erklärung, wie es funktioniert:

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

Dies ist die Ausgabe für Wasserstoff (ignorieren Sie die Punkte, sie sollen verhindern, dass die Linien entfernt werden, wenn Sie hier anzeigen):

          .
          .
          .
          .
   xH     .
          .
          .
          .
          .
          .

Und hier ist die Ausgabe für Calcium.

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

Und die Ausgabe für Natrium, die jetzt richtig funktioniert (vor Natrium würde es zu Stickstoff führen!).

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

Die neue Version des Codes funktioniert nicht mit Octave, da es spiral()nur in MATLAB vorhanden ist.

Sie können den alten Code jedoch mit dem Octave-Online-Interpreter testen :

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

Führen Sie das aus, und geben Sie eine Zeichenfolge wie "Wasserstoff" (einschließlich der Anführungszeichen) ein. Sobald dies erledigt ist, müssen Sie auf die Schaltfläche zum Erweitern des Diagramms klicken (sieht aus wie ein kleines Diagrammsymbol in der oberen rechten Ecke des Interpreters), damit es das Ganze anzeigt. In Octave werden leider Linien hinzugefügt, die die Punkte verbinden, was in MATLAB nicht der Fall ist. Aber zumindest können Sie die Logik dahinter testen. Wie gesagt, dies ist immer noch eine grafische Ausgabe, aber Sie bekommen eine Vorstellung davon, wie die Elemente nachgeschlagen werden.


Jetzt wird in ASCII gedruckt.
Tom Carpenter

2

Python 3, 529 Bytes

Vielen Dank an Thomas und Beta, dass sie auf einige Dinge hingewiesen haben, die mir eigentlich klar gewesen wären und mir ein paar Bytes erspart hätten

Massive Verbesserung: Verwenden von String Slicing anstelle von Dikt-Lookup

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

Nicht die schönsten Programme oder Ausgaben, aber hey, wir brauchten etwas, um diese Herausforderung zu starten. Probieren Sie es online aus .


Konnten Sie im Wörterbuch die Werte nicht wie in eine einzelne Zeichenfolge einfügen "H 1"und später im Leerzeichen aufteilen?
Beta Decay

1
Das ist eine lange Tasse Kaffee;)
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
Willkommen auf der Seite. In welcher Sprache ist das? Ich würde empfehlen, ein Herz wie bei anderen Einsendungen mit allen relevanten Informationen hinzuzufügen. Auch da dies Code-Golf ist , sollten Sie versuchen, die Länge Ihres Programms zu minimieren. Ich kann nicht sicher sein, weil ich nicht weiß, welche Sprache Sie hier verwenden, aber es sieht so aus, als hätten Sie viel überflüssiges Leerzeichen. Die meisten Sprachen haben eine Seite mit Tipps, auf der eine Reihe hilfreicher Golftipps aufgeführt sind, die Sie verwenden können. Ich würde empfehlen, die Seite nach der Sprache zu durchsuchen, die Sie hier verwenden.
Post Rock Garf Hunter

Ich bin ziemlich sicher , dass dies GML (der propietary Game Maker Language): en.wikipedia.org/wiki/GameMaker_Studio#GameMaker_Language und docs.yoyogames.com/source/dadiospice/002_reference/...
Jerry Jeremiah

@WW außer den zwei leeren Zeilen sehe ich keine offensichtlichen übermäßigen Leerzeichen. Die Zeilen scheinen nicht mit einem Semikolon oder einem anderen Trennzeichen zu enden, daher wäre ich nicht überrascht, dass eine Zeile nur eines enthält. Aber die Variablennamen könnten kürzer sein ...
Jerry Jeremiah

Ich bin mir nicht sicher, wie der Teil "Sprite Num" funktioniert. Aus der Dokumentation geht hervor, dass es sich um eine Ganzzahl handeln sollte und Leerzeichen in einem Variablennamen nicht zulässig sind: docs.yoyogames.com/source/dadiospice/002_reference/drawing/ …
Jerry Jeremiah
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.