@@ -5,32 +5,32 @@ const Vec = std.meta.Vector(max_n, u8);
55
66fn runInParallel (tasks : []std.Thread , len : usize , comptime f : anytype , args : anytype ) ! void {
77 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 ;
1010 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 );
1212 }
13- @call (.auto , f , .{tasks .len * len_per_task , len } ++ args );
13+ @call (.auto , f , .{ tasks .len * len_per_task , len } ++ args );
1414 for (tasks ) | * task | task .join ();
1515}
1616
1717fn reverse_mask (n : u8 ) Vec {
1818 // 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 };
2020 var i : u8 = 0 ;
2121 while (i < n ) : (i += 1 ) v [i ] = n - i - 1 ;
2222 return v ;
2323}
2424
2525fn 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 };
2727 var i : u8 = 0 ;
2828 while (i < n ) : (i += 1 ) v [i ] = (i + 1 ) % n ;
2929 return v ;
3030}
3131
3232fn 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 };
3434 var i : u8 = 2 ;
3535 while (i <= n ) : (i += 1 ) v = applyMask (v , i , rotate_mask );
3636 return v ;
@@ -80,7 +80,7 @@ fn countAtPos(n: u8, start: usize) [max_n]u8 {
8080}
8181
8282fn 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 };
8484 const permVals = std .mem .asBytes (& perm );
8585 var i = n ;
8686 while (i > 0 ) : (i -= 1 ) std .mem .rotate (u8 , permVals [0.. i ], i - count [i - 1 ]);
@@ -93,23 +93,23 @@ const Stats = struct {
9393};
9494
9595fn nextPermutation (perm : Vec , count : []u8 ) ? Vec {
96- const r = for (count ) | v , i | {
96+ const r = for (count , 0 .. ) | v , i | {
9797 if (v != 1 ) break @intCast (u8 , i );
9898 } else return null ;
9999 const next_perm = applyMask (perm , r + 1 , nextPermMask );
100100 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 );
102102 return next_perm ;
103103}
104104
105105fn pfannkuchenStats (first : usize , last : usize , n : u8 , res : * Stats ) void {
106106 var count = countAtPos (n , first );
107107 var perm = permWithCount (n , count );
108- var stats = Stats {};
108+ var stats = Stats {};
109109 var i = first ;
110110 while (i < last ) : (i += 1 ) {
111111 const flips = pfannkuchen (perm );
112- const parity = 1 - @intCast (i32 , i % 2 )* 2 ;
112+ const parity = 1 - @intCast (i32 , i % 2 ) * 2 ;
113113 stats .max_flips = std .math .max (stats .max_flips , flips );
114114 stats .checksum += @intCast (i32 , flips ) * parity ;
115115 perm = nextPermutation (perm , count [0.. n ]) orelse break ;
@@ -124,9 +124,9 @@ pub fn main() !void {
124124 var tasks_buf : [64 ]std.Thread = undefined ;
125125 const task_count = try std .Thread .getCpuCount ();
126126 const tasks = tasks_buf [0 .. task_count - 1 ];
127- var stats = Stats {};
127+ var stats = Stats {};
128128 const perms_count = factorialComptime (n );
129- try runInParallel (tasks , perms_count , pfannkuchenStats , .{n , & stats });
129+ try runInParallel (tasks , perms_count , pfannkuchenStats , .{ n , & stats });
130130
131131 const stdout = std .io .getStdOut ().writer ();
132132 try stdout .print ("{d}\n Pfannkuchen({d}) = {d}\n " , .{ stats .checksum , n , stats .max_flips });
0 commit comments