demo-ulam.rs

1.2 kB · rust · 40 lines

1use mrlycore::errors::Result;2use mrlyfig::{ink, save, Board};3use mrlynum::spiral::{diagonal, flags, Lattice};45const SIDE: usize = 201;6const REACH: i64 = 100;7const UNIT: f64 = 4.0;8const DOT: f64 = 3.0;910fn main() -> Result<()> {11    let mut board = Board::square();12    let span = SIDE as f64 * UNIT;13    let edge = (board.width as f64 - span) / 2.0;14    let corner = |(x, y): (i64, i64)| {15        (16            edge + (x + REACH) as f64 * UNIT,17            edge + (REACH - y) as f64 * UNIT,18        )19    };20    let line = diagonal(Lattice::Square, SIDE, 4, -2, 41);21    assert_eq!((line.top, line.primes), (40401, 4236));22    assert_eq!((line.values.len(), line.hits, line.streak), (101, 80, 21));23    for cell in &line.cells {24        let (x, y) = corner(*cell);25        board.rect(x - 2.0, y - 2.0, UNIT + 4.0, UNIT + 4.0, ink::orange());26    }27    let prime = flags(line.top);28    let mut lit = 0usize;29    for n in 1..=line.top as u64 {30        if !prime[n as usize] {31            continue;32        }33        let (x, y) = corner(Lattice::Square.xy(n));34        board.rect(x, y, DOT, DOT, ink::blue());35        lit += 1;36    }37    assert_eq!(lit, line.primes);38    save("demo-ulam", &board)?;39    Ok(())40}