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}