Solve day thirteen
2 files changed, 305 insertions(+), 1 deletions(-) A data/day13 M src/bin/day13.rs
A data/day13 => data/day13 +150 -0
@@ 0,0 1,150 @@ /---------------------------------------------------------------------------------------------\ /----------------------<--------------------+----------------------------\ | | | | | | /------------------\ | | /--------------\ | | | | | | | | | | | | | /--------------------+------------------------------+--------------+-------\ | | | | | | /-------------+------------------------------+--------------+-------+----------+-----\ | | | | | /+-------------+-----------------\ | /------------+-------+--------\ | | | | | | | || | | | | | | | | | | | /--------+---------------------+-------+-----++-------------+-------<---------+------------+-+--------\ | | | | | | | | /----+---------------------+-------+-----++-------------+-----------------+------------+-+-----\ | | | | | | | | | | | /--------+-------+-----++-------------+------------\ | /------+-+-\ | | | | | | | | | | /-+----+------------+--------+-------+-----++-------------+------------+----+-----+-\ | | | | | | | /--+-+-----+---\ | | /----+-+-+----+------------+--------+-------+-----++---\ | | | /---+-+----+-+-+---+--+---+-------+-----+--+\| | | | | | | |/+----+------------+--------+-------+-----++---+---------+------------+----+-+---+\| | | | | | | | /--+--+++--\ | | | | /+----+-+++----+------------+--------+-------+-----++---+---\ | | | | ||| | | | | | | | | | ||| | | | | | || | ||| | /--+--------+\ | || | /+-----+------------+---\| | ||| | | | | | | | | | ||| | | | | | || | ||| | | | || /--+-----++---+--++-----+------------+---++-+---+++----+-+-+---+--+---+-------+--+--+--+++--+--+\ | | | || | ||| /--+---------+--+-\/-----++-\ | /+-----++---+\ || | | || | ||| | | | | | | /-----+--+--+--+++\ | || | | | || | ||| | | | | || || | | || || || || | | || | ||| | | | | | | ^ | | | |||| | || | | | || | ||| | | /----+--+-++-----++-+-+-++-----++---++-++-\ | | || | ||| | | | | | | | | | | |||| | || | | | || | ||\-+--+----+----+--+-++-----++-+-+-++-----++---++-++-+---+------------+---++-+---+++----+-+-+---/ | | | | | | |||| | || | | | /-++----+-++--+--+----+-->-+--+-++-----++-+-+-++-----++>--++-++-+---+------------+---++\| ||| | | | | | | | | | |||| | || | | | | || | || | | | | | || || | | || || || || | | | |||| ||| | | | | | | | | | |||| | || | | | | || | || | | | | \-++-----++-+-+-++-----++---++-++-+---+------------/ |||| ||| /+-+-+------+---+-+-----+-\| | |||| | || | /+--+-+-++----+-++--+--+----+----+----++-----++\| | || || || || | | |||| |||/--++-+-+--\ | | | | || | |||| | || | || | | || | || | | | /--+----++-----++++-+-++-----++---++-++-+---+----------------++++\ |||| || | | | | | | | || | |||| | || | || | | \+----+-++--+--+----+-+--+----++-----++++-+-++-----++---++-+/ | | |||\+--++++--++-+-+--+---+---+-+-----+-++--+--+/|| | || | || | | \----+-++--+--+----+-+--+----++-----++++-+-++-----++---/| | | | ||| | |||| || | | | | /+-+-----+-++--+--+-++-+-\|| | || | | | || | | /+-+--+---\|| |||| \-++-----++----+-+--+---+----------------+++-+--++++--++-+-+--+---+--++-+-----+-++--+--+-++-+-++/ | || | | | || | | || | | ||| |||| || /++----+-+\ | | ||| | |||| || | | | | || | | || | | || | || | || | | | || | |/--++-+--+---+++-----++++---++----+++----+-++-+---+-------\ ||| | |||| || | | | | || \-----+-++--+--+-+/ | || | || | | | || | || || | | ||| |||| || /-+++----+-++-+---+-------+--------+++\| |||| || | | | | || | || | | | | || | || | | | || | || || | | ||| |||| || | ||| | || | | | ||||| /++++--++-+-+--+---+--++------\| || | | | | || | || | | | || | || || | | ||| |||| ||/-+-+++----+-++-+---+-------+--------+++++\||||| || | | | | || || || | | | | || | || | | | || | /++--++-+--+---+++-----++++---+++-+-+++----+-++-+-\ | | /----+++++++++++--++-+-+--+---+--++------++-++--+--+-+--+-++\ | || | | | || | ||| || | | ||| |||| ||| | ||| | || | | | |/--+----+++++++++++--++-+-+--+-\ | || || || | | | | ||| | |\--+-+-------+-++--+-+++>-++-+--+---+++-----++++---+++-+-+++----+-++-+-+-/ /-----++--+----+++++++++++--++-+-+--+-+-+--++------++-++--+--+-+--+\||| | | | | | || | ||| || | /+---+++-----++++---+++\|/+++----+-++-+-+---+-----++--+----+++++++++++--++-+-+--+-+-+--++-\ || || | | | ||||| | | /+-+-------+-++--+\||| |v | || ||| |||| ||||||\++----+-+/ | | | || | ||||||||||| || | | | | | || | || || | | | ||||| | | || | | || ||||| || | || |||/----++++---++++++-++----+-+--+-+---+-----++--+----+++++++++++--++-+-+\ | | | || | || || | | | ||||| | | || | | || ||||| || | || |||| |||| |||||| || | | | | | /--++--+----+++++++++++--++-+-++-+-+-+--++-+----++-++--+--+-+\ ||||| | | /++-+-------+-++--+++++--++-+-++---++++----++++---++++++-++----+-+--+-+---+--+--++--+----+++++++++++--++-+\|| | | | || | || || | | || ||||| | |/+++-+-------+-++--+++++--++-+-++---++++----++++---++++++-++\ | | | | | | || | ||||||||||| || |||| | | | || | || ||/-+--+-++-+++++-\| ||||| | | || ||||| || | || |||| |||| |||||| ||| | | | | | | || | ||||||||||| || |||| | | | ||/+----++-+++-+--+\|| ||||| || ||||| | | || ||||| || | || ||||/---++++---++++++-+++\ | | | | | | || | ||||||||||| || |||| | | | |||| || ||| | |||| ||||| || ||||| | | || ||||| || | || ||||| |||| |||||| |||| | | | | /-+--+-<++--+----+++++++++++--++-++++-+-+-+--++++----++-+++-+--++++-+++++\|| ||||| | | || ||||| || | |\---+++++---+/|| |||||| |||| | | | |/+-+--+--++--+----+++++++++++--++-++++\| | | |||| || ||| | |||| |||||||| ||||| | /-+-++--+++++--++-+-+----+++++---+-++-\ |||||| ||||/-+-+--+-+++-+--+--++--+----+++++++++++\ || |||||| | | |||| || ||| | |||| |||||||| ||||| | | |/++--+++++--++-+-+----+++++---+-++-+-++++++-+++++-+-+--+-+++-+--+--++-\| |||||||||||| || |||||| | | |||| || ||| | |||| |||||||| ||||| | | |||| ||||| || | | ||||| | || | |||||\-+++++-+-+--+-+++-+--+--++-++----++++++++++++-++-++++++-+-+--+++/ || ||| | |||| |||||||| ||||| | | |||| ||||| || | | ||||| /-+-++-+-+++++--+++++-+-+--+-+++-+--+--++-++----++++++++++++-++-++++++\| | ||| || |\+-+--++++-/||||||| ||||| | | |||| ||||| || | | ||||| | | || | ||||| /+++++-+-+--+-+++-+--+--++-++----++++++++++++\|| |||||||| | ||| || | | | |||| ||||||| ||||| | | |||| ||||| /++-+-+----+++++-+-+-++-+-+++++-++++++-+-+--+-+++-+--+--++-++----+++++++++++++++-++++++++-+\ ||| || | | | |||| ||||||| ||||| | | |||| ||||| ||| | | /-+++++-+-+-++-+-+++++-++++++-+-+--+-+++-+--+--++\|| |||||||\+++++++-++/||||| || ||| /--++-+-+-+--++++\ ||||||| ||||| | | |||| \++++-+++-+-+--+-+/||| | | || | ||||| |||||| | | | ||\-+--+--+++++----+++++++-+++++++-++-+++++-++-+++--+--++-+-+-+--+++++-++++/|| ||||| | | |||| |||| ||| | | | | ||| | | || | \++++-++++++-/ | | || | | ||||\----+++++++-+++++++-++-+++++-++-+++--+--++-+-+-+--+++++-+++/ || ||||| | | |||| |||| ||| | | | | ||| | | || | |||| |||||| | | || | | |||| ||||||| ||||||| || ||||| || ||| | || | | | ||||| ||| || ||||| | | |||| |||| ||| | | | | ||| | | || | |||| |||||| | | || | | |||| ||||||\-+++++++-++-+++++-++-+++--+--/| | | v ||||| ||| || ||||| | | |||| |||| ||| |/+--+-+-+++-+-+-++-+--++++-++++++---+-\| || | | |||| |||||| ||||||| || ||||| || ||| | | | | | ||||| ||| || ||||| | | |||| |||| ||| ||| | | ||| | | || | \+++-++++++---+-++-++--+--+--++++-----++++++--+++++++-++-+++++-++-+++--+---/ | | | ||||| ||| || ||||| | | |||| |||| ||| ||| | | ||| | | || | ||| |||||| | || || | | |||| |||||| ||||||| || ||||| || ||| | | | | ||||| ||| || \++++-+-----+-++++---++++-+++-+++--+-+-+++-+-+-/|/+---+++-++++++---+-++-++--+--+\ |||| |||||| ||||||| \+-+++++-++-+++--+-----+-+-+--/|||| ||| || |||| | | |||| /-++++-+++-+++--+-+-+++-+-+--+++---+++-++++++---+-++-++\ | || |||| |||||| ||||||| | ||||| || ||| | | | | |||| ||| || |||| | /-+-++++-+-++++-+++-+++--+-+-+++-+-+--+++---+++-++++++---+-++-+++-+--++-++++-----++++++--+++++++--+-+++++\|| ||| | | | | |||| ||| || |||| | | | |||| | |||| ||| ||| | | ||| | | ||| ||| |||||| | ||/+++-+--++-++++-----++++++--+++++++--+-++++++++-+++--+-----+-+-+---++++-+++\ || |||| | | | |||| | |||| ||| ||| | | ||| | | ||| ||| |||||| \-++++++-+--++-++++-----/||||| ||||||| | |||||||| ||| | | | | |||| |||| || \+++-+---+-+-++++-+-++++-+++-+++--+-+-+++-+-+--+++---+++-+++/|\-----++++++-+--++-++++------+++++--+++/||| | |||||||| ||| | | | | |||| |||| || ||| | | | |||| |/++++-+++-+++-\| | ||| | | ||| ||| ||| | |||||| | || |||| /+++++--+++-+++--+-++++++++-+++--+-----+-+-+--\|||| |||| || ||| | | | |||| |||||| ||| ||| || | ||| | | ||| ||| ||| | |||||| | /++-++++-----++++++--+++-+++--+-++++++++-+++-\| | | \--+++++-++++-+/ ||| | | | |||| |||||| ||| ||| || | ||| | | ||| ||| ||| | |||||| | ||| |||| |||||| ||| ||| | |||||||| ||| || | | ||||| |||| | ||| | | | |||| |||||| |||/+++-++-+-+++-+-+--+++---+++-+++-+------++++++-+-+++-++++-----++++++--+++-+++--+-++++++++-+++\|| | | ||||| |||| | /+++-+---+-+-++++-++++++-+++++++-++-+-+++-+-+--+++---+++-+++-+------++++++-+-+++\|||| |||||| ||| ||| | |||||||| |||||| | \----+++++-++++-/ |||| | | | |||| |||||| ||||||| || | ||| | | ||| ||| ||| | |||||| | |||||||| |||||| ||| |\+--+-++++++++-++++++-----/ ||||| |||| |||| | | | |||| |||||| ||||||| || | ||| | | ||| ||| ||| | ||\+++-+-++++++++-----++++++--+++-+-+--+-++++++++-++++++------------+++++-+++/ |||\-+---+-+-++++-++++/| ||||||| || | ||| | | ||| ||| ||| | || ||| | |||||||| /-++++++-\||| | | | |||||||| |||||| ||||| ||| ||| | | | |||| ||||/+-+++++++-++-+-+++-+-+--+++---+++-+++-+------++-+++-+-++++++++---+-++++++-++++-+-+--+-++++++++-++++++-----\ ||||| ||| ||| | | | |||| |||||| ||||||| || | ||| | | ||| ||| ||| | || ||| | |||||||| | |||||| |||| | | | |||||||| |||||| | /---+++++-+++-\ ||| | | | |||| |\++++-+++++++-/| |/+++-+-+--+++---+++-+++-+------++-+++-+-++++++++---+-++++++-++++-+-+--+-++++++++-++++++-\ | | ||||| ||| | ||| | | | |||| | |||| ||||||| | |||||/+-+--+++---+++-+++-+----\ || |\+-+-++++++++---+-++++++-++++-+-+--+-+/|||||| |||||| | | | ||||| ||| | ||| | | | |||| | |||| ||||\++--+-+++++++-+--+++---+++-+++-+----+-++-+-+-+-++++++++---+-++++/| |||| | | | | |||||| |||||| | | | ||||| ||| | ||| | | | |||| | |||| |||| || | ||||||| | ||| ||| ||| | | || | | | |||||||| | |||| | |||| | | | | |||||| |||||| | | | ||||| ||| | ||| | | | |||| | |||| |||| || | ||||||| | ||| ||| ||| | | || | | | |||||||| | |||| | |||| | | | | |||||| |||||| | | | ||||| ||| | ||| | | | |||| | ||||/++++-++--+-+++++++-+--+++---+++-+++-+----+-++-+-+-+-++++++++---+>++++-+-++++-+-+--+-+\|||||| |||||| | | | ||||| ||| | ||| | | | |||| | ||||||||| || | ||||||\-+--+++---+++-+++-+----+-++-+-+-+-++++++++---+-++++-+-++++-+-+--+-+++/|||| |||||| | | | ||||| ||| | ||| |/--+-+-++++-+-+++++++++-++--+-++++++--+--+++---+++-+++-+----+-++-+-+-+-++++++++---+-++++-+-++++-+-+\ | ||| |||| |||||| | | | ||||| ||| | ||| || | | |||| | ||||||||| || | ||\+++--+--/|| ||| ||| | | || | | | |||||||| | |||| | |||| | || | ||| |||| |||||| | | | ||||| ||| | ||| || | | |||| | ||||||||| || | || ||| | || ||| ||| | | || | | | |||||||| | |||| | |||| | || | ||| |||| |||||| | | | ||||| ||| | \++--++--+-+-++++-+-+++++++++-++--+-++-+++--+---++---+++-+++-+----+-++-+-+-+-+++/|||| | |||| | |||| | || | ||| |||| |||||| | | | ||||| ||| | || || | | |||| | ||||||||| || | || ||| | /-++---+++-+++-+----+-++-+-+-+-+++-++++---+-++++-+\|||| | || | ||| |||| |||||| | | | ||||| ||| | || || |/+-++++-+-+++++++++-++--+-++\||| | | || ||| ||| | | || | | | ||| |||| | |||| |||||| |/++-+-+++-++++-++++++\| | | ||||| ||| | || || |||/++++-+-+++++++++\|| | |||||| | | || ||| ||| | | || | | | |\+-++++---+-++++-++++++-++++-+-+++-++++-++++++++---+--+---+++/| ||| ^ |\--++--++++++++-+-/||||||||||| | |||||| | | || ||| ||| | | || | | | \-+-++++---+-++++-++++++-++++-+-+++-++++-++++/||| | | ||| | ||| | | || |||||||| | ||||||||||| | |||||| | | || ||| |\+-+----+-++-+-+-+---+-++++---+-+/|| |||||| |||| | ||| |||| |||| ||| | \---+++-+-+++-/ | || |||||||| | |||||||||||/-+-++++++--+-+-++---+++-+-+-+----+-++-+-+-+---+-++++---+-+-++-++++++-++++-+-+++-++++-++++-+++--\| ||| | ||| | \+--++++++++-+--++++++++++++-+-++++++--+-+-++---+++-+-+-+----+-++-+-+-+---+-++++---+-+-/| |||||| |||| | ||| |||| |||| ||| || ||| | ||| | | |||||\++-+--++++++++++++-+-++++++--+-+-++---+++-+-+-+----+-++-+-+-+---+-+++/ | | | |||||| |||| | ||| |||| |||| ||| || ||| | ||| | \--+++++-++-+--++++++++++++-+-++++++--+-+-++---+++-+-+-+----+-++-+-+-+---+-+++----+-+--+-++++++-+++/ | ||| |||| |||| ||| || ||| | ||| /-+-------+++++\|| | |||||||||||| | |||||| \-+-++---+++-+-+-+----+-++-+-+-+---+-+++----+-+--+-++++++-+++--+-+++-++++-++++-+++--++------++/ | ||| | | ||||\+++-+--++++++++++++-+-++++++----+-++---+++-+-+-+----+-++-+-+-+---+-+++----+-+--+-++++++-+++--+-+++-++/| |||| ||| || || | ||| | | |||| ||| | |||||||||||| | |||||| | || ||| | \-+----+-++-+-+-+---+-+++----+-+--+-++++++-+++--+-+++-++-+-++++-+++--++------++--+-++/ | | |||| ||| | |||||||||||| | |||||| | || ||| | | | || | | \---+-+++----+-+--+-++++++-+++--+-+++-++-+-++++-+++--++------++--+-/| | | |||| ||| | ||||||||||\+-+-++++++----+-++---+/|/+---+----+\|| | | | ||| | | | |||||| ||\--+-+++-++-+-+/|| ||| || || | | | | |||| ||| | |||||||^|\-+-+-++++++----+-++---+-+++---+----++/| | | | ||| | | | |||||| || /+-+++-++-+-+-++-+++--++----\ || | | | | |||| ||| | ||||||\++--+-+-++++++----+-++---+-+++---+----++-/ | | | ||| | | | |||||| || || ||| || | | || ||| || | || | | | | |||| ||| | |||||| || | | |||||| | || | ||| | || | | | ||| | | | |||||\-++--++-++/ || | \-++-+++--++----+-++--+--/ | | |||| ||| | ||\+++-++--+-+-++++++----+-++---+-+++---+----++---+-+-----+-/|| /--+-+--+-+++++--++--++-++--++-+---++-+++--++---\| || | | | ||\+-+++-+--++-+++-++--+-+-++++++----+-+/ | ||| | || | | | || | | | | ||||| || || || || | || ||| || || || | | | || | ||| | || ||| || \-+-++++++----+-+----+-+++---+----++---+-+-----+--++-+--+-+--+-+++++--++--++-++--++-+---++-+++--/| || || | | | || | ||| | || ||| || | |||||| | | |/+++---+----++---+-+-----+--++-+--+-+--+-+++++--++--++-++--++-+---++-+++---+---++-++--+-----\ | | || | ||| | || ||| || | |||\++----+-+----+++++---+----++---+-+-----+--++-+--+-+--+-+++++--++--++-/| || | || ||| | || || | | | | || | |||/+--++-+++-++----+-+++-++----+-+----+++++---+----++---+-+-----+--++-+--+-+--+-+++++--++--++\ | || | || ||| | || || | | | | || | ||||| || \++-++----+-+++-++----+-+----+++++---+----++---+-+-----+--++-+--+-+--+-+++++--++--+++-/ || | || ||| | || || | | | | || | ||||\--++--++-++----+-+++-++----+-+----+++++---+----++---+-/ | || | | | | ||||| || ||| || | || ||| | || || | | | | |\-+-++++---++--++-++----+-++/ || | \----+++++---+----++---+-------/ || | | | | ||||| || ||| || | || \++---+---++-++--/ | |/+-------+--+-++++---++--++-++----+-++--++\ | ||||| | || | || | | \--+-+++++--++--+++----++-+---++--++---+---++-/| | ||| | | |||| || || || | || ||| | ||\++---+----++---+--->------++-+--+----/ ||||| || ||| || | \+--++---+---++--/ | ||| | | |\++---++--++-++----+-++--+++---+------++-++---+----++---+----------++-+--+------++++/ || ||| || | | || | || | ||| | | | || || || ||/---+-++--+++---+---\ || \+---+----+/ | /-------++\| | |||| || \++----++-+----+--++---+---+/ | ||| | | | \+---++--++-+++---+-++--+++---+---+--++--+---+----+----+--+-------++++--+------+++/ || || || | | || | | | |||/------+--+-+--+---++--++-+++---+-++--+++---+---+--++--+---+--\ | | | |||\--+------+++----++---++----++-+----+--++---+---/ | |||| |/-+-+--+---++--++-+++---+-++--+++---+---+--++--+---+--+-+----+--+\ \++---+------+++----++---++----/| | | || | | |||| || | | | || || ||| | || ||| | | || | | | | | ||/------++---+------+++----++---++-----+-+----+--++---+-----\ | |||| || | | | /++--++-+++---+-++--+++---+---+--++--+---+--+-+----+--+++------++---+------+++<---++---++-----+-+----+--++-\ | | | |||| ||/+-+--+--+++--++-+++\ | || ||| | | || | | | | | ||| || | |||/---++---++-----+-+---\| || | | | | |||| |||| | | ||| \+-++++--+-++--+++---+---+--++--+---+--+-+----+--+++------++---+------++++---++---++-----+-/ || || | | | | |||| |||| | | ||| | |||| | || ||| | | || | | | | | ||| || | |||| || || | || || | | | | |||| |||| | | ||| | |||| | || ||| | | || | | | | | \++------+/ | |||| || || | || || | | | | \+++------++++-/ | ||| | |||| | || |\+---+---+--++--+---+--+-/ | || | | |||| || || | || || | | | | ||| |||| | |\+---+-++++--+-++--+-+---+---+--++--+---+--+------/ || | /+------++++---++---++-----+-----++--++-+-+-----+------\ | ||| |||| | | | | |||| | |\--+-+---+---+--++--+---+--+----------++------+---++------++++---++---++-----+-----++--+/ | | | | | |\+------++++----+--+-+---+-++++--+-+---+-+---+---+--++--+---+--+----------++------+---++------++++---++---/| | || | | | | | | | | |||| | | | \-++++--+-/ | | | | || \---+--+----------++------+---++------++++---/| | | || | | | | | | | | |||| | | | |||| | | | | | || | | || | || |||| | | | || | | | | | | | | |||| | \-+-----++++--+-----+-+---+---+--++------+--+----------++------+---++------++++----+----+-----+-----++--+--/ | | | | | | |||| | | |||| | | | \---+--++------+--+----------++->----+---++------+/|| | | | || | | | | | | | |||| | \-----++++--+-----+-+-------+--++------+--+----------++------+---++------+-++----+----+-----+-----++--+----/ | | | | | |||| \----------++++--+-----+-+-------+--++------+--+----------++------+---++------+-++----+----/ | || | | | | | | |||| |||| | \-+-------+--++------/ | |\------+---++------+-++----+----------+-----++--+----------/ | | | | |||| ||\+--+-------+-------/ \+---------+----------+-------+---++->----/ || | | || | | | | | |||\---------------+/ | | | | | | | || || | | || | | | | | ||\----------------+--/ \-------+-----------+---------+----------+-------/ || || | | || | | | | \------++-----------------+-------------+-----------+---------/ | || || | | || | | | | || | | | | |\--------/\----+----------+-----/| | | | | \+-----------------+-------------+-----------+--------------------+-----------+---------------+----------/ | | | | \-<-------+-----------------+-------------/ | | \---------------+-----------------+--+-----------------/ | \-----------------+-------------------------+--------------------/ | | | | \-------------------------+------------------------------------------------+-----------------/ | | | \--------------------/ | \-------------------------------------------------------------------------------------------/
M src/bin/day13.rs => src/bin/day13.rs +155 -1
@@ 1,1 1,155 @@ fn main() {} use std::ops::AddAssign; use rustc_hash::FxHashSet; static INPUT: &str = "data/day13"; #[derive(Clone, Copy, PartialEq, Eq)] enum Turn { Lf, St, Ri, } #[derive(Clone, Copy, PartialEq, Eq)] enum Dir { Up, Rt, Dn, Lf, } #[derive(Clone, Copy, PartialEq, Eq)] struct Cart { dir: Dir, next: Turn, } impl Cart { fn new(dir: Dir) -> Self { Cart { dir, next: Turn::Lf, } } } #[derive(Clone, Copy, PartialEq, Eq)] enum Point { Horiz, Vert, Inter, TurnSl, TurnFw, None, } impl Dir { fn left(self) -> Self { match self { Dir::Up => Dir::Lf, Dir::Rt => Dir::Up, Dir::Dn => Dir::Rt, Dir::Lf => Dir::Dn, } } fn right(self) -> Self { match self { Dir::Up => Dir::Rt, Dir::Rt => Dir::Dn, Dir::Dn => Dir::Lf, Dir::Lf => Dir::Up, } } } impl AddAssign<Turn> for Dir { fn add_assign(&mut self, oth: Turn) { *self = match oth { Turn::St => *self, Turn::Lf => self.left(), Turn::Ri => self.right(), } } } fn main() { let mut input: Vec<Vec<(Point, Option<Cart>)>> = aoc::file::to_lines(INPUT) .map(|l| l.unwrap().bytes().map(|b| { match b { b'|' => (Point::Vert, None), b'-' => (Point::Horiz, None), b'\\' => (Point::TurnSl, None), b'/' => (Point::TurnFw, None), b'+' => (Point::Inter, None), b'^' => (Point::Vert, Some(Cart::new(Dir::Up))), b'v' => (Point::Vert, Some(Cart::new(Dir::Dn))), b'>' => (Point::Horiz, Some(Cart::new(Dir::Rt))), b'<' => (Point::Horiz, Some(Cart::new(Dir::Lf))), _ => (Point::None, None), } }).collect()).collect(); let mut ncarts: usize = input.iter().map(|i| i.iter().filter(|(_, p)| p.is_some()).count()).sum(); let mut moved: FxHashSet<(usize, usize)> = FxHashSet::default(); let mut p1 = true; let (x, y) = 'outer: loop { moved.clear(); for x in 0..input.len() { for y in 0..input[x].len() { if moved.contains(&(x, y)) { continue; } match input[x][y] { (_, None) => {}, (_, Some(_)) => { let mut cart = input[x][y].1.take().unwrap(); let (a, b) = match cart.dir { Dir::Up => (x - 1, y), Dir::Rt => (x, y + 1), Dir::Dn => (x + 1, y), Dir::Lf => (x, y - 1), }; if input[a][b].1.is_some() { if p1 { println!(" 1: {},{}", b, a); p1 = false; } input[a][b].1 = None; ncarts -= 2; continue; } match input[a][b].0 { Point::Vert | Point::Horiz => {}, Point::TurnSl => cart.dir = match cart.dir { Dir::Up => Dir::Lf, Dir::Rt => Dir::Dn, Dir::Lf => Dir::Up, Dir::Dn => Dir::Rt, }, Point::TurnFw => cart.dir = match cart.dir { Dir::Up => Dir::Rt, Dir::Rt => Dir::Up, Dir::Lf => Dir::Dn, Dir::Dn => Dir::Lf, }, Point::Inter => { cart.dir += cart.next; cart.next = match cart.next { Turn::Lf => Turn::St, Turn::St => Turn::Ri, Turn::Ri => Turn::Lf, }; } _ => unreachable!("{}, {}", x, y), } if ncarts == 1 { break 'outer (a, b); } input[a][b].1 = Some(cart); moved.insert((a, b)); }, } } } }; println!(" 2: {},{}", y, x); }