Last active
January 16, 2026 10:48
-
-
Save ottobricks/b52cd156f922c68b12939c2b93d2798b to your computer and use it in GitHub Desktop.
Name-matching challenge
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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