implement entombed maze generator

This commit is contained in:
v 2025-10-15 14:54:56 +02:00
commit ecca74f2f3
5 changed files with 273 additions and 0 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/target

157
Cargo.lock generated Normal file
View file

@ -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",
]

7
Cargo.toml Normal file
View file

@ -0,0 +1,7 @@
[package]
name = "entombed"
version = "0.1.0"
edition = "2024"
[dependencies]
rand = "0.9.2"

BIN
paper_215.pdf Normal file

Binary file not shown.

108
src/main.rs Normal file
View file

@ -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::<bool>()
};
let d = prev[i];
let e = if i < MAZE_WIDTH - 1 {
prev[i + 1]
} else {
rng.random::<bool>()
};
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::<bool>();
}
}
}
fn main() {
let mut rng = rand::rng();
let mut line1 = std::array::from_fn(|_| rng.random::<bool>());
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);
}
}