collide.rs
1.2 kB · rust · 44 lines
1use crate::tile::Tile;23pub fn residue_tile(code: u32, base: usize, side: usize) -> Tile {4 let mut tile = Tile::new(side);5 for r in 0..side {6 for c in 0..side {7 let index = (r % base) * base + (c % base);8 if (code >> index) & 1 == 1 {9 tile.set(r, c);10 }11 }12 }13 tile14}1516pub fn collisions(side: usize) -> Vec<(u32, u32)> {17 let two: Vec<(u32, Tile)> = (1u32..16).map(|c| (c, residue_tile(c, 2, side))).collect();18 let three: Vec<(u32, Tile)> = (1u32..512).map(|c| (c, residue_tile(c, 3, side))).collect();19 let mut out = Vec::new();20 for (a, left) in &two {21 for (b, right) in &three {22 if left == right {23 out.push((*a, *b));24 }25 }26 }27 out28}2930pub fn partners(code: u32, side: usize) -> Vec<u32> {31 let truth = residue_tile(code, 2, side);32 (1u32..512)33 .filter(|c| residue_tile(*c, 3, side) == truth)34 .collect()35}3637pub fn self_power(code: u32, base: usize, level: usize) -> Tile {38 let seed = residue_tile(code, base, base);39 let mut out = seed.clone();40 for _ in 1..level {41 out = crate::tile::kron(&out, &seed);42 }43 out44}