40 lines
1.1 KiB
Zig
40 lines
1.1 KiB
Zig
const std = @import("std");
|
|
|
|
pub fn main() !void {
|
|
const N: usize = 4;
|
|
const perms = [_][]const u8{
|
|
"ABCD", "CABD", "ACDB", "DACB", "BCDA", "ACBD", "ADCB", "CDAB",
|
|
"DABC", "BCAD", "CADB", "CDBA", "CBAD", "ABDC", "ADBC", "BDCA",
|
|
"DCBA", "BACD", "BADC", "BDAC", "CBDA", "DBCA", "DCAB",
|
|
};
|
|
|
|
// Calculate n = (N-1)!, the expected number of occurrences
|
|
var n: usize = 1;
|
|
var i: usize = 1;
|
|
while (i < N) : (i += 1) {
|
|
n *= i;
|
|
}
|
|
|
|
var miss: [N]u8 = undefined;
|
|
var stdout = std.io.getStdOut().writer();
|
|
|
|
i = 0;
|
|
while (i < N) : (i += 1) {
|
|
var cnt = [_]usize{0} ** N;
|
|
|
|
// Count how many times each letter occurs at position i
|
|
for (perms) |perm| {
|
|
const position = perm[i] - 'A';
|
|
cnt[position] += 1;
|
|
}
|
|
|
|
// Find letter not occurring (N-1)! times - that's the missing one
|
|
var j: usize = 0;
|
|
while (j < N and cnt[j] == n) : (j += 1) {}
|
|
|
|
miss[i] = @as(u8, @intCast(j)) + 'A';
|
|
}
|
|
|
|
try stdout.print("Missing: {s}\n", .{miss});
|
|
}
|