summaryrefslogtreecommitdiff
path: root/src/day10.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/day10.rs')
-rw-r--r--src/day10.rs85
1 files changed, 85 insertions, 0 deletions
diff --git a/src/day10.rs b/src/day10.rs
new file mode 100644
index 0000000..9e63802
--- /dev/null
+++ b/src/day10.rs
@@ -0,0 +1,85 @@
+use std::ops::Add;
+
+fn cycles(op: &str) -> usize {
+ match op {
+ "noop" => 1,
+ "addx" => 2,
+ unk => panic!("unknown op {}", unk)
+ }
+}
+
+fn op_and_args(instruction: &str) -> (&str, Option<i32>) {
+ let mut toks = instruction.split_whitespace();
+ let op = toks.next().expect("expected an operator!");
+ let arg = match op {
+ "noop" => None,
+ "addx" => {
+ let arg1: i32 = toks.next().expect("expected one arg for addx").parse().expect("arg for addx must be i32");
+ Some(arg1)
+ },
+ unk => panic!("unknown op {}", unk)
+ };
+ (op,arg)
+}
+
+fn apply(op: &str, arg: Option<i32>, x: i32) -> i32 {
+ match op {
+ "noop" => x,
+ "addx" => x + arg.expect("addx had no argument!"),
+ unk => panic!("unknown op {}", unk)
+ }
+}
+
+pub fn run(input: String) {
+ let mut lines = input.lines().into_iter();
+ // our (single) register
+ let mut x = 1;
+ let mut tick = 1;
+ let first_instruction: &str = lines.next().expect("expected a first instruction!");
+ let (mut op, mut arg) = op_and_args(first_instruction);
+ let mut circ = cycles(op);
+ //let mut sss = 0;
+ let mut screen = "".to_owned();
+ loop {
+ // Start of cycle, Load next instruction
+ if circ == 0 {
+ if let Some(next_inst) = lines.next() {
+ (op, arg)= op_and_args(next_inst);
+ circ = cycles(op);
+ } else {
+ break;
+ }
+ }
+ // Time passes....
+ circ -= 1;
+
+ // Pt1, signal strength
+ // if (tick + 20) % 40 == 0 {
+ // let ss = tick*x;
+ // //println!("tick {} x {} ss {}", tick, x, ss);
+ // sss += ss;
+ // }
+
+ // Pt2, Draw pixels! note crt_col is one less(!) than tick
+ let crt_col = (tick-1) % 40;
+ //println!("tick {} x {} crt_col {}", tick, x, crt_col);
+ screen = screen.add(if crt_col >= (x-1) && crt_col <= (x+1) {
+ "#"
+ } else {
+ "."
+ });
+ if crt_col == 39 {
+ screen = screen.add("\n");
+ }
+
+ // End of cycle, apply instruction
+ if circ == 0 {
+ x = apply(op, arg, x);
+ }
+ // increase cycle counter
+ tick += 1;
+ }
+ //println!("Day 10: {}",sss);
+ println!("Day 10:");
+ print!("{}", screen);
+} \ No newline at end of file