implement entombed maze generator
This commit is contained in:
commit
ecca74f2f3
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
/target
|
||||||
157
Cargo.lock
generated
Normal file
157
Cargo.lock
generated
Normal 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
7
Cargo.toml
Normal 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
BIN
paper_215.pdf
Normal file
Binary file not shown.
108
src/main.rs
Normal file
108
src/main.rs
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue