Repair Day 19 solutions.
This commit is contained in:
@@ -10,6 +10,7 @@ mod repair;
|
|||||||
mod robot;
|
mod robot;
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod scaffold;
|
mod scaffold;
|
||||||
|
#[cfg(test)]
|
||||||
mod tractor;
|
mod tractor;
|
||||||
mod wiremap;
|
mod wiremap;
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
use crate::endchannel::channel;
|
|
||||||
use crate::machine::Computer;
|
use crate::machine::Computer;
|
||||||
use std::thread;
|
|
||||||
|
|
||||||
struct TractorMap {
|
struct TractorMap {
|
||||||
base_computer: Computer,
|
base_computer: Computer,
|
||||||
@@ -11,29 +9,24 @@ struct TractorMap {
|
|||||||
|
|
||||||
impl TractorMap {
|
impl TractorMap {
|
||||||
fn new(file: &str, side_size: usize) -> TractorMap {
|
fn new(file: &str, side_size: usize) -> TractorMap {
|
||||||
let base_computer = Computer::load(file, 0);
|
let base_computer = Computer::load(file);
|
||||||
let mut result = Vec::with_capacity(side_size * side_size);
|
let mut result = Vec::with_capacity(side_size * side_size);
|
||||||
let mut affected = 0;
|
let mut affected = 0;
|
||||||
|
|
||||||
result.resize(side_size * side_size, false);
|
result.resize(side_size * side_size, false);
|
||||||
for x in 0..side_size {
|
for x in 0..side_size {
|
||||||
for y in 0..side_size {
|
for y in 0..side_size {
|
||||||
let mut computer = base_computer.clone();
|
let computer = base_computer.clone();
|
||||||
let ( mysend, mut corecv) = channel();
|
let results = computer.standard_run(&[x as i64, y as i64]);
|
||||||
let (mut cosend, mut myrecv) = channel();
|
assert_eq!(results.len(), 1);
|
||||||
|
match results[0] {
|
||||||
mysend.send(x as i64);
|
0 => {},
|
||||||
mysend.send(y as i64);
|
1 => {
|
||||||
computer.run(&mut corecv, &mut cosend);
|
|
||||||
match myrecv.recv() {
|
|
||||||
None => panic!("Uh-oh, computer broken!"),
|
|
||||||
Some(0) => {}
|
|
||||||
Some(1) => {
|
|
||||||
affected += 1;
|
affected += 1;
|
||||||
let idx = (y * side_size) + x;
|
let idx = (y * side_size) + x;
|
||||||
result[idx] = true;
|
result[idx] = true;
|
||||||
}
|
}
|
||||||
Some(x) => panic!("Weird value {}", x),
|
_ => panic!("Weird value {}", x),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -47,14 +40,9 @@ impl TractorMap {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn ask(&self, x: usize, y: usize) -> bool {
|
fn ask(&self, x: usize, y: usize) -> bool {
|
||||||
let mut computer = self.base_computer.clone();
|
let computer = self.base_computer.clone();
|
||||||
let ( mysend, mut corecv) = channel();
|
let mut results = computer.standard_run(&[x as i64, y as i64]);
|
||||||
let (mut cosend, mut myrecv) = channel();
|
match results.pop() {
|
||||||
|
|
||||||
mysend.send(x as i64);
|
|
||||||
mysend.send(y as i64);
|
|
||||||
computer.run(&mut corecv, &mut cosend);
|
|
||||||
match myrecv.recv() {
|
|
||||||
None => panic!("Uh-oh, computer broken!"),
|
None => panic!("Uh-oh, computer broken!"),
|
||||||
Some(0) => false,
|
Some(0) => false,
|
||||||
Some(1) => true,
|
Some(1) => true,
|
||||||
|
|||||||
Reference in New Issue
Block a user