feat(nandu): brought the algorithm into a working state

This commit is contained in:
antifallobst 2023-09-19 18:56:13 +02:00
parent 18f419dfe5
commit 2c379dcfd8
Signed by: antifallobst
GPG Key ID: 2B4F402172791BAF
2 changed files with 45 additions and 8 deletions

View File

@ -3,6 +3,7 @@ mod nandu;
use anyhow::Result; use anyhow::Result;
use clap::Parser; use clap::Parser;
use nandu::Environment; use nandu::Environment;
use std::arch::x86_64::_mm256_stream_pd;
use std::path::Path; use std::path::Path;
#[derive(Parser, Debug)] #[derive(Parser, Debug)]
@ -18,7 +19,9 @@ fn main() -> Result<()> {
let env = Environment::new(Path::new(&args.file))?; let env = Environment::new(Path::new(&args.file))?;
println!("{:#?}", env); let state = env.simulate(vec![false, false])?;
println!("State: {:?}", state);
Ok(()) Ok(())
} }

View File

@ -7,9 +7,9 @@ use std::path::Path;
#[derive(Debug)] #[derive(Debug)]
pub struct Environment { pub struct Environment {
state: Vec<bool>, // A bitmap would be more efficient, but nah, we have these resources xD
logic: Vec<Vec<Option<Gate>>>, logic: Vec<Vec<Option<Gate>>>,
sources: Vec<(usize, usize)>, sources: usize,
width: usize,
} }
impl Environment { impl Environment {
@ -25,9 +25,9 @@ impl Environment {
}; };
let mut env = Self { let mut env = Self {
state: vec![false; width],
logic: vec![Vec::new(); height], logic: vec![Vec::new(); height],
sources: Vec::new(), sources: 0,
width,
}; };
for (y, line) in data.lines().filter(|x| !x.is_empty()).enumerate() { for (y, line) in data.lines().filter(|x| !x.is_empty()).enumerate() {
@ -35,6 +35,7 @@ impl Environment {
for (x, field) in line.split(" ").filter(|x| !x.is_empty()).enumerate() { for (x, field) in line.split(" ").filter(|x| !x.is_empty()).enumerate() {
if field.contains("Q") { if field.contains("Q") {
env.logic[y].push(Some(Gate::Source)); env.logic[y].push(Some(Gate::Source));
env.sources += 1;
skip = false; skip = false;
} else if field.contains("L") { } else if field.contains("L") {
env.logic[y].push(Some(Gate::Led)); env.logic[y].push(Some(Gate::Led));
@ -48,8 +49,8 @@ impl Environment {
skip = true; skip = true;
match field { match field {
"" => continue, "" => continue,
"r" => env.logic[y].push(Some(Gate::NotLeft)), "r" => env.logic[y].push(Some(Gate::NotRight)),
"R" => env.logic[y].push(Some(Gate::NotRight)), "R" => env.logic[y].push(Some(Gate::NotLeft)),
"W" => env.logic[y].push(Some(Gate::Nand)), "W" => env.logic[y].push(Some(Gate::Nand)),
"B" => env.logic[y].push(Some(Passthrough)), "B" => env.logic[y].push(Some(Passthrough)),
c => { c => {
@ -61,7 +62,40 @@ impl Environment {
} }
} }
} }
Ok(env) Ok(env)
} }
pub fn sources(&self) -> usize {
self.sources
}
pub fn simulate(&self, sources: Vec<bool>) -> Result<Vec<bool>> {
let mut state = vec![false; self.width];
let mut source_index = 0usize;
for row in &self.logic {
let mut x = 0usize;
for field in row {
match field {
Some(g) => match g {
Gate::Source => {
state[x] = sources[source_index];
source_index += 1;
}
Gate::Led => (),
_ => {
(state[x], state[x + 1]) = g.compute(state[x], state[x + 1]);
x += 1;
}
},
None => state[x] = false,
}
x += 1;
}
// println!("{:?}", state);
}
Ok(state)
}
} }