• # En Python, classieux

    Posté par (site web personnel) . En réponse au message Avent du Code, jour 3. Évalué à 3.

    #! /usr/bin/python3
    # Advent of Code 2022, day 2
    from typing import Iterable, Optional, TypeVar
    # '@' is not a valid item type, but it does no harm, and having it makes the
    # value of each item type equal to its index in this string. :-)
    letters = "@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    priorities = {letter: value for (value, letter) in enumerate(letters)}
    class Rucksack:
     def __init__(self, left: str, right: str):
     self.left = left
     self.right = right
     def anomaly(self) -> str:
     for letter in self.left:
     if letter in self.right:
     return letter
     raise ValueError("no anomaly in this rucksack")
     def __contains__(self, letter: str) -> bool:
     return letter in self.left or letter in self.right
    def import_sack(line):
     n = len(line) - 1 # do not count final '\n'
     left = line[0:n//2]
     right = line[n//2:n]
     return Rucksack(left, right)
    T = TypeVar('T')
    def group(iterable: Iterable[T], n: int) -> Iterable[list[T]]:
     result = [] # type: list[T]
     for item in iterable:
     result.append(item)
     if len(result) >= n:
     yield result
     result = []
     yield result
    def part1(lines: Iterable[str]) -> int:
     total = 0
     for line in lines:
     sack = import_sack(line)
     total += priorities[sack.anomaly()]
     return total
    def part2(lines: Iterable[str]) -> int:
     total = 0
     for line_group in group(lines, 3):
     sacks = [import_sack(line) for line in line_group]
     for letter in letters:
     if all(letter in sack for sack in sacks):
     total += priorities[letter]
     break
     return total