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}