commit ecca74f2f3882702c54a35b24cc1ec190d9f2821 Author: Thomas Lindner Date: Wed Oct 15 14:54:56 2025 +0200 implement entombed maze generator diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..5c29bf9 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,157 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "cfg-if" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" + +[[package]] +name = "entombed" +version = "0.1.0" +dependencies = [ + "rand", +] + +[[package]] +name = "getrandom" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi", +] + +[[package]] +name = "libc" +version = "0.2.177" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "proc-macro2" +version = "1.0.101" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "rand" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" +dependencies = [ + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom", +] + +[[package]] +name = "syn" +version = "2.0.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" + +[[package]] +name = "wasi" +version = "0.14.7+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" +dependencies = [ + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wit-bindgen" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" + +[[package]] +name = "zerocopy" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..ea30e2c --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "entombed" +version = "0.1.0" +edition = "2024" + +[dependencies] +rand = "0.9.2" diff --git a/paper_215.pdf b/paper_215.pdf new file mode 100644 index 0000000..b1ca46b Binary files /dev/null and b/paper_215.pdf differ diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..02f1faf --- /dev/null +++ b/src/main.rs @@ -0,0 +1,108 @@ +use rand::{Rng, rng}; + +const MAZE_WIDTH: usize = 80; + +fn print_maze_line( + prev: &[bool; MAZE_WIDTH], + line: &[bool; MAZE_WIDTH], + next: &[bool; MAZE_WIDTH], +) { + print!("{}", if line[0] { "\u{251c}" } else { "\u{2502}" }); + for (i, v) in line.iter().enumerate() { + print!( + "{}", + if !*v { + " " + } else { + match ( + prev[i], + i < 1 || line[i - 1], + i >= MAZE_WIDTH - 1 || line[i + 1], + next[i], + ) { + (false, false, false, true) => "\u{2577}", + (false, false, true, false) => "\u{2576}", + (false, false, true, true) => "\u{250c}", + (false, true, false, false) => "\u{2574}", + (false, true, false, true) => "\u{2510}", + (false, true, true, false) => "\u{2500}", + (false, true, true, true) => "\u{252c}", + (true, false, false, false) => "\u{2575}", + (true, false, false, true) => "\u{2502}", + (true, false, true, false) => "\u{2514}", + (true, false, true, true) => "\u{251c}", + (true, true, false, false) => "\u{2518}", + (true, true, false, true) => "\u{2524}", + (true, true, true, false) => "\u{2534}", + (true, true, true, true) => "\u{253c}", + (_, _, _, _) => ".", + } + } + ) + } + println!( + "{}", + if line[MAZE_WIDTH - 1] { + "\u{2524}" + } else { + "\u{2502}" + } + ) +} + +fn generate_maze_line( + rng: &mut impl Rng, + prev: &[bool; MAZE_WIDTH], + line: &mut [bool; MAZE_WIDTH], +) { + for i in 0..MAZE_WIDTH { + let a = i >= 2 && line[i - 2]; + let b = i < 1 || line[i - 1]; + let c = if i >= 1 { + prev[i - 1] + } else { + rng.random::() + }; + let d = prev[i]; + let e = if i < MAZE_WIDTH - 1 { + prev[i + 1] + } else { + rng.random::() + }; + if !b && !c && !d { + line[i] = true; + } else if b && c && d { + line[i] = false; + } else if !c && d && !e { + line[i] = true; + } else if c && !d && e { + line[i] = false; + } else if !a && b && !c { + line[i] = true; + } else if a && !b && c { + line[i] = false; + } else if b && !c && !d && e { + line[i] = false; + } else if !b && c && !d && !e { + line[i] = false; + } else { + line[i] = rng.random::(); + } + } +} + +fn main() { + let mut rng = rand::rng(); + let mut line1 = std::array::from_fn(|_| rng.random::()); + let mut line2 = [false; MAZE_WIDTH]; + let mut line3 = [false; MAZE_WIDTH]; + generate_maze_line(&mut rng, &line1, &mut line2); + for _ in 0..10 { + generate_maze_line(&mut rng, &line2, &mut line3); + print_maze_line(&line1, &line2, &line3); + generate_maze_line(&mut rng, &line3, &mut line1); + print_maze_line(&line2, &line3, &line1); + generate_maze_line(&mut rng, &line1, &mut line2); + print_maze_line(&line3, &line1, &line2); + } +}