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}