~cdv/aoc-2018-rs

0ded1d6dc34ba1517696398e19dfdfd3683fba53 — Christopher Vittal 2 years ago 2c55474 day13
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);
}