research-information.rs

2.5 kB · rust · 86 lines

1use mrlycore::errors::Result;2use mrlycore::Color;3use mrlyfig::board::Frame;4use mrlyfig::{ink, save, Board, Grid};5use mrlymath::two::designs;67const CODE: u128 = 495;8const SPLIT: usize = 9;9const SIDE: usize = SPLIT * SPLIT;1011fn render(level: usize) -> Result<Vec<Vec<bool>>> {12    let cells = designs::create(CODE, 3, level, 0, 3)?;13    let types = cells.types();14    let side = cells.width();15    Ok((0..side)16        .map(|row| (0..side).map(|col| types.get(&[row, col]) != 0).collect())17        .collect())18}1920fn rearrange(cells: &[Vec<bool>]) -> Vec<Vec<bool>> {21    let mut out = vec![vec![false; SIDE]; SIDE];22    for block_row in 0..SPLIT {23        for block_col in 0..SPLIT {24            for row in 0..SPLIT {25                for col in 0..SPLIT {26                    out[block_row * SPLIT + block_col][row * SPLIT + col] =27                        cells[block_row * SPLIT + row][block_col * SPLIT + col];28                }29            }30        }31    }32    out33}3435fn ones(mask: &[Vec<bool>]) -> usize {36    mask.iter().flatten().filter(|on| **on).count()37}3839fn panel(board: &mut Board, frame: Frame, mask: &[Vec<bool>], color: Color) {40    Grid::new(frame, SIDE, SIDE, 0.0).carpet(board, mask, color);41}4243fn main() -> Result<()> {44    let mut board = Board::square();45    let area = board.frame(0.07);46    let gutter = area.w * 0.06;47    let cell = ((area.w - gutter) / 2.0 / SIDE as f64).floor();48    let side = cell * SIDE as f64;49    let left = area.x + (area.w - 2.0 * side - gutter) / 2.0;50    let top = area.y + (area.h - side) / 2.0;5152    let whole = render(4)?;53    let factor = render(2)?;54    assert_eq!(whole.len(), SIDE);55    assert_eq!(factor.len(), SPLIT);56    assert_eq!(ones(&whole), 4096);57    assert_eq!(ones(&factor), 64);5859    let rearranged = rearrange(&whole);60    assert_eq!(rearranged.len(), SIDE);61    assert_eq!(rearranged[0].len(), SIDE);62    assert_eq!(ones(&rearranged), 4096);6364    let vector: Vec<bool> = factor.iter().flatten().copied().collect();65    assert_eq!(vector.len(), SIDE);66    for (row, line) in rearranged.iter().enumerate() {67        for (col, on) in line.iter().enumerate() {68            assert_eq!(*on, vector[row] && vector[col]);69        }70    }7172    panel(73        &mut board,74        Frame::new(left, top, side, side),75        &whole,76        ink::blue(),77    );78    panel(79        &mut board,80        Frame::new(left + side + gutter, top, side, side),81        &rearranged,82        ink::orange(),83    );84    save("research-information", &board)?;85    Ok(())86}