Ejemplo n.º 1
0
def main(input_file: IO):
    input_lines: List[str] = input_file.readlines()
    timers: List[str] = [i for i in input_lines[0].split(',')]

    population = be_fruitful(timers, 80)

    print_solution(str(population))
Ejemplo n.º 2
0
def main(input_file: IO):
    input_lines: List[str] = input_file.read().splitlines()

    error_lines = find_all_corrupted(input_lines)[1]

    points = {"(": 1, "[": 2, "{": 3, "<": 4}

    point_tallies = []
    for line in input_lines:
        if line in error_lines:
            continue

        brackets = []
        for c in line:
            if c in "{([<":
                brackets.append(c)
                continue

            brackets.pop()

        score = 0
        for i in range(len(brackets) - 1, -1, -1):
            score = (score * 5) + points[brackets[i]]
        point_tallies.append(score)

    point_tallies.sort()
    answer = point_tallies[(len(point_tallies) // 2)]

    print_solution(str(answer))
Ejemplo n.º 3
0
def main(input_file: IO):
    all_points, raw_folds = input_file.read().split('\n\n')

    points: Set[Tuple[int, int]] = set()
    for raw_point in all_points.splitlines():
        x, y = raw_point.split(',')
        points.add((int(x), int(y)))

    raw_folds = raw_folds.splitlines()

    folds: List[Tuple[str, int]] = []
    for f in raw_folds:
        match = re.findall(r'[xy]=\d+$', f)
        axis, number = match[0].split('=')
        folds.append((axis, int(number)))

    for i in range(1):
        fold = folds[i]
        for point in points.copy():
            x, y = point
            if fold[0] == 'x' and fold[1] < point[0]:
                translation = (x - fold[1]) * 2
                points.remove(point)
                points.add((x - translation, y))
            if fold[0] == 'y' and fold[1] < point[1]:
                translation = (y - fold[1]) * 2
                points.remove(point)
                points.add((x, y - translation))

    print_solution(str(len(points)))
Ejemplo n.º 4
0
def main(input_file: IO):
    input_lines: List[str] = input_file.read().splitlines()

    errors = find_all_corrupted(input_lines)[0]

    points = {")": 3, "]": 57, "}": 1197, ">": 25137}
    total_score = sum([points[e] for e in errors])

    print_solution(str(total_score))
Ejemplo n.º 5
0
def main(input_file: IO):
    input_lines: List[str] = input_file.readlines()

    count = 0
    for i in input_lines:
        output = i.split(' | ')[1].strip().split(" ")
        # Find 1, 4, 7, and 8: 1 = 2, 4 = 4, 7 = 3, 8 = 7
        output = [o for o in output if len(o) in [2, 4, 3, 7]]
        count = count + len(output)

    print_solution(str(count))
Ejemplo n.º 6
0
def main(input_file: IO):
    input_lines: List[str] = input_file.read().splitlines()

    grid: Dict[Tuple[int, int], int] = {}
    for y, row in enumerate(input_lines):
        for x, num in enumerate(row):
            grid[(x, y)] = int(num)

    low_points = find_low_points(grid)[1]

    print_solution(str(sum(low_points) + len(low_points)))
Ejemplo n.º 7
0
def main(input_file: IO):
    input_lines: List[str] = input_file.read().splitlines()

    graph = defaultdict(set)
    for line in input_lines:
        start, end = line.split('-')
        graph[start].add(end)
        graph[end].add(start)

    paths = []
    find_paths(graph, 'start', [], paths)

    print_solution(str(len(paths)))
Ejemplo n.º 8
0
def main(input_file: IO):
    input_lines: List[str] = input_file.read().splitlines()

    grid: Grid = {}
    for y, row in enumerate(input_lines):
        for x, num in enumerate(row):
            grid[(x, y)] = int(num)

    total_flashes = 0
    for _ in range(100):
        # Initial increments of the step
        for point in grid:
            grid[point] += 1

        total_flashes += flash(grid)

    print_solution(str(total_flashes))
Ejemplo n.º 9
0
def main(input_file: IO):
    input_lines: str = input_file.read()
    numbers = [int(i) for i in input_lines.split(',')]

    pos_counts = {pos: numbers.count(pos) for pos in numbers}

    least_fuel = 0
    for alignment in range(max(numbers)):
        fuel_needed = sum(
            [abs(p - alignment) * c for p, c in pos_counts.items()])

        if not least_fuel:
            least_fuel = fuel_needed
        elif least_fuel > fuel_needed:
            least_fuel = fuel_needed

    print_solution(str(least_fuel))
Ejemplo n.º 10
0
def main(input_file: IO):
    input_lines: List[str] = input_file.readlines()

    output_sum = 0
    for line in input_lines:
        segments, outputs = line.split(' | ')

        segments = segments.split(' ')
        digits = [letters_to_bits(seg) for seg in segments]

        outputs = [o.strip() for o in outputs.split(' ')]
        output_digits = [letters_to_bits(o) for o in outputs]

        # Simple, wire count-based
        one = find_one(digits)
        four = find_four(digits)
        seven = find_seven(digits)
        eight = find_eight(digits)

        # Comparison-based
        three = find_three(digits, one)
        nine = find_nine(digits, four)
        zero, six = find_zero_and_six(digits, one, nine)
        two, five = find_two_and_five(digits, three, six)

        digit_mappings = {
            zero: '0',
            one: '1',
            two: '2',
            three: '3',
            four: '4',
            five: '5',
            six: '6',
            seven: '7',
            eight: '8',
            nine: '9'
        }

        output_number = ''
        for o in output_digits:
            output_number += digit_mappings[o]

        output_sum += int(output_number)

    print_solution(str(output_sum))
Ejemplo n.º 11
0
def main(input_file: IO):
    input_lines: List[str] = input_file.read().splitlines()

    grid: Grid = {}
    for y, row in enumerate(input_lines):
        for x, num in enumerate(row):
            grid[(x, y)] = int(num)

    low_points = find_low_points(grid)[0]

    basin_sizes = []
    for point in low_points:
        basin = find_basins(grid, point, set())
        basin_sizes.append(len(basin))

    basin_sizes.sort(reverse=True)

    print_solution(str(prod(basin_sizes[:3])))
Ejemplo n.º 12
0
def main(input_file: IO):
    all_points, raw_folds = input_file.read().split('\n\n')

    points: Set[Tuple[int, int]] = set()
    for raw_point in all_points.splitlines():
        x, y = raw_point.split(',')
        points.add((int(x), int(y)))

    raw_folds = raw_folds.splitlines()

    folds: List[Tuple[str, int]] = []
    for f in raw_folds:
        match = re.findall(r'[xy]=\d+$', f)
        axis, number = match[0].split('=')
        folds.append((axis, int(number)))

    for fold in folds:
        for point in points.copy():
            x, y = point
            if fold[0] == 'x' and fold[1] < point[0]:
                translation = (x - fold[1]) * 2
                points.remove(point)
                points.add((x - translation, y))
            if fold[0] == 'y' and fold[1] < point[1]:
                translation = (y - fold[1]) * 2
                points.remove(point)
                points.add((x, y - translation))

    xs, ys = list(zip(*list(points)))
    x_max = max(xs) + 1
    y_max = max(ys) + 1

    display = []
    for y in range(y_max):
        row = [' '] * (x_max)
        for x in range(x_max):
            if (x, y) in points:
                row[x] = '#'
        display.append('\t' + ''.join(row))

    print_solution('\n' + '\n'.join(display))
Ejemplo n.º 13
0
def main(input_file: IO):
    input_lines: List[str] = input_file.read().splitlines()

    grid: Grid = {}
    for y, row in enumerate(input_lines):
        for x, num in enumerate(row):
            grid[(x, y)] = int(num)

    target_flashes = len(input_lines) * len(input_lines[0])

    step = 0
    while True:
        for point in grid:
            grid[point] += 1

        if flash(grid) == target_flashes:
            break

        step += 1

    print_solution(str(step + 1))
Ejemplo n.º 14
0
def main(input_file: IO):
    input_lines: List[str] = input_file.read().splitlines()
    solution = find_counts(input_lines, 10)

    print_solution(str(solution))
Ejemplo n.º 15
0
def main(input_file: IO):
    input_lines: List[str] = input_file.read().splitlines()

    print_solution("Not yet solved.")