diff options
| author | Tom Barrett <tom@tombarrett.xyz> | 2021-03-17 19:46:02 +0100 | 
|---|---|---|
| committer | Tom Barrett <tom@tombarrett.xyz> | 2021-03-17 19:46:02 +0100 | 
| commit | 9ba5009d9d4fed6d06e059afb8736a46f05a4a32 (patch) | |
| tree | 37ddcef5bba1fa9c47a14a1bff8f3817ec93cb72 /src | |
| parent | bd3f1a8ff8ddf83f6fa9da2b9911e414553ff48d (diff) | |
Diffstat (limited to 'src')
| -rw-r--r-- | src/main.zig | 169 | 
1 files changed, 157 insertions, 12 deletions
| diff --git a/src/main.zig b/src/main.zig index 56c15fe..38799a8 100644 --- a/src/main.zig +++ b/src/main.zig @@ -1,4 +1,5 @@  const std = @import("std"); +const ArrayList = std.ArrayList;  const print = std.debug.warn;  fn p1() void { @@ -239,14 +240,6 @@ fn p9() void {      }  } -//fn sum(array: []usize) usize { -//    var counter: usize = 0; -//    for (array) |i| { -//        counter += i; -//    } -//    return counter; -//} -  fn p10() void {      const size: usize = 2_000_001;      var primes: [size]bool = undefined; @@ -274,19 +267,170 @@ fn p10() void {      print("{}\n", .{sum});  } +fn strtoint(str: []u8) usize { +    var sum: usize = 0; +    var str_len: usize = len(str); + +    for (str) |c, j| { +        sum += (str[str_len - (j + 1)] - 48) * (exp(10, j)); +    } + +    return sum; +} + +fn exp(x: usize, y: usize) usize { +    var i: usize = 0; +    var total: usize = 1; +    while (i < y) : (i += 1) { +        total *= x; +    } +    return total; +} +  fn p11() void {      var array: [20][20]usize = undefined; +    var i: usize = 0; +    var j: usize = 0; +    var k: usize = 0; +      if (std.fs.cwd().openFile("p11", .{ .read = true })) |file| {          var str: [4096]u8 = undefined; -        if (file.read(&str)) |val| { -            print("{}", .{str[0]}); +        if (file.read(&str)) |str_len| { +            while (i < str_len) : (i += 3) { +                array[j][k] = strtoint(str[i .. i + 2]); +                if (j == 19) { +                    j = 0; +                    k += 1; +                } else { +                    j += 1; +                } +            }          } else |err| {              print("{}\n", .{err});          }      } else |err| {          print("{}\n", .{err});      } + +    var largest: usize = 0; +    var product: usize = 0; +    i = 0; +    while (i < 16) : (i += 1) { +        j = 0; +        while (j < 16) : (j += 1) { +            product = array[i][j] * array[i + 1][j] * array[i + 2][j] * array[i + 3][j]; +            if (product > largest) { +                largest = product; +            } +            product = array[i][j] * array[i][j + 1] * array[i][j + 2] * array[i][j + 3]; +            if (product > largest) { +                largest = product; +            } +            product = array[i][j] * array[i + 1][j + 1] * array[i + 2][j + 2] * array[i + 3][j + 3]; +            if (product > largest) { +                largest = product; +            } +            product = array[i + 3][j] * array[i + 2][j + 1] * array[i + 1][j + 2] * array[i][j + 3]; +            if (product > largest) { +                largest = product; +            } +        } +    } +    print("{}\n", .{largest}); +} + +fn gen_primes() ArrayList(usize) { +    var bool_primes = ArrayList(bool).init(std.heap.page_allocator); +    const size: usize = 10_000_000; +    var i: usize = 0; +    while (i < size) : (i += 1) { +        if (bool_primes.append(true)) |val| {} else |err| { +            print("{}", .{"allocation error"}); +        } +    } + +    i = 2; +    while (i < size) : (i += 1) { +        if (bool_primes.items[i]) { +            var j: usize = 2; +            while (j * i < size) : (j += 1) { +                bool_primes.items[j * i] = false; +            } +        } +    } + +    i = 2; +    var primes = ArrayList(usize).init(std.heap.page_allocator); +    while (i < size) : (i += 1) { +        if (bool_primes.items[i]) { +            if (primes.append(i)) |val| {} else |err| { +                print("{}", .{"allocation error"}); +            } +        } +    } + +    bool_primes.deinit(); + +    return primes; +} + +const Prime = struct { n: usize, count: usize }; +const my_primes_size = 10; + +fn p12() void { +    var i: usize = 1; +    var triangle: usize = 0; +    var largest: usize = 0; + +    var primes = gen_primes(); + +    while (i < 20000) : (i += 1) { +        triangle += i; +        var my_primes: [my_primes_size]Prime = undefined; +        var count: usize = 0; + +        var j: usize = 0; +        while (j < my_primes_size) : (j += 1) { +            my_primes[j].count = 0; +        } + +        j = 0; +        while (j < primes.items.len) : (j += 1) { +            if (triangle % primes.items[j] == 0) { +                var prime: Prime = .{ .n = primes.items[j], .count = 0 }; +                my_primes[count] = prime; +                count += 1; +            } else if (primes.items[j] > triangle) { +                break; +            } +        } + +        var t: usize = triangle; +        while (t != 1) { +            j = 0; +            while (j < count) : (j += 1) { +                if (t % my_primes[j].n == 0) { +                    t /= my_primes[j].n; +                    my_primes[j].count += 1; +                } +            } +        } + +        j = 0; +        var divisor_amount: usize = 1; +        while (j < my_primes_size) : (j += 1) { +            if (my_primes[j].count == 0) { +                break; +            } +            divisor_amount *= my_primes[j].count + 1; +        } + +        if (divisor_amount > 500) { +            print("{},{}\n", .{ triangle, divisor_amount }); +            break; +        } +    }  }  pub fn main() !void { @@ -297,8 +441,9 @@ pub fn main() !void {      //p5();      //p6();      //p7(); -    p8(); -    p9(); +    //p8(); +    //p9();      //p10();      //p11(); +    p12();  } | 
