RosettaCodeData/Task/ABC-problem/Zig/abc-problem.zig
2026-04-30 12:34:36 -04:00

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) });
}
}