paper-menger-pairwise-coprimality.rs

1.6 kB · rust · 53 lines

1use mrlycore::errors::Result;2use mrlyfig::board::Frame;3use mrlyfig::{ink, save, Board, Grid};4use mrlymath::three;56fn outline(board: &mut Board, cell: (f64, f64, f64, f64), thick: f64) {7    let (x, y, w, h) = cell;8    board.polyline(9        &[(x, y), (x + w, y), (x + w, y + h), (x, y + h), (x, y)],10        thick,11        ink::line(),12    );13}1415fn main() -> Result<()> {16    let sponge = three::carpet(3, 1)?;17    let types = sponge.types();18    let mut board = Board::square();19    let frame = board.frame(0.08);20    let step = frame.w / 3.0;21    let side = step - 10.0;22    let mut kept = 0usize;23    let mut near = 0usize;24    for c in 0..3 {25        let panel = Frame::new(26            frame.x + c as f64 * step,27            frame.y + c as f64 * step,28            side,29            side,30        );31        let grid = Grid::new(panel, 3, 3, 0.07);32        for a in 0..3 {33            for b in 0..3 {34                let (x, y, w, h) = grid.cell(b, a);35                if types.get(&[a, b, c]) == 0 {36                    outline(&mut board, (x, y, w, h), 4.0);37                    continue;38                }39                kept += 1;40                let zeros = [a, b, c].iter().filter(|value| **value == 0).count();41                if zeros <= 1 {42                    near += 1;43                    board.rect(x, y, w, h, ink::green());44                } else {45                    board.rect(x, y, w, h, ink::dim());46                }47            }48        }49    }50    assert_eq!((kept, near), (20, 13));51    save("paper-menger-pairwise-coprimality", &board)?;52    Ok(())53}