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}