research-automata.rs
1.7 kB · rust · 60 lines
1use mrlycore::errors::Result;2use mrlycore::Color;3use mrlyfig::{ink, save, Board};4use mrlymath::life::elementary;56const CENSUS: usize = 16;7const STEPS: usize = 31;8const WINDOW: usize = 63;9const CROP: usize = 48;10const FAINT: f64 = 0.5;1112fn tone(rule: u8) -> Color {13 if elementary::rule_degree(rule) == 1 {14 ink::yellow()15 } else if elementary::surjective(rule) {16 ink::blue()17 } else {18 ink::fade(ink::dim(), FAINT)19 }20}2122fn main() -> Result<()> {23 let mut board = Board::square();24 let area = board.frame(0.08);25 let rows = STEPS + 1;26 let pitch = area.w / CENSUS as f64;27 let rise = (pitch - rows as f64) / 2.0;28 let left = (WINDOW - CROP) / 2;2930 let mut affine = 0usize;31 let mut surjective = 0usize;32 let mut panels = 0usize;33 for rule in 0..=255u8 {34 let color = tone(rule);35 if elementary::rule_degree(rule) == 1 {36 affine += 1;37 }38 if elementary::surjective(rule) {39 surjective += 1;40 }41 let diagram = elementary::single_seed(rule, STEPS);42 assert_eq!(diagram.shape, vec![rows, WINDOW]);43 let ox = (area.x + (rule as usize % CENSUS) as f64 * pitch).round();44 let oy = (area.y + (rule as usize / CENSUS) as f64 * pitch + rise).round();45 for t in 0..rows {46 for c in 0..CROP {47 if diagram.at(t * WINDOW + left + c) != 0 {48 board.rect(ox + c as f64, oy + t as f64, 1.0, 1.0, color);49 }50 }51 }52 panels += 1;53 }54 assert_eq!(panels, 256);55 assert_eq!(affine, 14);56 assert_eq!(surjective, 30);57 assert_eq!(surjective - affine, 16);58 save("research-automata", &board)?;59 Ok(())60}