demo-carry.rs
1.7 kB · rust · 48 lines
1use mrlycore::errors::Result;2use mrlyfig::{ink, save, Board, Frame, Grid, Ramp};3use mrlymath::dim::carry;45const BASES: [usize; 2] = [3, 5];6const DIMS: [usize; 8] = [2, 3, 4, 5, 6, 7, 8, 9];78fn main() -> Result<()> {9 let mut board = Board::square();10 let area = board.frame(0.08);11 let panels = Grid::new(area, 4, 4, 0.05);12 assert_eq!(carry::cap(3)?, 15);13 assert_eq!(carry::cap(5)?, 11);14 assert_eq!(carry::even_block(3, 3)?, vec![vec![6, 6], vec![1, 3]]);15 let mut drawn = 0usize;16 for (turn, base) in BASES.iter().enumerate() {17 let ramp = Ramp::tone(18 ink::line(),19 if *base == 3 {20 ink::yellow()21 } else {22 ink::blue()23 },24 );25 for (step, dimension) in DIMS.iter().enumerate() {26 let block = carry::even_block(*base, *dimension)?;27 let width = block.len();28 assert_eq!(width, dimension.div_ceil(2));29 let slot = turn * DIMS.len() + step;30 let (x, y, w, h) = panels.cell(slot % 4, slot / 4);31 let cells = Grid::new(Frame::new(x, y, w, h), width, width, 0.06);32 let peak = block33 .iter()34 .flatten()35 .fold(0.0f64, |top, &value| top.max(value as f64));36 for (row, line) in block.iter().enumerate() {37 for (col, &value) in line.iter().enumerate() {38 let t = (1.0 + value as f64).ln() / (1.0 + peak).ln();39 cells.fill(&mut board, col, row, ramp.at(t));40 drawn += 1;41 }42 }43 }44 }45 assert_eq!(drawn, 168);46 save("demo-carry", &board)?;47 Ok(())48}