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}