Skip to content

Commit 352b4ec

Browse files
committed
feat: added part 2 or day 7... so hacky
1 parent ea94fae commit 352b4ec

File tree

3 files changed

+111
-99
lines changed

3 files changed

+111
-99
lines changed

day_05/src/bin/main.rs

Lines changed: 9 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,74 +1,17 @@
1-
use ::day_05::{parse_input, program::Program};
1+
use ::day_05::{parse_input, program::exec_without_channels};
22
use std::io::Result;
33

4-
#[allow(dead_code)]
54
fn main() -> Result<()> {
65
let input = parse_input(include_str!("../../../input/day_05"));
7-
let mut program = Program::new(&input[0]);
86

9-
program.new_input(&vec![1]);
10-
program.run();
11-
println!("part_01: {:?}", program.output);
12-
13-
program.new_input(&vec![5]);
14-
program.run();
15-
println!("part_02: {:?}", program.output);
7+
println!(
8+
"part_01: {:?}",
9+
exec_without_channels(input[0].clone(), None)
10+
);
11+
println!(
12+
"part_02: {:?}",
13+
exec_without_channels(input[0].clone(), Some(vec![5]))
14+
);
1615

1716
Ok(())
1817
}
19-
20-
#[cfg(test)]
21-
mod tests {
22-
use super::*;
23-
24-
const EXAMPLE_DATA_FROM_DAY_02: &'static str = "
25-
1,0,0,0,99
26-
2,3,0,3,99
27-
2,4,4,5,99,0
28-
1,1,1,4,99,5,6,0,99
29-
";
30-
31-
const EXAMPLE_DATA_01: &'static str = "
32-
1101,100,-1,4,0
33-
1002,4,3,4,33
34-
";
35-
36-
#[test]
37-
fn it_still_works_with_example_data_from_day_02() {
38-
let input = parse_input(EXAMPLE_DATA_FROM_DAY_02);
39-
40-
let results = input
41-
.iter()
42-
.map(|row| {
43-
let mut program = Program::new(&row);
44-
program.run();
45-
46-
program.memory
47-
})
48-
.collect::<Vec<Vec<i32>>>();
49-
50-
assert_eq!(results[0], [2, 0, 0, 0, 99]);
51-
assert_eq!(results[1], [2, 3, 0, 6, 99]);
52-
assert_eq!(results[2], [2, 4, 4, 5, 99, 9801]);
53-
assert_eq!(results[3], [30, 1, 1, 4, 2, 5, 6, 0, 99]);
54-
}
55-
56-
#[test]
57-
fn examples_for_part_1() {
58-
let input = parse_input(EXAMPLE_DATA_01);
59-
60-
let results = input
61-
.iter()
62-
.map(|row| {
63-
let mut program = Program::new(&row);
64-
program.run();
65-
program
66-
})
67-
.collect::<Vec<Program>>();
68-
69-
assert_eq!(results[0].memory, [1101, 100, -1, 4, 99]);
70-
assert_eq!(results[1].memory, [1002, 4, 3, 4, 99]);
71-
assert_eq!(results[0].output, []);
72-
assert_eq!(results[1].output, []);
73-
}
74-
}

day_05/src/program.rs

Lines changed: 63 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,41 @@
1-
use std::iter::Iterator;
2-
use std::option::Option;
3-
// use std::collections::VecDeque;
1+
use std::{
2+
iter::Iterator,
3+
option::Option,
4+
sync::mpsc::{channel, Receiver, Sender},
5+
thread::{spawn, JoinHandle},
6+
};
47

58
pub struct Program {
69
original_memory: Vec<i32>,
710
pointer: usize,
8-
input_pointer: usize,
9-
input: Vec<i32>,
11+
input: Receiver<i32>,
1012
halted: bool,
13+
output: Sender<i32>,
14+
output_value: i32,
1115
pub memory: Vec<i32>,
12-
pub output: Vec<i32>,
1316
}
1417

