useaoc_runner_derive::{aoc,aoc_generator};usestd::cmp::Ordering;#[derive(Debug)]enumDirection{East,West,North,South,Left,Right,Forward,}structCommand{direction:Direction,measure:usize,}#[aoc_generator(day12)]fnparse_input_day12(input:&str)->Vec<Command>{input.lines().map(|l|Command{direction:matchl.chars().next(){Some('F')=>Direction::Forward,Some('N')=>Direction::North,Some('S')=>Direction::South,Some('E')=>Direction::East,Some('W')=>Direction::West,Some('L')=>Direction::Left,Some('R')=>Direction::Right,_=>panic!("Invalid direction!"),},measure:str::parse(&l[1..]).expect("Unable to parse measure"),}).collect()}fnmanhattan_distance(point_1:&(isize,isize),point_2:&(isize,isize))->usize{((point_1.0-point_2.0).abs()+(point_1.1-point_2.1).abs())asusize}fnmove_ship(position:&mut(isize,isize),direction:&Direction,distance:usize){match*direction{Direction::North=>{position.1+=distanceasisize;}Direction::South=>{position.1-=distanceasisize;}Direction::East=>{position.0-=distanceasisize;}Direction::West=>{position.0+=distanceasisize;}_=>panic!("cannot move in specified Direction {:?}",direction),}}fnangle_lookup(direction:&Direction)->usize{matchdirection{Direction::North=>270,Direction::South=>90,Direction::East=>0,Direction::West=>180,_=>panic!("not a cardinal direction"),}}fndirection_lookup(angle:usize)->Direction{matchangle{0=>Direction::East,90=>Direction::South,180=>Direction::West,270=>Direction::North,_=>panic!("invalid angle"),}}fnturn_ship(orientation:&mutDirection,command:&Command){letmutdegree:isize=matchcommand.direction{Direction::Left=>-1*command.measureasisize,Direction::Right=>command.measureasisize,_=>panic!("cannot turn with specified Direction {:?}",command.direction),};letmutcurrent_angle=angle_lookup(orientation)asisize;whiledegree!=0{ifdegree<0{current_angle-=90;degree+=90;}else{current_angle+=90;degree-=90;}}letfinal_angle:usize=matchcurrent_angle.cmp(&0){Ordering::Less=>(current_angle%360)+360,_=>current_angle%360,}asusize;*orientation=direction_lookup(final_angle);}#[aoc(day12,part1)]fnget_travel_distance(input:&Vec<Command>)->usize{letorigin=(0,0);letmutposition=(0,0);letmutorientation=Direction::East;input.iter().for_each(|cmd|matchcmd.direction{Direction::North|Direction::South|Direction::East|Direction::West=>{move_ship(&mutposition,&cmd.direction,cmd.measure);}Direction::Forward=>{move_ship(&mutposition,&orientation,cmd.measure);}Direction::Left|Direction::Right=>{turn_ship(&mutorientation,&cmd);}});manhattan_distance(&origin,&position)}fnmove_waypoint(waypoint:&mut(isize,isize),cmd:&Command){matchcmd.direction{Direction::East=>waypoint.0+=cmd.measureasisize,Direction::West=>waypoint.0-=cmd.measureasisize,Direction::North=>waypoint.1+=cmd.measureasisize,Direction::South=>waypoint.1-=cmd.measureasisize,_=>panic!("Not a move Direction"),}}fnrotate_waypoint(waypoint:&mut(isize,isize),cmd:&Command){letangle=matchcmd.direction{Direction::Left=>((-1*cmd.measureasisize)+360)asusize,Direction::Right=>cmd.measure,_=>panic!("Not a rotational direction"),};matchangle{0=>(),270=>{letnew_x=-1*waypoint.1;letnew_y=waypoint.0;waypoint.0=new_x;waypoint.1=new_y;}180=>{waypoint.0=-1*waypoint.0;waypoint.1=-1*waypoint.1;}90=>{letnew_x=waypoint.1;letnew_y=-1*waypoint.0;waypoint.0=new_x;waypoint.1=new_y;}_=>panic!("invalid angle"),}}fnmove_ship_toward_waypoint(position:&mut(isize,isize),waypoint:&(isize,isize),times:usize,){for_in0..times{position.0+=waypoint.0;position.1+=waypoint.1;}}#[aoc(day12,part2)]fnget_travel_waypoint_distance(input:&Vec<Command>)->usize{letorigin=(0,0);letmutwaypoint=(10,1);letmutposition=(0,0);input.iter().for_each(|cmd|{matchcmd.direction{Direction::North|Direction::South|Direction::East|Direction::West=>{move_waypoint(&mutwaypoint,cmd);}Direction::Forward=>{move_ship_toward_waypoint(&mutposition,&waypoint,cmd.measure);}Direction::Left|Direction::Right=>rotate_waypoint(&mutwaypoint,&cmd),}});manhattan_distance(&origin,&position)}
For further actions, you may consider blocking this person and/or reporting abuse
We're a place where coders share, stay up-to-date and grow their careers.
Got through this one fairly quickly (problem sat well with how my mind works, I guess).
As always, on Github.