54 lines
1.6 KiB
Zig
54 lines
1.6 KiB
Zig
const std = @import("std");
|
|
|
|
const Block: type = struct { Char1: u8, Char2: u8 };
|
|
const BLOCK_SIZE: comptime_int = 20;
|
|
const blocks: [BLOCK_SIZE]Block = .{
|
|
.{ .Char1 = 'B', .Char2 = 'O' }, .{ .Char1 = 'X', .Char2 = 'K' },
|
|
.{ .Char1 = 'D', .Char2 = 'Q' }, .{ .Char1 = 'C', .Char2 = 'P' },
|
|
.{ .Char1 = 'N', .Char2 = 'A' }, .{ .Char1 = 'G', .Char2 = 'T' },
|
|
.{ .Char1 = 'R', .Char2 = 'E' }, .{ .Char1 = 'T', .Char2 = 'G' },
|
|
.{ .Char1 = 'Q', .Char2 = 'D' }, .{ .Char1 = 'F', .Char2 = 'S' },
|
|
.{ .Char1 = 'J', .Char2 = 'W' }, .{ .Char1 = 'H', .Char2 = 'U' },
|
|
.{ .Char1 = 'V', .Char2 = 'I' }, .{ .Char1 = 'A', .Char2 = 'N' },
|
|
.{ .Char1 = 'O', .Char2 = 'B' }, .{ .Char1 = 'E', .Char2 = 'R' },
|
|
.{ .Char1 = 'F', .Char2 = 'S' }, .{ .Char1 = 'L', .Char2 = 'Y' },
|
|
.{ .Char1 = 'P', .Char2 = 'C' }, .{ .Char1 = 'Z', .Char2 = 'M' },
|
|
};
|
|
|
|
fn can_make_word(word: []const u8) bool {
|
|
var marked: [BLOCK_SIZE]bool = [_]bool{false} ** BLOCK_SIZE;
|
|
|
|
for (word) |char| {
|
|
var hasBlock: bool = false;
|
|
|
|
for (blocks, 0..) |block, index| {
|
|
if ((block.Char1 == char or block.Char2 == char) and !marked[index]) {
|
|
hasBlock = true;
|
|
marked[index] = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (!hasBlock) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
pub fn main() !void {
|
|
const words: []const []const u8 = &.{
|
|
"A",
|
|
"BARK",
|
|
"BOOK",
|
|
"TREAT",
|
|
"COMMON",
|
|
"SQUAD",
|
|
"CONFUSE",
|
|
};
|
|
|
|
for (words) |word| {
|
|
std.debug.print("{s}\t{any}\n", .{ word, can_make_word(word) });
|
|
}
|
|
}
|