CJam, 87 83 82 80 bajtów
0"hTHøìð¼Ä¿håêÛ¾ªÔ¼"256b6b5a/4a8**li<{[33:B_B*65_B*1]=\_B%8=B\#*+}/Bb0-`
Powyższy kod zawiera znaki niedrukowalne.
Wypróbuj online w interpretatorze CJam . Jeśli link nie działa, skopiuj z tej pasty .
tło
Aby uzyskać konfigurację elektronową N-tego atomu, zaczynamy od atomu bez elektronów i stosujemy do niego transformacje N.
Aby zmniejszyć liczbę bajtów implementacji, reprezentujemy konfigurację elektronową atomu jako liczbę całkowitą. Każda cyfra tej liczby całkowitej w podstawie 33 odpowiada liczbie elektronów w niektórych powłokach; najmniej znacząca cyfra reprezentuje zewnętrzną powłokę.
Na przykład konfiguracja elektronowa molibdenu (42) wynosi [2 8 18 13 1] . Odpowiada to liczbie całkowitej 2 × 33 4 + 8 × 33 3 + 18 × 33 2 + 13 × 33 + 1 = 26 769 370 .
Pallad (48) to szczególny przypadek, który traktujemy jako [2 8 18 18 0] zamiast [2 8 18 18] .
Ta wygodna reprezentacja redukuje powyższe przekształcenia do prostej arytmetyki:
R += 1
(dodaj elektron do zewnętrznej powłoki)
R += 33
(dodaj elektron do drugiej powłoki zewnętrznej)
R += 65
(dodaj dwa elektrony do drugiej powłoki zewnętrznej; usuń jeden z pierwszej)
R += 1089
(dodaj elektron do trzeciej powłoki zewnętrznej)
R += 2145
(dodaj dwa elektrony do trzeciej powłoki zewnętrznej; usuń jeden z drugiej)
R *= 33, R += 1
(dodaj nową powłokę zawierającą pojedynczy elektron)
Pozostało tylko w jakiś sposób zakodować, którą transformację należy zastosować, aby przejść z jednego atomu do następnego. Różnice w reprezentacjach liczb całkowitych dwóch kolejnych atomów są następujące:
[1 1 65 1 1 1 1 1 1 1 2369 1 1 1 1 1 1 1 78401 1 33 33 33 65 1 33 33 33 65 1 1 1 1 1 1 1 2598017 1 33 33 65 33 1 65 33 65 1 1 1 1 1 1 1 1 85745345 1 33 1089 2145 1089 1089 1089 1089 33 2145 1089 1089 1089 1089 1089 33 33 33 33 33 33 33 65 33 1 1 1 1 1 1 1 2830095041 1 33 33 2145 1089 1089 2145 1089 33 2145 1089 1089 1089 1089 1089 65 1 33 33 33 33 33 33 65 1 1 1 1 1 1 1]
Unikalne różnice w tej tablicy są następujące:
[1 33 65 1089 2145 2369 78401 2598017 85745345 2830095041]
Wszystkie oprócz pierwszych 5 odpowiadają wystąpieniom, gdy dodawana jest nowa powłoka; można je pominąć, ponieważ pomnożenie przez 33 i dodanie 1 daje ten sam wynik co dodanie różnicy.
Ponieważ musimy dodać nową powłokę wtedy i tylko wtedy, gdy obecny atom ma dokładnie osiem elektronów w swojej zewnętrznej powłoce (z wyjątkiem He (2) ↦ Li (3) , który można zakodować jako add 65 ), możemy kodować te przekształcenia dodają 1 i określają potrzebę mnożenia w locie.
Zatem jeśli zdefiniujemy
X := 0
I := 0
L := [33 1089 65 2145 1]
T := [1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 3 1 0 0 0 3 1 1 1 1 1 1 1 1 1 0 0 3 0 1 3 0 3 1 1 1 1 1 1 1 1 1 1 0 2 4 2 2 2 2 0 4 2 2 2 2 2 0 0 0 0 0 0 0 3 0 1 1 1 1 1 1 1 1 1 0 0 4 2 2 4 2 0 4 2 2 2 2 2 3 1 0 0 0 0 0 0 3 1 1 1 1 1 1 1]
konfigurację elektronów N-tego atomu można obliczyć w następujący sposób:
while(X < N):
R *= (33 ** (R % 33 == 8))
R += L[T[X]]
X += 1
Jak to działa
" Push 0, the initial value of R; convert the following array into an integer by
considering it a base 256 number, then back to the array of its digits in base 6. ";
0"hTHøìð¼Ä¿håêÛ¾ªÔ¼"256b6b
" Replace each 5 in the resulting array by [4 4 4 4 4 4 4 4]. This yields the array T
from the above section. ";
5a/4a8**
" Read an integer N from STDIN and discard all but the first N elements of T. ";
li<
" For each element Y of the remainder of T, do the following: ";
{
[33:B_B*65_B*1]=\ " Define B := 33, push L, retrieve L[Y] and swap it with R. ";
_B%8=B\#* " Execute R *= 33 ** (R % 33 == 8). ";
+ " Execute R += L[Y]. ";
}/
" Convert R into the array of its digits in base 33, remove eventual zeros (Palladium)
and replace the resulting array with its string representation. ";
Bb0-`
Przykładowy przebieg
$ base64 -d > electrons.cjam <<< MCJoVEgM+OzwErzEGL9o5erbvqrUB4YZhrwRIjI1NmI2YjVhLzRhOCoqbGk8e1szMzpCX0IqNjVfQioxXT1cX0IlOD1CXCMqK30vQmIwLWA=
$ cksum electrons.cjam
3709391992 80 electrons.cjam
$ for i in {1..118}; do LANG=en_US cjam electrons.cjam <<< $i; echo; done
[1]
[2]
[2 1]
[2 2]
[2 3]
[2 4]
[2 5]
[2 6]
[2 7]
[2 8]
[2 8 1]
[2 8 2]
[2 8 3]
[2 8 4]
[2 8 5]
[2 8 6]
[2 8 7]
[2 8 8]
[2 8 8 1]
[2 8 8 2]
[2 8 9 2]
[2 8 10 2]
[2 8 11 2]
[2 8 13 1]
[2 8 13 2]
[2 8 14 2]
[2 8 15 2]
[2 8 16 2]
[2 8 18 1]
[2 8 18 2]
[2 8 18 3]
[2 8 18 4]
[2 8 18 5]
[2 8 18 6]
[2 8 18 7]
[2 8 18 8]
[2 8 18 8 1]
[2 8 18 8 2]
[2 8 18 9 2]
[2 8 18 10 2]
[2 8 18 12 1]
[2 8 18 13 1]
[2 8 18 13 2]
[2 8 18 15 1]
[2 8 18 16 1]
[2 8 18 18]
[2 8 18 18 1]
[2 8 18 18 2]
[2 8 18 18 3]
[2 8 18 18 4]
[2 8 18 18 5]
[2 8 18 18 6]
[2 8 18 18 7]
[2 8 18 18 8]
[2 8 18 18 8 1]
[2 8 18 18 8 2]
[2 8 18 18 9 2]
[2 8 18 19 9 2]
[2 8 18 21 8 2]
[2 8 18 22 8 2]
[2 8 18 23 8 2]
[2 8 18 24 8 2]
[2 8 18 25 8 2]
[2 8 18 25 9 2]
[2 8 18 27 8 2]
[2 8 18 28 8 2]
[2 8 18 29 8 2]
[2 8 18 30 8 2]
[2 8 18 31 8 2]
[2 8 18 32 8 2]
[2 8 18 32 9 2]
[2 8 18 32 10 2]
[2 8 18 32 11 2]
[2 8 18 32 12 2]
[2 8 18 32 13 2]
[2 8 18 32 14 2]
[2 8 18 32 15 2]
[2 8 18 32 17 1]
[2 8 18 32 18 1]
[2 8 18 32 18 2]
[2 8 18 32 18 3]
[2 8 18 32 18 4]
[2 8 18 32 18 5]
[2 8 18 32 18 6]
[2 8 18 32 18 7]
[2 8 18 32 18 8]
[2 8 18 32 18 8 1]
[2 8 18 32 18 8 2]
[2 8 18 32 18 9 2]
[2 8 18 32 18 10 2]
[2 8 18 32 20 9 2]
[2 8 18 32 21 9 2]
[2 8 18 32 22 9 2]
[2 8 18 32 24 8 2]
[2 8 18 32 25 8 2]
[2 8 18 32 25 9 2]
[2 8 18 32 27 8 2]
[2 8 18 32 28 8 2]
[2 8 18 32 29 8 2]
[2 8 18 32 30 8 2]
[2 8 18 32 31 8 2]
[2 8 18 32 32 8 2]
[2 8 18 32 32 10 1]
[2 8 18 32 32 10 2]
[2 8 18 32 32 11 2]
[2 8 18 32 32 12 2]
[2 8 18 32 32 13 2]
[2 8 18 32 32 14 2]
[2 8 18 32 32 15 2]
[2 8 18 32 32 16 2]
[2 8 18 32 32 18 1]
[2 8 18 32 32 18 2]
[2 8 18 32 32 18 3]
[2 8 18 32 32 18 4]
[2 8 18 32 32 18 5]
[2 8 18 32 32 18 6]
[2 8 18 32 32 18 7]
[2 8 18 32 32 18 8]
GolfScript (96 bajtów)
Dane wyjściowe są w formie
To używa magicznego ciągu znaków, który nie zawiera drukowalnych znaków, więc daję skrypt w formacie xxd:
Do testowania online piszę magiczny ciąg z ucieczkami:
ale jest to równoważne, gdy nie występują problemy z wklejaniem znaków w obszarach tekstowych przeglądarki.
Podejście polega na zbudowaniu maszyny wirtualnej z 7 instrukcjami, z których każda manipuluje listą zliczeń elektronów. Następnie dla elementu
n
zaczynamy od listy liczby elektronów0
i uruchamiamy pierwszen
instrukcje z listy zakodowanej przez magiczny ciąg.Instrukcje są następujące:
1
)
\)\
+)
. (To jest używane tylko dla palladu).+1
@)@@
@+\(2
raczej jako dłuższa@2+@(@
źródło
Python 2 (46 + 271 = 327)
Kod:
Plik
f
zawierający następujące śmieci binarne (są to kody char)Base64:
Na żądanie jest to teraz pełny program, a nie funkcja.
Stara odpowiedź: Python (naiwny poziom podstawowy, 422):
Zawartość zamka:
I szybki test:
źródło
:I
f
aby go odtworzyć?print
jako słowo kluczowe, a nie funkcja).MATLAB -
248244241178 + 44 = 222 bajtyZminimalizowane:
Rozszerzony:
Zależność pliku binarnego ( nazwa pliku „ a ”):
Ufam, że jest to „kompletny program”, ponieważ można go wywoływać z wiersza poleceń, odczytuje
stdin
i wysyła dostdout
.Używa swego rodzaju dwubiegunowego kodu bajtowego do budowania konfiguracji elektronów. Dwie instrukcje są
i
Instrukcje są zakodowane w dwóch tablicach. Pierwszy przechowuje
D
argument we wszystkich przypadkach. Drugi przechowujeN
argument lub0
wskazujepulldown
instrukcję, ponieważN = 0
nigdy nie jest używany jako argument.Pełna sekwencja instrukcji to:
Warto zauważyć, że 28 znaków można upuścić, jeśli użyjemy zestawu znaków specyficznego dla MATLAB, ale chciałem, aby moje rozwiązanie było reprezentowane jako zwykły tekst na Stack Exchange, bez żadnych zewnętrznych odniesień do plików.Jest to odwołanie do pliku zewnętrznego.
Przykładowe dane wyjściowe
39
:2 8 18 9 2
78
:2 8 18 32 17 1
117
:2 8 18 32 32 18 7
5
:2 3
źródło
Perl 5, 235 (234 + 1 dla -E)
Gra w golfa:
Uwaga: zrzut heksadecymalny znajduje się na dole tego postu, ponieważ niektóre literały łańcuchowe zawierają znaki kontrolne (które zostały wprowadzone przez edytor szesnastkowy).
Niegolfowany z komentarzami:
Hex Dump:
źródło
CJam,
309289 bajtówDziała poprzez zastąpienie typowych przebiegów (np.
2 8 18 32
) Liczbami całkowitymi większymi niż 32 i biorąc pod uwagę tablicę wszystkich konfiguracji podstawową liczbę 38, która jest zakodowana binarnie.Przykładowy przebieg
źródło