Skip to content

Instantly share code, notes, and snippets.

@heffcodex
Created November 22, 2024 00:21
Show Gist options
  • Save heffcodex/12729930e3a5323dc032b88aaf53b42c to your computer and use it in GitHub Desktop.
Save heffcodex/12729930e3a5323dc032b88aaf53b42c to your computer and use it in GitHub Desktop.
YouTube coding task solution just for fun
# 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