xwords
is a fast library that fills crossword puzzles. This repo also contains a lightweight CLI for invoking the library.
This is foremost a hobbyist project for me to learn a bit about profiling and optimizing rust. I am more than happy to accept contributions or to consider feature requests, but please be aware that the future of this project is somewhat uncertain.
This command fills a grid that is stored in a local file using a default wordlist.
$ xwords --input grids/20201005_empty.txt
CFS*ANGELI*ORDU
AIA*DEEPAS*SEIN
SCLAVONIAN*MFAS
IKANTLETGO*ALLE
OLDY**ROE*ANOSE
*YOOHOOMRSBLOOM
***FUGUE*IRIDAL
FAA*LIS*ECO*SPY
IMPROV*ACOOK***
BILLIEJEANKING*
SEUSS*IAD**CEIL
**STTIC**ALKALI
CITI*CACOMISTLE
CORN*OMOLON*LIS
CLEE*NATURA*YST
This command runs in about 2 seconds on my machine.
use xwords::{crossword::Crossword, fill_crossword_with_default_wordlist};
fn main() -> Result<(), String> {
let empty_crossword = Crossword::new(String::from(
"
* *
* *
*
* * *
** *
* ***
* *
* *
* *
*** *
* **
* * *
*
* *
* *
",
))?;
let filled_crossword = fill_crossword_with_default_wordlist(&empty_crossword)?;
println!("{}", filled_crossword);
Ok(())
}
/*
ZETA*TWIT*VOWEL
ETAT*IANA*EVOKE
RINTINTIN*REVIE
OCT*TIE*TUI*ENR
**ATHA*TASTINGS
TOLEAN*ILIES***
ISIAC*TEAN*STEM
ZAT*ACHATES*HRA
AYES*SETE*TYEES
***TUTSI*URALIC
VENERATE*SEWA**
ORA*TRO*UES*TOA
WISHI*NETASSETS
ETHIC*EVIL*USTO
RUEDA*SWAL*OTSU
*/
On my machine, the above snippet runs in about 3 seconds.
Behind the scenes, this snippet loads an indexed wordlist, and iteratively fills the input with valid words.