day 5
This commit is contained in:
parent
efd1db1067
commit
770f355827
94
src/day5.py
Normal file
94
src/day5.py
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
from cpl_core.console import Console
|
||||||
|
from cpl_core.utils import String
|
||||||
|
from cpl_query.enumerable import Enumerable
|
||||||
|
from cpl_query.extension import List
|
||||||
|
from cpl_core.pipes import *
|
||||||
|
|
||||||
|
from aoc.aoc import get_input
|
||||||
|
|
||||||
|
# global vars
|
||||||
|
day = 5
|
||||||
|
aoc_input = get_input(2022, day)
|
||||||
|
aoc_input1 = """ [D]
|
||||||
|
[N] [C]
|
||||||
|
[Z] [M] [P]
|
||||||
|
1 2 3
|
||||||
|
|
||||||
|
move 1 from 2 to 1
|
||||||
|
move 3 from 1 to 3
|
||||||
|
move 2 from 2 to 1
|
||||||
|
move 1 from 1 to 2"""
|
||||||
|
|
||||||
|
|
||||||
|
def get_stacks() -> List[List[str]]:
|
||||||
|
stacks = List(List)
|
||||||
|
|
||||||
|
for line in aoc_input.splitlines():
|
||||||
|
if line.startswith('move'):
|
||||||
|
continue
|
||||||
|
|
||||||
|
if stacks.count() == 0:
|
||||||
|
for i in range(int(len(line) / 4 + 1)):
|
||||||
|
stacks.append(List(str))
|
||||||
|
|
||||||
|
for i in range(1, len(line), 4):
|
||||||
|
x = line[i]
|
||||||
|
if x.isnumeric() or x == ' ':
|
||||||
|
continue
|
||||||
|
|
||||||
|
stacks[int((i - 1) / 4)].append(x)
|
||||||
|
|
||||||
|
return stacks.select(lambda s: s.reverse())
|
||||||
|
|
||||||
|
|
||||||
|
def get_moves() -> List[tuple]:
|
||||||
|
moves = List(tuple)
|
||||||
|
for line in aoc_input.splitlines():
|
||||||
|
if not line.startswith('move'):
|
||||||
|
continue
|
||||||
|
|
||||||
|
move_str = line.split()
|
||||||
|
moves.append((int(move_str[1]), int(move_str[3]), int(move_str[5])))
|
||||||
|
|
||||||
|
return moves
|
||||||
|
|
||||||
|
|
||||||
|
def make_move(stacks: List[List[str]], moves: List[tuple], part_two=None):
|
||||||
|
if moves.first_or_default() is None:
|
||||||
|
return
|
||||||
|
|
||||||
|
move = moves.first()
|
||||||
|
|
||||||
|
if part_two is None:
|
||||||
|
for i in range(move[0]):
|
||||||
|
e = stacks[move[1] - 1].last()
|
||||||
|
stacks[move[2] - 1].append(e)
|
||||||
|
stacks[move[1] - 1].pop()
|
||||||
|
else:
|
||||||
|
elements = stacks[move[1] - 1].take_last(move[0])
|
||||||
|
stacks[move[2] - 1].extend(elements)
|
||||||
|
stacks[move[1] - 1] = stacks[move[1] - 1].skip_last(move[0])
|
||||||
|
|
||||||
|
moves.remove(move)
|
||||||
|
make_move(stacks, moves, part_two=part_two)
|
||||||
|
|
||||||
|
|
||||||
|
def part1():
|
||||||
|
stacks = get_stacks()
|
||||||
|
make_move(stacks, get_moves())
|
||||||
|
Console.write_line('Part 1: ', ''.join(stacks.select(lambda s: s.last_or_default()).where(lambda x: x is not None).to_list()))
|
||||||
|
|
||||||
|
|
||||||
|
def part2():
|
||||||
|
stacks = get_stacks()
|
||||||
|
make_move(stacks, get_moves(), part_two=True)
|
||||||
|
Console.write_line('Part 2: ', ''.join(stacks.select(lambda s: s.last_or_default()).where(lambda x: x is not None).to_list()))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
Console.write_line(f'Advent of code day {day}')
|
||||||
|
part1()
|
||||||
|
part2()
|
||||||
|
Console.write_line()
|
Loading…
Reference in New Issue
Block a user