demo-words.rs
1.9 kB · rust · 64 lines
1use mrlycore::errors::Result;2use mrlyfig::{ink, save, Board};3use mrlymath::bang::{magic, MagicLayer};4use mrlymath::name::Bang;5use mrlymath::two;67const SIDE: usize = 105;8const UNIT: f64 = 8.0;910fn main() -> Result<()> {11 let mut board = Board::square();12 let letters = [13 MagicLayer::new(Bang::new(7, 2, 2), 3),14 MagicLayer::new(Bang::new(14, 2, 2), 7),15 MagicLayer::new(Bang::new(9, 2, 2), 5),16 ];17 let first = two::create(7, 3, 1, 0, 2)?;18 let pair = magic(&letters[..2])?;19 let whole = magic(&letters)?;20 assert_eq!(first.width(), 3);21 assert_eq!(pair.shape, vec![21, 21]);22 assert_eq!(whole.shape, vec![SIDE, SIDE]);23 let single = first.types();24 let mut depth = vec![0usize; SIDE * SIDE];25 let mut census = [0usize; 4];26 for row in 0..SIDE {27 for col in 0..SIDE {28 let mut deep = 0usize;29 if single.get(&[row / 35, col / 35]) != 0 {30 deep += 1;31 if pair.get(&[row / 5, col / 5]) != 0 {32 deep += 1;33 if whole.get(&[row, col]) != 0 {34 deep += 1;35 }36 }37 }38 depth[row * SIDE + col] = deep;39 census[deep] += 1;40 }41 }42 assert_eq!(census, [1225, 3200, 3168, 3432]);43 assert_eq!(census.iter().sum::<usize>(), SIDE * SIDE);44 let tones = [ink::line(), ink::dim(), ink::blue()];45 let span = SIDE as f64 * UNIT;46 let edge = (board.width as f64 - span) / 2.0;47 for row in 0..SIDE {48 for col in 0..SIDE {49 let deep = depth[row * SIDE + col];50 if deep == 0 {51 continue;52 }53 board.rect(54 edge + col as f64 * UNIT,55 edge + row as f64 * UNIT,56 UNIT,57 UNIT,58 tones[deep - 1],59 );60 }61 }62 save("demo-words", &board)?;63 Ok(())64}