conway_gol/
conway_gol.rs

1use rapl::utils::random::NdarrRand;
2use rapl::*;
3use std::{
4    io::{stdout, Write},
5    thread::sleep,
6    time::Duration,
7};
8const N: usize = 17;
9const STEPS: usize = 100;
10
11fn update(mat: &mut Ndarr<i8, U2>) {
12    let rolls = Ndarr::from([1, 0, -1]);
13    let out = rolls
14        .map(|r| mat.roll(*r, 0))
15        .outer_product(&rolls, |a, r| a.roll(r, 1))
16        .sum();
17    mat.bimap_in_place(&out, |prev, new| {
18        if new == 3 || (prev == 1 && (new == 4)) {
19            1
20        } else {
21            0
22        }
23    })
24}
25
26fn main() {
27    //initialize game matrix with random 0 or 1
28    let mut x = NdarrRand::choose(&[0, 1], [N, N], None);
29    let mut stdout = stdout();
30    stdout.flush().unwrap();
31    stdout.write_all(b"\x1B[2J\x1B[1;1H").unwrap();
32
33    for i in 0..STEPS {
34        update(&mut x); //call update function
35        let vis = x.map(|x| {
36            if *x == 0 {
37                "░".to_string()
38            } else {
39                "█".to_string()
40            }
41        }); //make it pretty
42        println!("{}", vis);
43        println!(
44            "\n Conway's Game of Life using rapl: [Step {} out of {}] \n",
45            i + 1,
46            STEPS
47        );
48        sleep(Duration::from_millis(50));
49        stdout.write_all(b"\x1B[1;1H").unwrap();
50        stdout.flush().unwrap();
51    }
52    stdout.write_all(b"\x1B[2J\x1B[1;1H").unwrap();
53}