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}