Write a tiny dependency resolver. Inputs:
available: {package: ["1.2.0", ...]}requires: the root requirements {package: constraint}deps: {"package==version": {dependency: constraint}} (missing key = no dependencies)A constraint is * or comma-separated clauses >=X, <X, ==X, ^X (same major version and ≥ X).
Versions are MAJOR.MINOR.PATCH.
Pick a version for every package reachable from the root such that all constraints on each package
hold. Resolve packages in alphabetical order and try versions from highest to lowest, backtracking when
stuck. Return {package: version} or None if impossible.
Implement resolve_versions. Input: available: dict, requires: dict, deps: dict. Returns: dict | None.
def resolve_versions(available, requires, deps):
return {p: max(v) for p, v in available.items() if p in requires}
Run executes the public tests. Submit grades against public and hidden tests.
Write a tiny dependency resolver. Inputs:
available: {package: ["1.2.0", ...]}requires: the root requirements {package: constraint}deps: {"package==version": {dependency: constraint}} (missing key = no dependencies)A constraint is * or comma-separated clauses >=X, <X, ==X, ^X (same major version and ≥ X).
Versions are MAJOR.MINOR.PATCH.
Pick a version for every package reachable from the root such that all constraints on each package
hold. Resolve packages in alphabetical order and try versions from highest to lowest, backtracking when
stuck. Return {package: version} or None if impossible.
Implement resolve_versions. Input: available: dict, requires: dict, deps: dict. Returns: dict | None.
def resolve_versions(available, requires, deps):
return {p: max(v) for p, v in available.items() if p in requires}
Run executes the public tests. Submit grades against public and hidden tests.