Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
Third solution in Clear category for Noble Gas Notation by mortonfox
ATOMIC_NUMBERS = {
'H': 1,
'He': 2,
'Li': 3,
'Be': 4,
'B': 5,
'C': 6,
'N': 7,
'O': 8,
'F': 9,
'Ne': 10,
'Na': 11,
'Mg': 12,
'Al': 13,
'Si': 14,
'P': 15,
'S': 16,
'Cl': 17,
'Ar': 18,
'K': 19,
'Ca': 20,
'Sc': 21,
'Ti': 22,
'V': 23,
'Cr': 24,
'Mn': 25,
'Fe': 26,
'Co': 27,
'Ni': 28,
'Cu': 29,
'Zn': 30,
'Ga': 31,
'Ge': 32,
'As': 33,
'Se': 34,
'Br': 35,
'Kr': 36,
'Rb': 37,
'Sr': 38,
'Y': 39,
'Zr': 40,
'Nb': 41,
'Mo': 42,
'Tc': 43,
'Ru': 44,
'Rh': 45,
'Pd': 46,
'Ag': 47,
'Cd': 48,
'In': 49,
'Sn': 50,
'Sb': 51,
'Te': 52,
'I': 53,
'Xe': 54,
'Cs': 55,
'Ba': 56,
'La': 57,
'Ce': 58,
'Pr': 59,
'Nd': 60,
'Pm': 61,
'Sm': 62,
'Eu': 63,
'Gd': 64,
'Tb': 65,
'Dy': 66,
'Ho': 67,
'Er': 68,
'Tm': 69,
'Yb': 70,
'Lu': 71,
'Hf': 72,
'Ta': 73,
'W': 74,
'Re': 75,
'Os': 76,
'Ir': 77,
'Pt': 78,
'Au': 79,
'Hg': 80,
'Tl': 81,
'Pb': 82,
'Bi': 83,
'Po': 84,
'At': 85,
'Rn': 86,
'Fr': 87,
'Ra': 88,
'Ac': 89,
'Th': 90,
'Pa': 91,
'U': 92,
'Np': 93,
'Pu': 94,
'Am': 95,
'Cm': 96,
'Bk': 97,
'Cf': 98,
'Es': 99,
'Fm': 100,
'Md': 101,
'No': 102,
'Lr': 103,
'Rf': 104,
'Db': 105,
'Ds': 110,
'Rg': 111,
'Cn': 112,
'Nh': 113,
'Fl': 114,
'Mc': 115,
'Lv': 116,
'Uus': 117,
'Ts': 117,
'Uuo': 118,
'Og': 118
}
NOBLE_GASES = ['He', 'Ne', 'Ar', 'Kr', 'Xe', 'Rn', 'Og']
ORBITAL_CAPACITIES = {'s': 2, 'p': 6, 'd': 10, 'f': 14}
ORBITS = [ '1s', '2s', '2p', '3s', '3p', '4s', '3d', '4p', '5s', '4d', '5p', '6s', '4f', '5d', '6p', '7s', '5f', '6d', '7p' ]
def notation(element: str) -> str:
atomic = ATOMIC_NUMBERS[element]
n = atomic
orbs = []
for orbit in ORBITS:
if n == 0: break
s = min(ORBITAL_CAPACITIES[orbit[-1]], n)
orbs.append([orbit, s])
n -= s
nob = None
for noble in NOBLE_GASES[::-1]:
if ATOMIC_NUMBERS[noble] < atomic:
nob = noble
break
orbs2 = []
skip = 0
if nob is not None: skip = ATOMIC_NUMBERS[nob]
for sh, c in orbs:
if skip > 0:
skip -= c
else:
orbs2.append(f'{sh}{c}')
orbs2 = sorted(orbs2, key=lambda s: (s[0], ORBITAL_CAPACITIES[s[1]]))
if nob is not None: orbs2.insert(0, f'[{nob}]')
return ' '.join(orbs2)
print("Example:")
print(notation("He"))
# These "asserts" are used for self-checking
assert notation("H") == "1s1"
assert notation("He") == "1s2"
assert notation("Al") == "[Ne] 3s2 3p1"
assert notation("O") == "[He] 2s2 2p4"
assert notation("Li") == "[He] 2s1"
assert notation('Og') == '[Rn] 5f14 6d10 7s2 7p6'
print("The mission is done! Click 'Check Solution' to earn rewards!")
Dec. 11, 2025
Comments: