Commit f29f0617 authored by Germain Clavier's avatar Germain Clavier 😺
Browse files

Starting the 2023 solutions only to give up at some point.

parent f8352436
Loading
Loading
Loading
Loading

2023/code.py

0 → 100644
+50 −0
Original line number Diff line number Diff line
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'''
Template for solutions
'''

import time
import argparse as ap

def solve1(file=None, verbose=False, solution=0):
    if file:
        with open(file, 'r') as f:
            pass

    return solution

def solve2(file=None, verbose=False, solution=0):
    if file:
        with open(file, 'r') as f:
            pass

    return solution

def main():
    parser = ap.ArgumentParser()
    parser.add_argument('-i', dest='input', action='store_true')
    parser.add_argument('-v', dest='verbose', action='store_true')
    args = parser.parse_args()
    infile = 'input' if args.input else 'test'
    verbose = args.verbose

    t0 = time.time()
    sol1 = solve1(infile, verbose)
    dt = time.time() - t0
    print(f"Solution 1: {sol1}, Time: {dt}")

    t0 = time.time()
    sol2 = solve2(infile, verbose)
    dt = time.time() - t0
    print(f"Solution 2: {sol2}, Time: {dt}")

    return


if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        raise SystemExit("User interruption.")

2023/day1/code.py

0 → 100644
+172 −0
Original line number Diff line number Diff line
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
Solution for day1 2023
Note: This solution uses some Python 3.10 features
"""

import time
import argparse as ap


def check_digits(line, verbose):
    num = []
    for i, c in enumerate(line):
        if c.isdigit():
            num.append(int(c))
            break
        match c:
            case "o":
                if line[i : i + 3] == "one":
                    num.append(1)
                    break
                else:
                    continue
            case "t":
                if line[i : i + 3] == "two":
                    num.append(2)
                    break
                elif line[i : i + 5] == "three":
                    num.append(3)
                    break
                else:
                    continue
            case "f":
                if line[i : i + 4] == "four":
                    num.append(4)
                    break
                elif line[i : i + 4] == "five":
                    num.append(5)
                    break
                else:
                    continue
            case "s":
                if line[i : i + 3] == "six":
                    num.append(6)
                    break
                elif line[i : i + 5] == "seven":
                    num.append(7)
                    break
                else:
                    continue
            case "e":
                if line[i : i + 5] == "eight":
                    num.append(8)
                    break
                else:
                    continue
            case "n":
                if line[i : i + 4] == "nine":
                    num.append(9)
                    break
                else:
                    continue
            case _:
                continue
    line = line[::-1]
    if verbose:
        print("State of num after 1st read: ", num)
    for i, c in enumerate(line):
        if c.isdigit():
            num.append(int(c))
            break
        match c:
            case "e":
                if line[i : i + 3] == "eno":
                    num.append(1)
                    break
                elif line[i : i + 5] == "eerht":
                    num.append(3)
                    break
                elif line[i : i + 4] == "evif":
                    num.append(5)
                    break
                elif line[i : i + 4] == "enin":
                    num.append(9)
                    break
                else:
                    continue
            case "o":
                if line[i : i + 3] == "owt":
                    num.append(2)
                    break
                else:
                    continue
            case "r":
                if line[i : i + 4] == "ruof":
                    num.append(4)
                    break
                else:
                    continue
            case "x":
                if line[i : i + 3] == "xis":
                    num.append(6)
                    break
                else:
                    continue
            case "n":
                if line[i : i + 5] == "neves":
                    num.append(7)
                    break
                else:
                    continue
            case "t":
                if line[i : i + 5] == "thgie":
                    num.append(8)
                    break
                else:
                    continue
            case _:
                continue
    if verbose:
        print("State of num after 2nd read: ", num)
    return num


def solve1(file="test", verbose=False, solution=0):
    with open(file, "r") as f:
        for line in f.readlines():
            num = filter(lambda x: x.isdigit(), line)
            num = list(map(int, num))
            solution += 10 * num[0] + num[-1]
    return solution


def solve2(file, verbose=False, solution=0):
    with open(file, "r") as f:
        for line in f.readlines():
            num = check_digits(line, verbose)
            if verbose:
                print(line, " ", num)
            solution += 10 * num[0] + num[-1]

    return solution


def main():
    parser = ap.ArgumentParser()
    parser.add_argument("-i", dest="input", action="store_true")
    parser.add_argument("-v", dest="verbose", action="store_true")
    args = parser.parse_args()
    infile = "input" if args.input else "test"
    verbose = args.verbose

    t0 = time.time()
    sol1 = solve1(infile, verbose)
    dt = time.time() - t0
    print(f"Solution 1: {sol1}, Time: {dt}")

    t0 = time.time()
    sol2 = solve2(infile, verbose)
    dt = time.time() - t0
    print(f"Solution 2: {sol2}, Time: {dt}")

    return


if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        raise SystemExit("User interruption.")

2023/day1/input

0 → 100644
+1000 −0

File added.

Preview size limit exceeded, changes collapsed.

2023/day1/test

0 → 100644
+4 −0
Original line number Diff line number Diff line
1abc2
pqr3stu8vwx
a1b2c3d4e5f
treb7uchet

2023/day2/code.py

0 → 100644
+118 −0
Original line number Diff line number Diff line
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
Solutions for day 2 of 2023
"""

