site-papers.rs

1.7 kB · rust · 56 lines

1use mrlycore::errors::Result;2use mrlycore::tensor::Tensor;3use mrlyfig::{ink, iso, save, Board};4use mrlymath::three::Cell3d;5use mrlymath::two::designs;67const CODES: [u128; 12] = [15, 11, 10, 5, 1, 9, 7, 13, 12, 3, 6, 14];8const SIDE: usize = 9;9const PILES: usize = 2;10const LIFT: usize = 2;11const APART: usize = 18;1213fn main() -> Result<()> {14    let mut board = Board::square();15    let frame = board.frame(0.08);16    let deep = CODES.len() / PILES;17    let last = deep - 1;18    let wide = (PILES - 1) * APART + SIDE;19    let mut sheets = Vec::new();20    for code in CODES {21        let sheet = designs::create(code, 3, 2, 0, 2)?;22        let seed = designs::create(code, 3, 1, 0, 2)?;23        assert_eq!(sheet.types().shape, vec![SIDE, SIDE]);24        assert_eq!(sheet.types().sum(), seed.types().sum().pow(2));25        sheets.push((sheet.types().sum(), sheet));26    }27    assert_eq!(sheets.len(), PILES * deep);28    sheets.sort_by_key(|sheet| std::cmp::Reverse(sheet.0));29    let mut grid = Tensor::new(vec![wide, SIDE, last * LIFT + 1]);30    let mut want = 0u64;31    for (i, (count, sheet)) in sheets.iter().enumerate() {32        want += count;33        let cells = sheet.types();34        let (pile, step) = (i % PILES, i / PILES);35        let ox = pile * APART;36        let oz = step * LIFT;37        for a in 0..SIDE {38            for b in 0..SIDE {39                if cells.get(&[a, b]) != 0 {40                    grid.set(&[ox + a, b, oz], 1);41                }42            }43        }44    }45    assert_eq!(grid.sum(), want);46    let shelf = Cell3d::new(grid);47    iso::draw(48        &mut board,49        frame,50        &shelf,51        [ink::fg(), ink::blue(), ink::blue()],52        None,53    );54    save("site-papers", &board)?;55    Ok(())56}