| ... | ... | @@ -1189,19 +1189,36 @@ fn fuzzTest(rng: *std.rand.Random) void { |
| 1189 | 1189 | } |
| 1190 | 1190 | } |
| 1191 | 1191 | |
| 1192 | | pub fn min(comptime T: type, items: []const T, lessThan: fn (lhs: T, rhs: T) bool) ?T { |
| 1192 | pub fn argMin(comptime T: type, items: []const T, lessThan: fn (lhs: T, rhs: T) bool) ?usize { |
| 1193 | 1193 | if (items.len == 0) { |
| 1194 | 1194 | return null; |
| 1195 | 1195 | } |
| 1196 | 1196 | |
| 1197 | | var i: usize = 0; |
| 1198 | 1197 | var smallest = items[0]; |
| 1199 | | for (items[1..]) |item| { |
| 1198 | var smallest_index: usize = 0; |
| 1199 | for (items[1..]) |item, i| { |
| 1200 | 1200 | if (lessThan(item, smallest)) { |
| 1201 | 1201 | smallest = item; |
| 1202 | smallest_index = i + 1; |
| 1202 | 1203 | } |
| 1203 | 1204 | } |
| 1204 | | return smallest; |
| 1205 | |
| 1206 | return smallest_index; |
| 1207 | } |
| 1208 | |
| 1209 | test "std.sort.argMin" { |
| 1210 | testing.expectEqual(@as(?usize, null), argMin(i32, &[_]i32{}, asc(i32))); |
| 1211 | testing.expectEqual(@as(?usize, 0), argMin(i32, &[_]i32{1}, asc(i32))); |
| 1212 | testing.expectEqual(@as(?usize, 0), argMin(i32, &[_]i32{ 1, 2, 3, 4, 5 }, asc(i32))); |
| 1213 | testing.expectEqual(@as(?usize, 3), argMin(i32, &[_]i32{ 9, 3, 8, 2, 5 }, asc(i32))); |
| 1214 | testing.expectEqual(@as(?usize, 0), argMin(i32, &[_]i32{ 1, 1, 1, 1, 1 }, asc(i32))); |
| 1215 | testing.expectEqual(@as(?usize, 0), argMin(i32, &[_]i32{ -10, 1, 10 }, asc(i32))); |
| 1216 | testing.expectEqual(@as(?usize, 3), argMin(i32, &[_]i32{ 6, 3, 5, 7, 6 }, desc(i32))); |
| 1217 | } |
| 1218 | |
| 1219 | pub fn min(comptime T: type, items: []const T, lessThan: fn (lhs: T, rhs: T) bool) ?T { |
| 1220 | const i = argMin(T, items, lessThan) orelse return null; |
| 1221 | return items[i]; |
| 1205 | 1222 | } |
| 1206 | 1223 | |
| 1207 | 1224 | test "std.sort.min" { |
| ... | ... | @@ -1214,19 +1231,36 @@ test "std.sort.min" { |
| 1214 | 1231 | testing.expectEqual(@as(?i32, 7), min(i32, &[_]i32{ 6, 3, 5, 7, 6 }, desc(i32))); |
| 1215 | 1232 | } |
| 1216 | 1233 | |
| 1217 | | pub fn max(comptime T: type, items: []const T, lessThan: fn (lhs: T, rhs: T) bool) ?T { |
| 1234 | pub fn argMax(comptime T: type, items: []const T, lessThan: fn (lhs: T, rhs: T) bool) ?usize { |
| 1218 | 1235 | if (items.len == 0) { |
| 1219 | 1236 | return null; |
| 1220 | 1237 | } |
| 1221 | 1238 | |
| 1222 | | var i: usize = 0; |
| 1223 | 1239 | var biggest = items[0]; |
| 1224 | | for (items[1..]) |item| { |
| 1240 | var biggest_index: usize = 0; |
| 1241 | for (items[1..]) |item, i| { |
| 1225 | 1242 | if (lessThan(biggest, item)) { |
| 1226 | 1243 | biggest = item; |
| 1244 | biggest_index = i + 1; |
| 1227 | 1245 | } |
| 1228 | 1246 | } |
| 1229 | | return biggest; |
| 1247 | |
| 1248 | return biggest_index; |
| 1249 | } |
| 1250 | |
| 1251 | test "std.sort.argMax" { |
| 1252 | testing.expectEqual(@as(?usize, null), argMax(i32, &[_]i32{}, asc(i32))); |
| 1253 | testing.expectEqual(@as(?usize, 0), argMax(i32, &[_]i32{1}, asc(i32))); |
| 1254 | testing.expectEqual(@as(?usize, 4), argMax(i32, &[_]i32{ 1, 2, 3, 4, 5 }, asc(i32))); |
| 1255 | testing.expectEqual(@as(?usize, 0), argMax(i32, &[_]i32{ 9, 3, 8, 2, 5 }, asc(i32))); |
| 1256 | testing.expectEqual(@as(?usize, 0), argMax(i32, &[_]i32{ 1, 1, 1, 1, 1 }, asc(i32))); |
| 1257 | testing.expectEqual(@as(?usize, 2), argMax(i32, &[_]i32{ -10, 1, 10 }, asc(i32))); |
| 1258 | testing.expectEqual(@as(?usize, 1), argMax(i32, &[_]i32{ 6, 3, 5, 7, 6 }, desc(i32))); |
| 1259 | } |
| 1260 | |
| 1261 | pub fn max(comptime T: type, items: []const T, lessThan: fn (lhs: T, rhs: T) bool) ?T { |
| 1262 | const i = argMax(T, items, lessThan) orelse return null; |
| 1263 | return items[i]; |
| 1230 | 1264 | } |
| 1231 | 1265 | |
| 1232 | 1266 | test "std.sort.max" { |