@@ -5,32 +5,32 @@ const Vec = std.meta.Vector(max_n, u8);
5
5
6
6
fn runInParallel (tasks : []std.Thread , len : usize , comptime f : anytype , args : anytype ) ! void {
7
7
const len_per_task = @divTrunc (len , tasks .len + 1 );
8
- for (tasks ) | * task , i | {
9
- const first = len_per_task * i ;
8
+ for (tasks , 0 .. ) | * task , i | {
9
+ const first = len_per_task * i ;
10
10
const last = first + len_per_task ;
11
- task .* = try std .Thread .spawn (.{}, f , .{first , last } ++ args );
11
+ task .* = try std .Thread .spawn (.{}, f , .{ first , last } ++ args );
12
12
}
13
- @call (.auto , f , .{tasks .len * len_per_task , len } ++ args );
13
+ @call (.auto , f , .{ tasks .len * len_per_task , len } ++ args );
14
14
for (tasks ) | * task | task .join ();
15
15
}
16
16
17
17
fn reverse_mask (n : u8 ) Vec {
18
18
// global constant is not used to workaround a compiler bug
19
- var v = Vec { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 };
19
+ var v = Vec { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 };
20
20
var i : u8 = 0 ;
21
21
while (i < n ) : (i += 1 ) v [i ] = n - i - 1 ;
22
22
return v ;
23
23
}
24
24
25
25
fn rotate_mask (n : u8 ) Vec {
26
- var v = Vec { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 };
26
+ var v = Vec { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 };
27
27
var i : u8 = 0 ;
28
28
while (i < n ) : (i += 1 ) v [i ] = (i + 1 ) % n ;
29
29
return v ;
30
30
}
31
31
32
32
fn nextPermMask (n : u8 ) Vec {
33
- var v = Vec { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 };
33
+ var v = Vec { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 };
34
34
var i : u8 = 2 ;
35
35
while (i <= n ) : (i += 1 ) v = applyMask (v , i , rotate_mask );
36
36
return v ;
@@ -80,7 +80,7 @@ fn countAtPos(n: u8, start: usize) [max_n]u8 {
80
80
}
81
81
82
82
fn permWithCount (n : u8 , count : [max_n ]u8 ) Vec {
83
- var perm = Vec { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 };
83
+ var perm = Vec { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 };
84
84
const permVals = std .mem .asBytes (& perm );
85
85
var i = n ;
86
86
while (i > 0 ) : (i -= 1 ) std .mem .rotate (u8 , permVals [0.. i ], i - count [i - 1 ]);
@@ -93,23 +93,23 @@ const Stats = struct {
93
93
};
94
94
95
95
fn nextPermutation (perm : Vec , count : []u8 ) ? Vec {
96
- const r = for (count ) | v , i | {
96
+ const r = for (count , 0 .. ) | v , i | {
97
97
if (v != 1 ) break @intCast (u8 , i );
98
98
} else return null ;
99
99
const next_perm = applyMask (perm , r + 1 , nextPermMask );
100
100
count [r ] -= 1 ;
101
- for (count [0.. r ]) | * v , i | v .* = @intCast (u8 , i + 1 );
101
+ for (count [0.. r ], 0 .. ) | * v , i | v .* = @intCast (u8 , i + 1 );
102
102
return next_perm ;
103
103
}
104
104
105
105
fn pfannkuchenStats (first : usize , last : usize , n : u8 , res : * Stats ) void {
106
106
var count = countAtPos (n , first );
107
107
var perm = permWithCount (n , count );
108
- var stats = Stats {};
108
+ var stats = Stats {};
109
109
var i = first ;
110
110
while (i < last ) : (i += 1 ) {
111
111
const flips = pfannkuchen (perm );
112
- const parity = 1 - @intCast (i32 , i % 2 )* 2 ;
112
+ const parity = 1 - @intCast (i32 , i % 2 ) * 2 ;
113
113
stats .max_flips = std .math .max (stats .max_flips , flips );
114
114
stats .checksum += @intCast (i32 , flips ) * parity ;
115
115
perm = nextPermutation (perm , count [0.. n ]) orelse break ;
@@ -124,9 +124,9 @@ pub fn main() !void {
124
124
var tasks_buf : [64 ]std.Thread = undefined ;
125
125
const task_count = try std .Thread .getCpuCount ();
126
126
const tasks = tasks_buf [0 .. task_count - 1 ];
127
- var stats = Stats {};
127
+ var stats = Stats {};
128
128
const perms_count = factorialComptime (n );
129
- try runInParallel (tasks , perms_count , pfannkuchenStats , .{n , & stats });
129
+ try runInParallel (tasks , perms_count , pfannkuchenStats , .{ n , & stats });
130
130
131
131
const stdout = std .io .getStdOut ().writer ();
132
132
try stdout .print ("{d}\n Pfannkuchen({d}) = {d}\n " , .{ stats .checksum , n , stats .max_flips });
0 commit comments