CJam, 87 83 82 80 bytes
0"hTHøìð¼Ä¿håêÛ¾ªÔ¼"256b6b5a/4a8**li<{[33:B_B*65_B*1]=\_B%8=B\#*+}/Bb0-`
El código anterior contiene caracteres no imprimibles.
Pruébelo en línea en el intérprete de CJam . Si el enlace no funciona para usted, copie de esta pasta .
Antecedentes
Para obtener la configuración electrónica del enésimo átomo, comenzamos con un átomo sin electrones y le aplicamos N transformaciones.
Para reducir el recuento de bytes de la implementación, representamos la configuración electrónica de un átomo como un entero. Cada dígito de ese número entero en la base 33 corresponde al número de electrones en ciertas capas; el dígito menos significativo representa la capa externa.
Por ejemplo, la configuración electrónica del molibdeno (42) es [2 8 18 13 1] . Esto corresponde al número entero 2 × 33 4 + 8 × 33 3 + 18 × 33 2 + 13 × 33 + 1 = 26,79,370 .
El paladio (48) es un caso especial, que tratamos como [2 8 18 18 0] en lugar de [2 8 18 18] .
Esta conveniente representación reduce las transformaciones antes mencionadas a aritmética simple:
R += 1
(agregue un electrón a la capa externa)
R += 33
(agregue un electrón a la segunda capa externa)
R += 65
(agregue dos electrones a la segunda capa externa; retire uno de la primera)
R += 1089
(agregue un electrón a la tercera capa externa)
R += 2145
(agregue dos electrones a la tercera capa externa; retire uno de la segunda)
R *= 33, R += 1
(agregue una nueva capa que contenga un solo electrón)
Todo lo que queda es codificar de alguna manera qué transformación debe aplicarse para pasar de un átomo particular al siguiente. Las diferencias de las representaciones enteras de dos átomos consecutivos son las siguientes:
[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]
Las diferencias únicas en esta matriz son las siguientes:
[1 33 65 1089 2145 2369 78401 2598017 85745345 2830095041]
Todos menos los primeros 5 corresponden a instancias cuando se agrega un nuevo shell; estos pueden omitirse ya que multiplicar por 33 y sumar 1 produce el mismo resultado que sumar la diferencia.
Dado que tenemos que agregar una nueva capa si y solo si el átomo actual tiene exactamente ocho electrones en su capa externa (con la excepción de He (2) ↦ Li (3) , que puede codificarse como suma 65 ), podemos codificar esas transformaciones como sumar 1 y determinar la necesidad de multiplicación sobre la marcha.
Así, si definimos
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]
La configuración electrónica del enésimo átomo se puede calcular de la siguiente manera:
while(X < N):
R *= (33 ** (R % 33 == 8))
R += L[T[X]]
X += 1
Cómo 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-`
Ejecución de ejemplo
$ 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)
La salida está en forma
Esto utiliza una cadena mágica que contiene caracteres no imprimibles, por lo que estoy dando el script en formato xxd:
Para las pruebas en línea , estoy escribiendo la cadena mágica con escapes:
pero es equivalente cuando no tienes problemas para pegar caracteres en las áreas de texto del navegador.
El enfoque es construir una máquina virtual con 7 instrucciones, cada una de las cuales manipula una lista de recuentos de electrones. Luego, para el elemento
n
, comenzamos con una lista de recuento de electrones0
y ejecutamos las primerasn
instrucciones de la lista codificada por la cadena mágica.Las instrucciones son:
1
)
\)\
+)
. (Esto se usa solo para paladio).+1
@)@@
@+\(2
lugar de la más larga@2+@(@
fuente
Python 2 (46 + 271 = 327)
Código:
Archivo
f
, que contiene la siguiente basura binaria (estos son los códigos char)Base64:
A pedido, ahora es un programa completo en lugar de una función.
Respuesta anterior: Python (línea de base ingenua, 422):
Contenido del zip:
Y una prueba rápida:
fuente
:I
f
para que pueda reproducirlo?print
como una palabra clave en lugar de una función).MATLAB -
248244241178 + 44 = 222 bytesMinified:
Expandido:
Dependencia de archivo binario (nombre de archivo ' a '):
Confío en que este es un "programa completo" en el sentido de que se puede invocar desde la línea de comandos, se lee
stdin
y se envía astdout
.Utiliza una especie de bytecode de dos instrucciones para construir las configuraciones electrónicas. Las dos instrucciones son
y
Las instrucciones están codificadas en dos matrices. El primero almacena el
D
argumento en todos los casos. El segundo almacena elN
argumento o0
para indicar unapulldown
instrucción, yaN = 0
que nunca se usa como argumento.La secuencia completa de instrucciones es:
Vale la pena señalar que se pueden eliminar 28 caracteres si usamos el conjunto de caracteres específico de MATLAB, pero quería que mi solución fuera representable como texto sin formato en Stack Exchange, sin ninguna referencia de archivo externo.El archivo externo hace referencia a él.
Resultados de muestra
39
:2 8 18 9 2
78
:2 8 18 32 17 1
117
:2 8 18 32 32 18 7
5
:2 3
fuente
Perl 5, 235 (234 + 1 para -E)
Golfizado:
Nota: se proporciona un volcado hexadecimal en la parte inferior de esta publicación, ya que algunos de los literales de cadena contienen caracteres de control (que se ingresaron a través de un editor hexadecimal).
Ungolfed con comentarios:
Hex Dump:
fuente
CJam,
309289 bytesFunciona reemplazando las ejecuciones comunes (por ejemplo,
2 8 18 32
) con enteros mayores que 32 y considerando la matriz de todas las configuraciones como un número base 38, que está codificado en binario.Ejecución de ejemplo
fuente