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}