Skip to content

Instantly share code, notes, and snippets.

@mawillcockson
Last active March 22, 2022 12:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mawillcockson/75d83364c2b0db4d685a1b5a2361b78b to your computer and use it in GitHub Desktop.
Save mawillcockson/75d83364c2b0db4d685a1b5a2361b78b to your computer and use it in GitHub Desktop.
ascii name coverage
"""
if only I knew javascript
"""
import itertools
import string
import sys
from typing import List, NamedTuple, Union
ASCII = set(string.ascii_lowercase)
ESCAPE = "\u001b"
GREEN = "32"
RED = "31"
RESET = "0"
VT100_ESCAPE_CODE = f"{ESCAPE}[{{code}}m"
def escape_code(code: Union[List[str], str]) -> str:
"formats escape codes using the code number(s)"
if isinstance(code, str):
return VT100_ESCAPE_CODE.format(code=code)
return VT100_ESCAPE_CODE.format(code=";".join(code))
GREEN_CODE = escape_code(GREEN)
RED_CODE = escape_code(RED)
RESET_CODE = escape_code(RESET)
class Percentage(NamedTuple):
"name compared to ASCII"
ascii_in_name: float
name_not_in_ascii: float
ascii_visual: str
def percentage_of_ascii(full_name: str, terminal: bool = True) -> Percentage:
"returns what percentage of a name covers the ASCII alphabet"
name_letters = set("".join(full_name.lower().strip().split()))
ascii_in_name = ASCII.intersection(name_letters)
percentage_ascii_in_name = len(ascii_in_name) / len(ASCII)
name_not_in_ascii = name_letters - ASCII
percentage_name_not_in_ascii = len(name_not_in_ascii) / len(name_letters)
ascii_visual: List[str] = []
for letter in sorted(ASCII):
if letter in name_letters:
ascii_visual.append(letter.lower())
else:
ascii_visual.append(letter.upper())
assert ascii_visual and all(ascii_visual), f"ascii_visual empty? {ascii_visual}"
if not terminal:
return Percentage(
ascii_in_name=percentage_ascii_in_name,
name_not_in_ascii=percentage_name_not_in_ascii,
ascii_visual="".join(ascii_visual),
)
def upper_red(letter: str) -> str:
if letter.isupper():
return RED_CODE
return GREEN_CODE
terminal_ascii_visual = list(
itertools.chain.from_iterable(
[[key, *group] for key, group in itertools.groupby(ascii_visual, upper_red)]
)
)
# terminal_ascii_visual: "List[str]" = []
# for key, group in itertools.groupby(ascii_visual, str.isupper):
# if not group:
# continue
# if group[0].isupper():
# terminal_ascii_visual.append(escape_code(RED))
# else:
# terminal_ascii_visual.append(escape_code(GREEN))
# terminal_ascii_visual.extend(group)
terminal_ascii_visual.append(RESET_CODE)
return Percentage(
ascii_in_name=percentage_ascii_in_name,
name_not_in_ascii=percentage_name_not_in_ascii,
ascii_visual="".join(terminal_ascii_visual),
)
if __name__ == "__main__":
if len(sys.argv) > 1 and any(sys.argv[1:]):
NAME = " ".join(sys.argv[1:])
else:
NAME = "Fatima Wong"
print(f"name: {NAME}")
percentage = percentage_of_ascii(NAME)
print(percentage.ascii_visual)
print(f"{percentage.ascii_in_name:.0%} of ASCII in name")
print(f"{percentage.name_not_in_ascii:.0%} of name outside ASCII")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment