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}