research-bijection.rs
1.5 kB · rust · 46 lines
1use mrlycore::errors::Result;2use mrlyfig::{ink, save, Board};3use mrlymath::bang;45const CENSUS: usize = 16;6const STAMP_COLS: usize = 4;7const STAMP_ROWS: usize = 2;89fn main() -> Result<()> {10 let mut board = Board::square();11 let area = board.frame(0.08);12 let universe = bang::bang(3);13 assert_eq!(universe.total, 256);14 assert_eq!(universe.distinct(), 22);15 assert_eq!(bang::counting::distinct_designs(3)?, 22);16 assert_eq!(bang::corners(3).len(), 8);1718 let pitch = area.w / CENSUS as f64;19 let bit = pitch * 0.84 / STAMP_COLS as f64;20 let band = bit * (STAMP_ROWS as f64 + 1.0);21 let top = area.y + (area.h - band * CENSUS as f64) / 2.0;22 let pad = bit * 0.10;23 let mut gold = 0usize;24 for code in 0..256u128 {25 let design = universe.design(code);26 let color = if design.canonical {27 gold += 1;28 ink::yellow()29 } else {30 ink::blue()31 };32 let ox = area.x + (code as usize % CENSUS) as f64 * pitch + (pitch - bit * 4.0) / 2.0;33 let oy = top + (code as usize / CENSUS) as f64 * band + bit / 2.0;34 for slot in 0..8usize {35 if (code >> slot) & 1 == 0 {36 continue;37 }38 let x = ox + (slot % STAMP_COLS) as f64 * bit;39 let y = oy + (slot / STAMP_COLS) as f64 * bit;40 board.rect(x + pad, y + pad, bit - 2.0 * pad, bit - 2.0 * pad, color);41 }42 }43 assert_eq!(gold, 22);44 save("research-bijection", &board)?;45 Ok(())46}