@@ -3,67 +3,66 @@ const std = @import("std");
3
3
const parsed_input = blk : {
4
4
@setEvalBranchQuota (10_000 );
5
5
const input = @embedFile ("input" );
6
- const Items = std .BoundedArray (u64 , 64 );
6
+ const ItemWorries = std .BoundedArray (u64 , 64 );
7
7
var monkeys = std .BoundedArray (struct {
8
- items : Items ,
8
+ item_worries : ItemWorries ,
9
9
op : u8 ,
10
10
operand : ? u8 , // null == "old".
11
11
div : u8 , // assumed to always be a prime number.
12
12
true_i : u8 ,
13
13
false_i : u8 ,
14
14
}, 16 ).init (0 ) catch unreachable ;
15
- var max_worry : u64 = 1 ;
15
+ var max_div : u64 = 1 ; // divisors are prime, so we only need to consider worry values less than this.
16
16
var line_it = std .mem .tokenize (u8 , input , std .cstr .line_sep );
17
17
while (line_it .next ()) | _ | {
18
- var items = Items .init (0 ) catch unreachable ;
19
- var items_it = std .mem .split (u8 , line_it .next ().? [" Starting items: " .len .. ], ", " );
20
- while (items_it .next ()) | item_str | items .append (std .fmt .parseInt (u64 , item_str , 10 ) catch unreachable ) catch unreachable ;
18
+ var item_worries = ItemWorries .init (0 ) catch unreachable ;
19
+ var item_it = std .mem .split (u8 , line_it .next ().? [" Starting items: " .len .. ], ", " );
20
+ while (item_it .next ()) | str | item_worries .append (std .fmt .parseInt (u64 , str , 10 ) catch unreachable ) catch unreachable ;
21
21
const op_str = line_it .next ().? [" Operation: new = old " .len .. ];
22
22
const div = std .fmt .parseInt (u8 , line_it .next ().? [" Test: divisible by " .len .. ], 10 ) catch unreachable ;
23
+ max_div *= div ;
23
24
monkeys .append (.{
24
- .items = items ,
25
+ .item_worries = item_worries ,
25
26
.op = op_str [0 ],
26
27
.operand = std .fmt .parseInt (u8 , op_str [2.. ], 10 ) catch null ,
27
28
.div = div ,
28
29
.true_i = std .fmt .parseInt (u8 , line_it .next ().? [" If true: throw to monkey " .len .. ], 10 ) catch unreachable ,
29
30
.false_i = std .fmt .parseInt (u8 , line_it .next ().? [" If false: throw to monkey " .len .. ], 10 ) catch unreachable ,
30
31
}) catch unreachable ;
31
- max_worry *= div ;
32
32
}
33
- break :blk .{ .monkeys = monkeys , .max_worry = max_worry };
33
+ break :blk .{ .monkeys = monkeys , .max_div = max_div };
34
34
};
35
35
36
- fn computeAnswer (comptime p1 : bool ) usize {
36
+ fn computeAnswer (comptime is_p1 : bool ) usize {
37
37
var monkeys = parsed_input .monkeys ;
38
- var inspect_counts = [_ ]usize {0 } ** parsed_input .monkeys .len ;
39
- var round : u64 = 0 ;
40
- while (round < if (p1 ) 20 else 10_000 ) : (round += 1 ) {
38
+ var inspects = [_ ]usize {0 } ** parsed_input .monkeys .len ;
39
+ var round : u32 = 0 ;
40
+ while (round < if (is_p1 ) 20 else 10_000 ) : (round += 1 ) {
41
41
for (monkeys .slice ()) | * monkey , i | {
42
- for (monkey .items .slice ()) | item | {
43
- const operand = monkey .operand orelse item ;
44
- const pre_worry = if (monkey .op == '*' ) item * operand else item + operand ;
45
- const worry = if (p1 ) pre_worry / 3 else pre_worry % parsed_input .max_worry ;
42
+ for (monkey .item_worries .slice ()) | item_worry | {
43
+ const operand = monkey .operand orelse item_worry ;
44
+ const op_worry = if (monkey .op == '*' ) item_worry * operand else item_worry + operand ;
45
+ const worry = if (is_p1 ) op_worry / 3 else op_worry % parsed_input .max_div ;
46
46
const throw_i = if (worry % monkey .div == 0 ) monkey .true_i else monkey .false_i ;
47
- monkeys .slice ()[throw_i ].items .append (worry ) catch unreachable ;
47
+ monkeys .slice ()[throw_i ].item_worries .append (worry ) catch unreachable ;
48
48
}
49
- inspect_counts [i ] += monkey .items .len ;
50
- monkey .items .len = 0 ;
49
+ inspects [i ] += monkey .item_worries .len ;
50
+ monkey .item_worries .len = 0 ;
51
51
}
52
52
}
53
53
var top2 = [_ ]usize {0 } ** 2 ;
54
- for (inspect_counts ) | count | {
54
+ for (inspects ) | count | {
55
55
const min_i = std .mem .indexOfMin (usize , & top2 );
56
56
top2 [min_i ] = @max (top2 [min_i ], count );
57
57
}
58
58
return top2 [0 ] * top2 [1 ];
59
59
}
60
+ const p1 = blk : {
61
+ @setEvalBranchQuota (100_000 );
62
+ break :blk computeAnswer (true );
63
+ };
60
64
61
65
pub fn main () ! void {
62
66
const stdout = std .io .getStdOut ().writer ();
63
- const p1 = comptime blk : {
64
- @setEvalBranchQuota (100_000 );
65
- break :blk computeAnswer (true );
66
- };
67
- const p2 = computeAnswer (false );
68
- try stdout .print ("Day11 (P1 at comptime): P1: {}, P2: {}\n " , .{ p1 , p2 });
67
+ try stdout .print ("Day11 (P1 at comptime): P1: {}, P2: {}\n " , .{ p1 , computeAnswer (false ) });
69
68
}
0 commit comments