wiki-cellular-automaton.rs
1.3 kB · rust · 45 lines
1use mrlycore::errors::Result;2use mrlyfig::{ink, save, Board};3use mrlymath::life::elementary;45const RULE: u8 = 90;6const STEPS: usize = 63;78fn main() -> Result<()> {9 let mut board = Board::square();10 let area = board.frame(0.08);11 let rows = STEPS + 1;12 let window = 2 * STEPS + 1;13 let diagram = elementary::single_seed(RULE, STEPS);14 assert_eq!(diagram.shape, vec![rows, window]);1516 let mut live = 0usize;17 for t in 0..rows {18 for c in 0..window {19 if diagram.at(t * window + c) != 0 {20 live += 1;21 }22 }23 }24 assert_eq!(live, 729);2526 let scale = (area.w / window as f64).min(area.h / rows as f64);27 let ox = (board.width as f64 - window as f64 * scale) / 2.0;28 let oy = (board.height as f64 - rows as f64 * scale) / 2.0;29 let gap = scale * 0.12;30 for t in 0..rows {31 for c in 0..window {32 if diagram.at(t * window + c) != 0 {33 board.rect(34 ox + c as f64 * scale + gap,35 oy + t as f64 * scale + gap,36 scale - 2.0 * gap,37 scale - 2.0 * gap,38 ink::yellow(),39 );40 }41 }42 }43 save("wiki-cellular-automaton", &board)?;44 Ok(())45}