WIP dictionary

This commit is contained in:
2026-06-10 01:39:23 -06:00
parent 119bad49f1
commit f041cec3bc
2 changed files with 10737 additions and 0 deletions

10657
src/dict.txt Normal file

File diff suppressed because it is too large Load Diff

80
src/dict.zig Normal file
View File

@@ -0,0 +1,80 @@
const std = @import("std");
const Wordle = @import("wordle.zig");
/// A statically-initialized dictionary of all Wordle words.
var Dictionary: ?[]const Wordle.Word = null;
/// Gets or statically initializes the dictionary.
pub fn getDictionary() []const Wordle.Word {
if (Dictionary) |dict| {
return dict;
} else {
const dict = loadDict();
Dictionary = dict;
return dict;
}
}
/// Internal function to load the Wordle dictionary.
fn loadDict() []const Wordle.Word {
// directly embed dictionary contents
const src = @embedFile("dict.txt");
// count lines (words)
var num: u64 = 0;
for (src, 0..) |char, idx| {
_ = idx;
if (char == '\n') {
num += 1;
}
}
// allocate all words
const dictionary = std.heap.smp_allocator.alloc(Wordle.Word, num) catch unreachable;
// return complete dictionary
return dictionary;
}
/// Tests if a word is in the dictionary.
// TODO: binary search? need to assert that words are sorted
pub fn isInDictionary(word: Wordle.Word) bool {
// exhaustively search through dictionary
for (getDictionary()) |entry| {
// compare each letter at a time
var match = true;
for (entry, word) |entryLetter, wordLetter| {
if (entryLetter != wordLetter) {
match = false;
break;
}
}
// if every letter matches, return a complete match
if (match) {
return true;
}
}
// if no word was found, return false
return false;
}
/// Asserts that a word literal is in the dictionary.
fn expectDictionary(word: Wordle.WordLiteral) !void {
try std.testing.expect(isInDictionary(Wordle.strToWord(word)));
}
/// Asserts that a word literal is *not* in the dictionary.
fn expectNotDictionary(word: Wordle.WordLiteral) !void {
try std.testing.expect(!isInDictionary(Wordle.strToWord(word)));
}
test "in dictionary" {
try expectDictionary("alone");
}
test "not in dictionary" {
try expectNotDictionary("hbzci");
}