import time
import argparse as ap


class Bag:
    def __init__(self, red=0, green=0, blue=0):
        self.red = red
        self.green = green
        self.blue = blue

    def is_possible(self, game):
        possible = (
            (self.red >= game.red)
            * (self.green >= game.green)
            * (self.blue >= game.blue)
        )
        return bool(possible)

    def __repr__(self):
        red, green, blue = self.red, self.green, self.blue
        return f"Contains {red} red, {green} green, {blue} blue."


def solve1(file=None, verbose=False, solution=0):
    # See instructions
    Mybag = Bag(red=12, green=13, blue=14)
    if verbose:
        print("MyBag", Mybag)
    with open(file, "r") as f:
        for line in f.readlines():
            possible = True
            (game_id, draws) = line.split(":")
            game_id = list(filter(lambda x: x.isdigit(), game_id))
            game_id = int("".join(game_id))
            draws = draws.split(";")
            for draw in draws:
                red, green, blue = 0, 0, 0
                cubes = draw.split(",")
                for cube in cubes:
                    if "red" in cube:
                        num = list(filter(lambda x: x.isdigit(), cube))
                        red = int("".join(num))
                    elif "green" in cube:
                        num = list(filter(lambda x: x.isdigit(), cube))
                        green = int("".join(num))
                    elif "blue" in cube:
                        num = list(filter(lambda x: x.isdigit(), cube))
                        blue = int("".join(num))
                tmp = Bag(red=red, green=green, blue=blue)
                possible *= Mybag.is_possible(tmp)
                if verbose:
                    print(f"My Draw with id {game_id}", tmp, f" and is {possible}.")
            solution += game_id * possible
    return solution


def solve2(file=None, verbose=False, solution=0):
    with open(file, "r") as f:
        for line in f.readlines():
            red, green, blue = 0, 0, 0
            (_, draws) = line.split(":")
            draws = draws.split(";")
            for draw in draws:
                cubes = draw.split(",")
                for cube in cubes:
                    if "red" in cube:
                        num = list(filter(lambda x: x.isdigit(), cube))
                        tmp = int("".join(num))
                        if tmp > red:
                            red = tmp
                    elif "green" in cube:
                        num = list(filter(lambda x: x.isdigit(), cube))
                        tmp = int("".join(num))
                        if tmp > green:
                            green = tmp
                    elif "blue" in cube:
                        num = list(filter(lambda x: x.isdigit(), cube))
                        tmp = int("".join(num))
                        if tmp > blue:
                            blue = tmp
            solution += red * green * blue

    return solution


def main():
    parser = ap.ArgumentParser()
    parser.add_argument("-i", dest="input", action="store_true")
    parser.add_argument("-v", dest="verbose", action="store_true")
    args = parser.parse_args()
    infile = "input" if args.input else "test"
    verbose = args.verbose

    t0 = time.time()
    sol1 = solve1(infile, verbose)
    dt = time.time() - t0
    print(f"Solution 1: {sol1}, Time: {dt}")

    t0 = time.time()
    sol2 = solve2(infile, verbose)
    dt = time.time() - t0
    print(f"Solution 2: {sol2}, Time: {dt}")

    return


if __name__ == "__main__":
    try:
        main()
    except KeyboardInterrupt:
        raise SystemExit("User interruption.")
Loading