initial
This commit is contained in:
commit
1ed618e300
5 changed files with 69 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
/target
|
||||||
7
Cargo.lock
generated
Normal file
7
Cargo.lock
generated
Normal file
|
|
@ -0,0 +1,7 @@
|
||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 4
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "blue-uncurse"
|
||||||
|
version = "0.1.0"
|
||||||
6
Cargo.toml
Normal file
6
Cargo.toml
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
[package]
|
||||||
|
name = "blue-uncurse"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2024"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
4
README.md
Normal file
4
README.md
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
# blue uncurse
|
||||||
|
output lines of less than 2000 characters (suitable for discord messages) that contain every four-letter word in `etoaisnhrldum`, so you can get blue uncursed.
|
||||||
|
|
||||||
|
<https://github.com/mehbark/homelab/blob/856f6f327bb1bc7a1f5dd37370dd041d38ebb840/bots/puyo.ts#L799-L808>
|
||||||
51
src/main.rs
Normal file
51
src/main.rs
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
use std::collections::HashSet;
|
||||||
|
|
||||||
|
const LETTERS: [u8; 13] = *b"etoaisnhrldum";
|
||||||
|
|
||||||
|
fn overlap(first: &[u8], second: &[u8]) -> usize {
|
||||||
|
if &first[first.len().saturating_sub(second.len())..] == second {
|
||||||
|
second.len()
|
||||||
|
} else {
|
||||||
|
overlap(first, &second[..second.len() - 1])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let mut remaining = HashSet::new();
|
||||||
|
|
||||||
|
for a in LETTERS {
|
||||||
|
for b in LETTERS {
|
||||||
|
for c in LETTERS {
|
||||||
|
for d in LETTERS {
|
||||||
|
remaining.insert([a, b, c, d]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
eprintln!("words: {}", remaining.len());
|
||||||
|
|
||||||
|
let mut last = *b"aaaa";
|
||||||
|
remaining.remove(&last);
|
||||||
|
|
||||||
|
let mut output = String::from_utf8_lossy(&last).to_string();
|
||||||
|
|
||||||
|
while let Some(word) = remaining
|
||||||
|
.iter()
|
||||||
|
.max_by_key(|word| overlap(&last, &word[..]))
|
||||||
|
{
|
||||||
|
let word = *word;
|
||||||
|
remaining.remove(&word);
|
||||||
|
let added = &word[overlap(&last, &word[..])..];
|
||||||
|
last = word;
|
||||||
|
output.push_str(&String::from_utf8_lossy(added));
|
||||||
|
|
||||||
|
if output.len() > 1996 {
|
||||||
|
println!("{output}");
|
||||||
|
output.clear();
|
||||||
|
output.push_str(&String::from_utf8_lossy(&word));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("{output}");
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue