Created
November 22, 2024 00:21
-
-
Save heffcodex/12729930e3a5323dc032b88aaf53b42c to your computer and use it in GitHub Desktop.
YouTube coding task solution just for fun
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
# The task is got form this video: https://www.youtube.com/watch?v=V8DGdPkBBxg | |
from typing import Mapping, Set, Sequence, Tuple, Union | |
input_facts = ( | |
"m = 3.28 ft", | |
"ft = 12 in", | |
"hr = 60 min", | |
"min = 60 sec", | |
) | |
input_queries = ( | |
"2 m = ? in", | |
"13 in = ? m", | |
"13 in = ? hr", | |
) | |
def parse_facts(*facts: str) -> Sequence[Tuple[str, str, float]]: | |
out = [] | |
for fact in facts: | |
unit_a, coef__unit_b = fact.split(' = ') | |
coef, unit_b = coef__unit_b.split() | |
out.append((unit_a, unit_b, float(coef))) | |
return out | |
def parse_queries(*queries: str) -> Sequence[Tuple[float, str, str]]: | |
out = [] | |
for query in queries: | |
value, unit_from__unit_to = query.split(' ', 1) | |
unit_from, unit_to = unit_from__unit_to.split(' = ? ') | |
out.append((float(value), unit_from, unit_to)) | |
return out | |
def make_conversion_matrix(*facts: Tuple[str, str, float]) -> Mapping[str, Mapping[str, float]]: | |
mat = dict() | |
for fact in facts: | |
forward = mat.get(fact[0], dict()) | |
forward.update({fact[1]: fact[2]}) | |
backward = mat.get(fact[1], dict()) | |
backward.update({fact[0]: 1/fact[2]}) | |
mat.update({ | |
fact[0]: forward, | |
fact[1]: backward, | |
}) | |
return mat | |
def convert(mat: Mapping[str, Mapping[str, float]], query: Tuple[float, str, str], visited: Union[Set[str], None] = None) -> Union[float, None]: | |
value, unit_from, unit_to = query | |
visited = set((unit_from,)) if visited is None else visited | |
#print("query: ", query) | |
#print("visited: ", visited) | |
options_to = mat.get(unit_from, None) | |
if options_to is None: | |
return None | |
for option_to in options_to.keys(): | |
if option_to in visited: | |
continue | |
converted_value = value * options_to[option_to] | |
if option_to == unit_to: | |
return round(converted_value, 2) | |
result = convert(mat, (converted_value, option_to, unit_to), visited.union((option_to,))) | |
if result is not None: | |
return result | |
return None | |
mat = make_conversion_matrix(*parse_facts(*input_facts)) | |
print(mat) | |
for query in parse_queries(*input_queries): | |
print(query[0], query[1], "->", query[2]) | |
print(convert(mat, query)) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment