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}