Skip to content

Instantly share code, notes, and snippets.

@infibrocco
Created June 2, 2024 12:52
Show Gist options
  • Save infibrocco/dd52b3c796bdb519409bca2dc386cb8e to your computer and use it in GitHub Desktop.
Save infibrocco/dd52b3c796bdb519409bca2dc386cb8e to your computer and use it in GitHub Desktop.
Converts a given name into chemical elements format (example: name2chem("calvin") -> "CaLvIn")
with open("ptable.json") as f:
elements = json.loads(f.read())
def name2chem(name: str):
"""Converts a given name into chemical elements"""
possible = [] # Initialize a list to store possible matches
contcount = 0 # Initialize a variable to keep track of continue count
# Iterate over the characters in the input name
for i, ch in enumerate(name):
if contcount > 0: # Check if there are unresolved continues
contcount -= 1 # Decrement the continue count
continue
# Add all elements in the dictionary keys that start with the current character to the possible matches
possible.append(
list(
k.lower()
for k in elements.keys()
if k.lower().startswith(ch.lower())
)
)
# Check if the next character is a possible continuation of the current match
if (i + 1) < len(name) and any(
k.endswith(name[i + 1]) for k in possible[-1]
):
# Combine the characters and update the continue count
possible[-1] = ch.lower() + name[i + 1]
contcount += 1
continue
elif ch.lower() in possible[-1]:
# Update the match if the current character is a valid match
possible[-1] = ch.lower()
# If there are lists within the possible matches
if any(isinstance(i, list) for i in possible):
possible = [] # Reset the possible matches list
# Iterate over the characters in the input name again
for i, ch in enumerate(name):
if contcount > 0: # Check for continue count
contcount -= 1 # Decrement the continue count
continue
# Find elements in the dictionary keys that start with the current character
possible.append(
list(
k.lower()
for k in elements.keys()
if k.lower().startswith(ch.lower())
)
)
# Note: The following code is similar to the previous code block
# However, the conditions are switched around to make sure that we can properly convert the input name to chemical elements format
if ch.lower() in possible[-1]:
# Update the match if the current character is a valid match
possible[-1] = ch.lower()
elif (i + 1) < len(name) and any(
k.endswith(name[i + 1]) for k in possible[-1]
):
# Combine the characters and update the continue count
possible[-1] = ch.lower() + name[i + 1]
contcount += 1
continue
if any(isinstance(i, list) for i in possible) or "".join(possible) != name:
return "NaN"
# Return "NaN" if there are unresolved matches or if the match doesn't match the input name
# Return the name in chemical elements format
return "".join(p.capitalize() for p in possible)
{
"H": {
"number": 1,
"group": 1,
"period": 1
},
"He": {
"number": 2,
"group": 18,
"period": 1
},
"Li": {
"number": 3,
"group": 1,
"period": 2
},
"Be": {
"number": 4,
"group": 2,
"period": 2
},
"B": {
"number": 5,
"group": 13,
"period": 2
},
"C": {
"number": 6,
"group": 14,
"period": 2
},
"N": {
"number": 7,
"group": 15,
"period": 2
},
"O": {
"number": 8,
"group": 16,
"period": 2
},
"F": {
"number": 9,
"group": 17,
"period": 2
},
"Ne": {
"number": 10,
"group": 18,
"period": 2
},
"Na": {
"number": 11,
"group": 1,
"period": 3
},
"Mg": {
"number": 12,
"group": 2,
"period": 3
},
"Al": {
"number": 13,
"group": 13,
"period": 3
},
"Si": {
"number": 14,
"group": 14,
"period": 3
},
"P": {
"number": 15,
"group": 15,
"period": 3
},
"S": {
"number": 16,
"group": 16,
"period": 3
},
"Cl": {
"number": 17,
"group": 17,
"period": 3
},
"Ar": {
"number": 18,
"group": 18,
"period": 3
},
"K": {
"number": 19,
"group": 1,
"period": 4
},
"Ca": {
"number": 20,
"group": 2,
"period": 4
},
"Sc": {
"number": 21,
"group": 3,
"period": 4
},
"Ti": {
"number": 22,
"group": 4,
"period": 4
},
"V": {
"number": 23,
"group": 5,
"period": 4
},
"Cr": {
"number": 24,
"group": 6,
"period": 4
},
"Mn": {
"number": 25,
"group": 7,
"period": 4
},
"Fe": {
"number": 26,
"group": 8,
"period": 4
},
"Co": {
"number": 27,
"group": 9,
"period": 4
},
"Ni": {
"number": 28,
"group": 10,
"period": 4
},
"Cu": {
"number": 29,
"group": 11,
"period": 4
},
"Zn": {
"number": 30,
"group": 12,
"period": 4
},
"Ga": {
"number": 31,
"group": 13,
"period": 4
},
"Ge": {
"number": 32,
"group": 14,
"period": 4
},
"As": {
"number": 33,
"group": 15,
"period": 4
},
"Se": {
"number": 34,
"group": 16,
"period": 4
},
"Br": {
"number": 35,
"group": 17,
"period": 4
},
"Kr": {
"number": 36,
"group": 18,
"period": 4
},
"Rb": {
"number": 37,
"group": 1,
"period": 5
},
"Sr": {
"number": 38,
"group": 2,
"period": 5
},
"Y": {
"number": 39,
"group": 3,
"period": 5
},
"Zr": {
"number": 40,
"group": 4,
"period": 5
},
"Nb": {
"number": 41,
"group": 5,
"period": 5
},
"Mo": {
"number": 42,
"group": 6,
"period": 5
},
"Tc": {
"number": 43,
"group": 7,
"period": 5
},
"Ru": {
"number": 44,
"group": 8,
"period": 5
},
"Rh": {
"number": 45,
"group": 9,
"period": 5
},
"Pd": {
"number": 46,
"group": 10,
"period": 5
},
"Ag": {
"number": 47,
"group": 11,
"period": 5
},
"Cd": {
"number": 48,
"group": 12,
"period": 5
},
"In": {
"number": 49,
"group": 13,
"period": 5
},
"Sn": {
"number": 50,
"group": 14,
"period": 5
},
"Sb": {
"number": 51,
"group": 15,
"period": 5
},
"Te": {
"number": 52,
"group": 16,
"period": 5
},
"I": {
"number": 53,
"group": 17,
"period": 5
},
"Xe": {
"number": 54,
"group": 18,
"period": 5
},
"Cs": {
"number": 55,
"group": 1,
"period": 6
},
"Ba": {
"number": 56,
"group": 2,
"period": 6
},
"La": {
"number": 57,
"group": 3,
"period": 6
},
"Ce": {
"number": 58,
"group": 3,
"period": 6
},
"Pr": {
"number": 59,
"group": 3,
"period": 6
},
"Nd": {
"number": 60,
"group": 3,
"period": 6
},
"Pm": {
"number": 61,
"group": 3,
"period": 6
},
"Sm": {
"number": 62,
"group": 3,
"period": 6
},
"Eu": {
"number": 63,
"group": 3,
"period": 6
},
"Gd": {
"number": 64,
"group": 3,
"period": 6
},
"Tb": {
"number": 65,
"group": 3,
"period": 6
},
"Dy": {
"number": 66,
"group": 3,
"period": 6
},
"Ho": {
"number": 67,
"group": 3,
"period": 6
},
"Er": {
"number": 68,
"group": 3,
"period": 6
},
"Tm": {
"number": 69,
"group": 3,
"period": 6
},
"Yb": {
"number": 70,
"group": 3,
"period": 6
},
"Lu": {
"number": 71,
"group": 3,
"period": 6
},
"Hf": {
"number": 72,
"group": 4,
"period": 6
},
"Ta": {
"number": 73,
"group": 5,
"period": 6
},
"W": {
"number": 74,
"group": 6,
"period": 6
},
"Re": {
"number": 75,
"group": 7,
"period": 6
},
"Os": {
"number": 76,
"group": 8,
"period": 6
},
"Ir": {
"number": 77,
"group": 9,
"period": 6
},
"Pt": {
"number": 78,
"group": 10,
"period": 6
},
"Au": {
"number": 79,
"group": 11,
"period": 6
},
"Hg": {
"number": 80,
"group": 12,
"period": 6
},
"Tl": {
"number": 81,
"group": 13,
"period": 6
},
"Pb": {
"number": 82,
"group": 14,
"period": 6
},
"Bi": {
"number": 83,
"group": 15,
"period": 6
},
"Po": {
"number": 84,
"group": 16,
"period": 6
},
"At": {
"number": 85,
"group": 17,
"period": 6
},
"Rn": {
"number": 86,
"group": 18,
"period": 6
},
"Fr": {
"number": 87,
"group": 1,
"period": 7
},
"Ra": {
"number": 88,
"group": 2,
"period": 7
},
"Ac": {
"number": 89,
"group": 3,
"period": 7
},
"Th": {
"number": 90,
"group": 3,
"period": 7
},
"Pa": {
"number": 91,
"group": 3,
"period": 7
},
"U": {
"number": 92,
"group": 3,
"period": 7
},
"Np": {
"number": 93,
"group": 3,
"period": 7
},
"Pu": {
"number": 94,
"group": 3,
"period": 7
},
"Am": {
"number": 95,
"group": 3,
"period": 7
},
"Cm": {
"number": 96,
"group": 3,
"period": 7
},
"Bk": {
"number": 97,
"group": 3,
"period": 7
},
"Cf": {
"number": 98,
"group": 3,
"period": 7
},
"Es": {
"number": 99,
"group": 3,
"period": 7
},
"Fm": {
"number": 100,
"group": 3,
"period": 7
},
"Md": {
"number": 101,
"group": 3,
"period": 7
},
"No": {
"number": 102,
"group": 3,
"period": 7
},
"Lr": {
"number": 103,
"group": 3,
"period": 7
},
"Rf": {
"number": 104,
"group": 4,
"period": 7
},
"Db": {
"number": 105,
"group": 5,
"period": 7
},
"Sg": {
"number": 106,
"group": 6,
"period": 7
},
"Bh": {
"number": 107,
"group": 7,
"period": 7
},
"Hs": {
"number": 108,
"group": 8,
"period": 7
},
"Mt": {
"number": 109,
"group": 9,
"period": 7
},
"Ds": {
"number": 110,
"group": 10,
"period": 7
},
"Rg": {
"number": 111,
"group": 11,
"period": 7
},
"Cn": {
"number": 112,
"group": 12,
"period": 7
},
"Nh": {
"number": 113,
"group": 13,
"period": 7
},
"Fl": {
"number": 114,
"group": 14,
"period": 7
},
"Mc": {
"number": 115,
"group": 15,
"period": 7
},
"Lv": {
"number": 116,
"group": 16,
"period": 7
},
"Ts": {
"number": 117,
"group": 17,
"period": 7
},
"Og": {
"number": 118,
"group": 18,
"period": 7
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment