research-cobham.rs

1.7 kB · rust · 59 lines

1use mrlycore::errors::Result;2use mrlyfig::board::Frame;3use mrlyfig::{ink, save, Board, Grid};45const M: u32 = 5;6const K: u32 = 7;7const PX: f64 = 6.0;89fn in_base2_gasket(x: u32, y: u32) -> bool {10    x & y == 011}1213fn in_base3_gasket(mut x: u32, mut y: u32) -> bool {14    while x > 0 || y > 0 {15        if x % 3 > 1 || y % 3 > 1 || (x % 3 == 1 && y % 3 == 1) {16            return false;17        }18        x /= 3;19        y /= 3;20    }21    true22}2324fn main() -> Result<()> {25    let mut board = Board::square();26    let side = 2usize.pow(K);27    assert!(side > (3usize.pow(M) - 1) / 2);28    let edge = side as f64 * PX;29    let area = Frame::new(30        ((board.width as f64 - edge) / 2.0).round(),31        ((board.height as f64 - edge) / 2.0).round(),32        edge,33        edge,34    );35    let grid = Grid::new(area, side, side, 0.0);36    let (mut b, mut both, mut axes) = (0usize, 0usize, 0usize);37    for row in 0..side {38        for col in 0..side {39            let (x, y) = (col as u32, (side - 1 - row) as u32);40            let a = in_base2_gasket(x, y);41            let in_b = in_base3_gasket(x, y);42            b += in_b as usize;43            both += (a && in_b) as usize;44            axes += (a && in_b && (x == 0 || y == 0)) as usize;45            let tone = match (a, in_b) {46                (true, true) => ink::yellow(),47                (false, true) => ink::blue(),48                (true, false) => ink::fade(ink::dim(), 0.45),49                (false, false) => continue,50            };51            grid.fill(&mut board, col, row, tone);52        }53    }54    assert_eq!(b, 3usize.pow(M));55    assert_eq!(both, 111);56    assert_eq!(axes, 2usize.pow(M + 1) - 1);57    save("research-cobham", &board)?;58    Ok(())59}