-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path9.zig
64 lines (54 loc) · 1.93 KB
/
9.zig
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
const std = @import("std");
const print = std.debug.print;
pub fn main() !void {
const day = @src().file[0..1];
const input = @embedFile(day ++ ".txt");
const pa = std.heap.page_allocator;
var sum: isize = 0;
var lines = std.mem.splitScalar(u8, input, '\n');
while (lines.next()) |line| {
if (line.len > 0) {
var numbers_iter = std.mem.splitScalar(u8, line, ' ');
var numbers = std.ArrayList(isize).init(pa);
while (numbers_iter.next()) |number_str| {
if (number_str.len > 0) {
try numbers.append(try std.fmt.parseInt(isize, number_str, 10));
}
}
const prediction = predict(numbers.items, pa);
sum += prediction;
}
}
print("Day " ++ day ++ " >> {d}\n", .{sum});
}
pub fn predict(numbers: []isize, allocator: std.mem.Allocator) isize {
var first_nums = std.ArrayList(isize).init(allocator);
var cur_nums = std.ArrayList(isize).init(allocator);
defer first_nums.deinit();
defer cur_nums.deinit();
cur_nums.appendSlice(numbers) catch {};
var is_zero = false;
while (!is_zero) {
is_zero = true;
first_nums.append(cur_nums.items[0]) catch {};
for (0..cur_nums.items.len - 1) |i| {
cur_nums.items[i] = cur_nums.items[i + 1] - cur_nums.items[i];
if (cur_nums.items[i] != 0) {
is_zero = false;
}
}
_ = cur_nums.pop();
}
var prediction: isize = 0;
for (0..first_nums.items.len) |_| {
prediction = first_nums.pop() - prediction;
}
return prediction;
}
const expect = std.testing.expect;
const alloc = std.testing.allocator;
test "predict" {
try expect(predict(&[_]isize{ 10, 13, 16 }, alloc) == 19);
try expect(predict(&[_]isize{ 10, 13, 16, 21, 30, 45 }, alloc) == 68);
try expect(predict(&[_]isize{ 1, 3, 6, 10, 15, 21 }, alloc) == 28);
}