wiki-wallis-sieve.rs
1.3 kB · rust · 44 lines
1use mrlycore::errors::Result;2use mrlyfig::{ink, save, Board, Color};3use mrlynum::sieve;45const LEVELS: usize = 3;6const SPAN: f64 = 840.0;78fn tones(word: &[u64], side: u64) -> Vec<(u64, Color)> {9 let inks = [ink::yellow(), ink::orange(), ink::blue()];10 let mut run = side;11 let mut out = Vec::new();12 for (place, &letter) in word.iter().enumerate() {13 run /= letter;14 out.push((run, inks[place]));15 }16 out17}1819fn main() -> Result<()> {20 let mut board = Board::square();21 let word = sieve::odd_word(LEVELS);22 let (side, sites) = sieve::raster(&word);23 let holes = sieve::punctures(&word, 2);24 assert_eq!(side, 105);25 assert_eq!(sites.iter().filter(|&&b| b == 1).count(), 9216);26 assert_eq!(holes.len() / 3, 201);27 let tones = tones(&word, side as u64);28 let unit = SPAN / side as f64;29 let edge = (board.width as f64 - SPAN) / 2.0;30 board.rect(edge, edge, SPAN, SPAN, ink::line());31 for hole in holes.chunks(3) {32 let wide = hole[2];33 let tone = tones.iter().find(|(size, _)| *size == wide).unwrap().1;34 board.rect(35 edge + hole[1] as f64 * unit,36 edge + hole[0] as f64 * unit,37 wide as f64 * unit,38 wide as f64 * unit,39 tone,40 );41 }42 save("wiki-wallis-sieve", &board)?;43 Ok(())44}