Skip to content

Instantly share code, notes, and snippets.

@ottobricks
Last active January 16, 2026 10:48
Show Gist options
  • Select an option

  • Save ottobricks/b52cd156f922c68b12939c2b93d2798b to your computer and use it in GitHub Desktop.

Select an option

Save ottobricks/b52cd156f922c68b12939c2b93d2798b to your computer and use it in GitHub Desktop.
Name-matching challenge
import random
from faker import Faker
def _generate_typo(name: str) -> str:
"""Introduces a simple typo into the given name."""
if len(name) > 3:
idx = random.randint(1, len(name) - 2)
new_char = random.choice('abcdefghijklmnopqrstuvwxyz')
return name[:idx] + new_char + name[idx+1:]
return name # Fallback for very short names
def _generate_middle_initial(name: str) -> str:
"""Adds a middle initial to the name if not present, or converts a middle name to an initial."""
parts = name.split()
if len(parts) >= 2:
if len(parts) == 2: # "First Last" -> "First M. Last"
return f"{parts[0]} {random.choice('ABCDEFGHIJKLMNOPQRSTUVWXYZ')}. {parts[1]}"
elif len(parts) == 3 and '.' not in parts[1]: # "First Middle Last" -> "First M. Last"
return f"{parts[0]} {parts[1][0]}. {parts[2]}"
return name # Already has middle initial, too complex, or too few parts
def transform(variation: str, name: str) -> str:
variations = {
"lowercase": str.lower,
"typo": _generate_typo,
"middle_initial": _generate_middle_initial
}
return variations[variation](name)
if __name__ == "__main__":
fake = Faker()
num_names = 10
original_names = [fake.name() for _ in range(num_names)]
names = random.sample(
original_names + [
transform(variation, name)
if random.random() < 0.7
else fake.name()
for name, variation in zip(
original_names,
random.choices(population=["lowercase", "typo", "middle_initial"], k=len(original_names))
)
],
k=num_names*2
)
del original_names
print(names)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment