CJam, 87 83 82 80 bytes
0"hTHøìð¼Ä¿håêÛ¾ªÔ¼"256b6b5a/4a8**li<{[33:B_B*65_B*1]=\_B%8=B\#*+}/Bb0-`
O código acima contém caracteres não imprimíveis.
Experimente on-line no intérprete CJam . Se o link não funcionar para você, copie desta pasta .
fundo
Para obter a configuração eletrônica do N - ésimo átomo, começamos com um átomo sem elétrons e aplicamos N transformações.
Para reduzir a contagem de bytes da implementação, representamos a configuração eletrônica de um átomo como um número inteiro. Cada dígito desse número inteiro na base 33 corresponde ao número de elétrons em uma determinada camada; o dígito menos significativo representa a casca externa.
Por exemplo, a configuração eletrônica do molibdênio (42) é [2 8 18 13 1] . Isso corresponde ao número inteiro 2 × 33 4 + 8 × 33 3 + 18 × 33 2 + 13 × 33 + 1 = 26,79.370 .
O paládio (48) é um caso especial, que tratamos como [2 8 18 18 0] em vez de [2 8 18 18] .
Essa representação conveniente reduz as transformações acima mencionadas à aritmética simples:
R += 1
(adicione um elétron ao invólucro externo)
R += 33
(adicione um elétron ao segundo invólucro externo)
R += 65
(adicione dois elétrons ao segundo invólucro externo; remova um do primeiro)
R += 1089
(adicione um elétron à terceira camada externa)
R += 2145
(adicione dois elétrons à terceira camada externa; remova um da segunda)
R *= 33, R += 1
(adicione um novo invólucro contendo um único elétron)
Tudo o que resta é codificar, de alguma forma, qual transformação deve ser aplicada para passar de um átomo em particular para o próximo. As diferenças das representações inteiras de dois átomos consecutivos são as seguintes:
[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]
As diferenças exclusivas nessa matriz são as seguintes:
[1 33 65 1089 2145 2369 78401 2598017 85745345 2830095041]
Todos, exceto os 5 primeiros, correspondem a instâncias em que um novo shell é adicionado; estes podem ser omitidos, pois multiplicar por 33 e adicionar 1 produz o mesmo resultado que adicionar a diferença.
Como temos que adicionar um novo invólucro se, e somente se, o átomo atual tiver exatamente oito elétrons em seu invólucro externo (com exceção de He (2) ↦ Li (3) , que pode ser codificado como add 65 ), podemos codificar essas transformações como adicionar 1 e determinar a necessidade de multiplicação em tempo real.
Assim, se definirmos
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]
a configuração eletrônica do átomo enésimo pode ser calculada da seguinte forma:
while(X < N):
R *= (33 ** (R % 33 == 8))
R += L[T[X]]
X += 1
Como funciona
" 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-`
Exemplo de execução
$ 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 bytes)
A saída está no formato
Isso usa uma string mágica que contém caracteres não imprimíveis, então estou fornecendo o script no formato xxd:
Para testes on-line, estou escrevendo a string mágica com escapes:
mas é equivalente quando você não está enfrentando problemas de colar caracteres nas áreas de texto do navegador.
A abordagem é construir uma máquina virtual com 7 instruções, cada uma das quais manipula uma lista de contagens de elétrons. Então, para o elemento
n
, começamos com uma lista de contagem de elétrons0
e executamos as primeirasn
instruções da lista codificada pela sequência mágica.As instruções são:
1
)
\)\
+)
. (Isso é usado apenas para paládio).+1
@)@@
@+\(2
e não por mais tempo@2+@(@
fonte
Python 2 (46 + 271 = 327)
Código:
Arquivo
f
, contendo o seguinte lixo binário (esses são os códigos de caracteres)Base64:
A pedido, este é agora um programa completo e não uma função.
Resposta antiga: Python (linha de base Naive, 422):
Conteúdo do zip:
E um teste rápido:
fonte
:I
f
para que eu possa reproduzi-lo?print
como uma palavra-chave e não como uma função).MATLAB -
248244241178 + 44 = 222 bytesMinificado:
Expandido:
Dependência de arquivo binário (nome do arquivo ' a '):
Confio que este é um "programa completo", pois pode ser chamado a partir da linha de comando, lê
stdin
e envia parastdout
.Ele usa um tipo de bytecode de duas instruções para criar as configurações eletrônicas. As duas instruções são
e
As instruções são codificadas em duas matrizes. O primeiro armazena o
D
argumento em todos os casos. O segundo armazena oN
argumento ou0
indica umapulldown
instrução, poisN = 0
nunca é usado como argumento.A sequência completa de instruções é:
Vale ressaltar que 28 caracteres podem ser eliminados se usarmos o conjunto de caracteres específico do MATLAB, mas eu queria que minha solução fosse representável como texto sem formatação no Stack Exchange, sem nenhuma referência externa ao arquivo.Referências a arquivos externos.
Saídas de amostra
39
:2 8 18 9 2
78
:2 8 18 32 17 1
117
:2 8 18 32 32 18 7
5
:2 3
fonte
Perl 5, 235 (234 + 1 para -E)
Golfe:
Nota: um dump hexadecimal é fornecido na parte inferior desta postagem, pois algumas literais de string contêm caracteres de controle (que foram inseridos por meio de um editor hexadecimal).
Ungolfed com comentários:
Hex Dump:
fonte
CJam,
309289 bytesFunciona substituindo execuções comuns (por exemplo,
2 8 18 32
) por números inteiros maiores que 32 e considerando a matriz de todas as configurações um número base 38, que é codificado em binário.Exemplo de execução
fonte