Last active
March 22, 2022 12:23
-
-
Save mawillcockson/75d83364c2b0db4d685a1b5a2361b78b to your computer and use it in GitHub Desktop.
ascii name coverage
This file contains 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
""" | |
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