1518
impl Program {
1619
pub fn new(memory: &Vec<i32>) -> Program {
20+
let (output, input) = channel();
21+
1722
Program {
1823
original_memory: memory.clone(),
1924
pointer: 0,
20-
input: vec![0],
21-
input_pointer: 0,
25+
output_value: 0,
26+
input,
2227
halted: false,
2328
memory: memory.clone(),
24-
output: Vec::new(),
29+
output,
2530
}
2631
}
2732

28-
pub fn new_input(&mut self, input: &Vec<i32>) {
29-
self.input_pointer = 0;
30-
self.input = input.clone();
33+
pub fn new_input(&mut self, input: Receiver<i32>) {
34+
self.input = input;
35+
}
36+
37+
pub fn new_output(&mut self, output: Sender<i32>) {
38+
self.output = output;
3139
}
3240

3341
pub fn is_halted(&self) -> bool {
@@ -60,12 +68,12 @@ impl Program {
6068
fn mode_3_4(&mut self, opcode: i32) -> usize {
6169
let index = self.get_index(1, true);
6270
if opcode == 3 {
63-
let input = self.input.get(self.input_pointer).unwrap_or(&0);
64-
self.input_pointer += 1;
65-
self.memory[index] = *input;
71+
let input = self.input.recv().unwrap_or(0);
72+
self.memory[index] = input.to_owned();
6673
} else {
6774
let output = self.memory[index].clone();
68-
self.output.push(output);
75+
self.output.send(output.to_owned()).unwrap_or(());
76+
self.output_value = output.to_owned();
6977
};
7078

7179
2
@@ -120,15 +128,15 @@ impl Program {
120128

121129
pub fn run(&mut self) -> i32 {
122130
self.pointer = 0;
123-
self.output = Vec::new();
124-
self.memory = self.original_memory.clone();
131+
self.output_value = 0;
125132
self.halted = false;
133+
self.memory = self.original_memory.clone();
126134

127135
while !self.halted {
128136
self.eval()
129137
}
130138

131-
*self.output.last().unwrap_or(&0i32)
139+
self.output_value.to_owned()
132140
}
133141

134142
fn eval(&mut self) {
@@ -151,7 +159,42 @@ impl Program {
151159
3 | 4 => self.mode_3_4(opcode),
152160
5 | 6 => self.mode_5_6(opcode, positional_first, positional_second),
153161
7 | 8 => self.mode_7_8(opcode, positional_first, positional_second),
154-
_ => panic!("opcode: {}", opcode),
162+
9 => {
163+
self.halted = true;
164+
0
165+
}
166+
_ => panic!("[{}], opcode: {}", self.pointer, opcode),
155167
};
156168
}
157169
}
170+
171+
pub fn exec(memory: Vec<i32>, input: Receiver<i32>, output: Sender<i32>) -> JoinHandle<i32> {
172+
spawn(move || {
173+
let mut program = Program::new(&memory);
174+
program.new_input(input);
175+
program.new_output(output);
176+
program.run()
177+
})
178+
}
179+
180+
pub fn exec_without_channels(memory: Vec<i32>, input: Option<Vec<i32>>) -> i32 {
181+
let (c_out, c_in) = channel();
182+
match input {
183+
Some(input) => {
184+
for seq in input.clone() {
185+
c_out.send(seq).unwrap();
186+
}
187+
}
188+
None => {
189+
c_out.send(0).unwrap();
190+
}
191+
};
192+
spawn(move || {
193+
let mut program = Program::new(&memory);
194+
program.new_input(c_in);
195+
program.new_output(c_out);
196+
program.run()
197+
})
198+
.join()
199+
.unwrap()
200+
}

day_07/src/main.rs

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,65 @@
11
extern crate day_05;
22
extern crate permute;
33

4-
use day_05::{parse_input, program::Program};
4+
use day_05::{
5+
parse_input,
6+
program::{exec, exec_without_channels},
7+
};
58
use permute::permute;
9+
use std::{iter::Iterator, sync::mpsc::channel};
610

711
fn part_01(sequence: &Vec<i32>, memory: &Vec<i32>) -> i32 {
8-
let mut program = Program::new(&memory);
912
let mut input = vec![0];
1013
for signal in sequence {
1114
input.insert(0, signal.to_owned());
12-
program.new_input(&input);
13-
input.insert(0, program.run());
15+
input.insert(
16+
0,
17+
exec_without_channels(memory.clone(), Some(input.clone())),
18+
)
1419
}
1520
input[0]
1621
}
1722

23+
fn part_02(sequence: &Vec<i32>, memory: &Vec<i32>) -> i32 {
24+
let mut seq = sequence.to_owned();
25+
let mut iter = seq.iter_mut();
26+
27+
let (e_out, a_in) = channel();
28+
let (a_out, b_in) = channel();
29+
let (b_out, c_in) = channel();
30+
let (c_out, d_in) = channel();
31+
let (d_out, e_in) = channel();
32+
33+
e_out.send(*iter.next().unwrap()).unwrap();
34+
a_out.send(*iter.next().unwrap()).unwrap();
35+
b_out.send(*iter.next().unwrap()).unwrap();
36+
c_out.send(*iter.next().unwrap()).unwrap();
37+
d_out.send(*iter.next().unwrap()).unwrap();
38+
e_out.send(0).unwrap();
39+
40+
exec(memory.clone(), a_in, a_out);
41+
exec(memory.clone(), b_in, b_out);
42+
exec(memory.clone(), c_in, c_out);
43+
exec(memory.clone(), d_in, d_out);
44+
exec(memory.clone(), e_in, e_out).join().unwrap()
45+
}
46+
1847
fn main() {
1948
let input = parse_input(include_str!("../../input/day_07"));
2049
let answer_part_01 = permute((0..=4).collect())
2150
.into_iter()
2251
.map(|sequence| part_01(&sequence, &input[0]))
2352
.max()
24-
.unwrap();
53+
.unwrap_or(0);
2554

26-
permute((5..=9).collect())
55+
let answer_part_02 = permute((5..=9).collect())
2756
.into_iter()
28-
.for_each(|_sequence| {});
57+
.map(|sequence| part_02(&sequence, &input[0]))
58+
.max()
59+
.unwrap_or(0);
2960

30-
// println!("part_02: {:?}", answer_part_02);
3161
println!("part_01: {:?}", answer_part_01);
62+
println!("part_02: {:?}", answer_part_02);
3263
}
3364

3465
#[cfg(test)]
@@ -41,11 +72,6 @@ mod tests {
4172
3,31,3,32,1002,32,10,32,1001,31,-2,31,1007,31,0,33,1002,33,7,33,1,33,31,31,1,32,31,31,4,31,99,0,0,0
4273
";
4374

44-
const EXAMPLES_FOR_PART_02: &'static str = "
45-
3,26,1001,26,-4,26,3,27,1002,27,2,27,1,27,26,27,4,27,1001,28,-1,28,1005,28,6,99,0,0,5
46-
3,31,3,32,1002,32,10,32,1001,31,-2,31,1007,31,0,33,1002,33,7,33,1,33,31,31,1,32,31,31,4,31,99,0,0,0
47-
";
48-
4975
#[test]
5076
fn it_gets_the_examples_right_on_part_01() {
5177
let input = parse_input(&EXAMPLES_FOR_PART_01);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy