Skip to content

Conversation

@delmorallopez
Copy link

Laptop allocation app

Every person should be allocated exactly one laptop.

If we define “sadness” as the number of places down in someone’s ranking the operating system the ended up with (i.e. if your preferences were [UBUNTU, ARCH, MACOS] and you were allocated a MACOS machine your sadness would be 2), we want to minimise the total sadness of all people. If we allocate someone a laptop with an operating system not in their preferred list, treat them as having a sadness of 100

@delmorallopez delmorallopez added the Needs Review Trainee to add when requesting review. PRs without this label will not be reviewed. label Dec 10, 2025
@OracPrime OracPrime added the Review in progress This review is currently being reviewed. This label will be replaced by "Reviewed" soon. label Jan 11, 2026
Copy link

@OracPrime OracPrime left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Couple of minor points, one bug, but generally good code, well done.

class Person:
name: str
age: int
preferred_operating_system: Tuple[OperatingSystem, ...]

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. Why a Tuple, not a List?
  2. If it is a collection, it should have a pluralised name (preferred_operating_systems)

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1.- I used Tuple instead of List to signal immutability and a fixed relationship, not something that will be modified. Items should not change.
2.- I have changed the name "preferred_operating_systems"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, also makes it hashable, which is need for a dictionary key.


def allocate_laptops(people: List[Person], laptops: List[Laptop]) -> Dict[Person, Laptop]:
if len(people) != len(laptops):
raise ValueError("Number of people must equal number of laptops.")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why does the number of people need to equal the number of laptops?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In this implementation, the number of people must equal the number of laptops because the algorithm assumes a one to one assignment, every person receives exactly one laptop and every laptop is assigned to exactly one person.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I disagree. Everyone needs a laptop, but spare laptops aren't a problem.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You’re right, the equality check is stronger than necessary.
The algorithm only requires that there are at least as many laptops as people. Extra laptops can safely remain unassigned. The current check enforces a perfect matching, but the problem only requires that every person gets one laptop.
I have modified the code to allowed to every person must get a laptop but spare laptops are allowed

raise ValueError("Number of people must equal number of laptops.")

# Clone list so we can remove laptops as they are assigned
available_laptops = laptops.copy()

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good spot!

@OracPrime OracPrime added Reviewed Volunteer to add when completing a review with trainee action still to take. and removed Needs Review Trainee to add when requesting review. PRs without this label will not be reviewed. Review in progress This review is currently being reviewed. This label will be replaced by "Reviewed" soon. labels Jan 11, 2026
@delmorallopez delmorallopez added the Needs Review Trainee to add when requesting review. PRs without this label will not be reviewed. label Jan 13, 2026
@OracPrime OracPrime added Complete Volunteer to add when work is complete and all review comments have been addressed. and removed Needs Review Trainee to add when requesting review. PRs without this label will not be reviewed. labels Jan 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Complete Volunteer to add when work is complete and all review comments have been addressed. Reviewed Volunteer to add when completing a review with trainee action still to take.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants