use aoc2019::*; use std::io; use std::io::prelude::*; use std::process; use structopt::StructOpt; #[derive(Debug, StructOpt)] #[structopt(name = "Day 17: Set and Forget")] /// Pilots a vacuum robot around on a scaffold. What could go wrong? /// /// See https://adventofcode.com/2019/day/17 for details. struct Opt { /// Draw the map and exit #[structopt(short = "d")] draw_map: bool, } fn main() { let stdin = io::stdin(); let opt = Opt::from_args(); let program: IntcodeProgram = stdin .lock() .split(b',') .map(|x| exit_on_failed_assertion(x, "Error reading input")) .map(|x| exit_on_failed_assertion(String::from_utf8(x), "Input was not valid UTF-8")) .map(|x| exit_on_failed_assertion(x.trim().parse::(), "Invalid number")) .collect::(); let result = exit_on_failed_assertion( if opt.draw_map { program.execute() } else { // L,12,L,8,R,10,R,10,L,6,L,4,L,12,L,12,L,8,R,10,R,10,L,6,L,4,L,12,R,10,L,8,L,4,R,10,L,6,L,4,L,12,L,12,L,8,R,10,R,10,R,10,L,8,L,4,R,10,L,6,L,4,L,12,R,10,L,8,L,4,R,10 // | | || let input = vec![ "A,B,A,B,C,B,A,C,B,C\n", "L,12,L,8,R,10,R,10\n", "L,6,L,4,L,12\n", "R,10,L,8,L,4,R,10\n", "y\n", ]; program .with_mem_0(Intcode::from(2)) .with_input( input .iter() .flat_map(|line| line.chars().map(|c| Intcode::from(c as u8))) .collect(), ) .execute() }, "Program failed", ); println!( "{}", result .drop_last() .unwrap() .iter() .flat_map(|c| c.to_signed_bytes_be()) .map(|c| c as char) .collect::() ); println!("{}", result.last().unwrap()); } fn exit_on_failed_assertion(data: Result, message: &str) -> A { match data { Ok(data) => data, Err(e) => { eprintln!("{}: {}", message, e); process::exit(1); } } }