~gsthnz/euler

9400f9e65e03dfa974980159297b02847fb9b721 — Gustavo Heinz 4 years ago 4560851 master
Finished 18, clean final print of 16 and 17
3 files changed, 56 insertions(+), 42 deletions(-)

M src/016.c
M src/017.c
M src/018.c
M src/016.c => src/016.c +1 -1
@@ 19,5 19,5 @@ int power_digit_sum(int base, int power) {

int main() {
    assert(power_digit_sum(2,15) == 26);
    printf("015: %d\n", power_digit_sum(2,1000));
    printf("016: %d\n", power_digit_sum(2,1000));
}

M src/017.c => src/017.c +1 -1
@@ 87,5 87,5 @@ int main() {
    assert(number_letter_count(1000) == 11);
    assert(number_letter_count(342) == 23);
    assert(number_letter_count(115) == 20);
    printf("016: %d\n", sum_letter_count_until_n(1000));
    printf("017: %d\n", sum_letter_count_until_n(1000));
}

M src/018.c => src/018.c +54 -40
@@ 1,51 1,65 @@
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include "lib/math.h"

int triangle_path(int x, int y) {
    if (x > y)
        x = y;
    return nth_triangular(y) + x;
}

int maximum_path_sum(int *triangle, size_t size) {
    int i, path;
    for(i=0; i<size; i++) {
        path = triangle_path(i, i);
        printf("%d %d\n", path, triangle[path]);
#define MAX_SIZE 15

int lastRow[MAX_SIZE] = {0};
int currentRow[MAX_SIZE] = {0};

// Process rows by collapsing them into the previous row
void processRow(int count) {
    int index, left, right;

    for (index = 0; index <= count; index++) {
        if (index == 0) {
            currentRow[index] += lastRow[index];
        } else if (index == count) {
            currentRow[index] += lastRow[index - 1];
        } else {
            left = currentRow[index] + lastRow[index - 1];
            right = currentRow[index] + lastRow[index];
            currentRow[index] = (left > right) ? left : right;
        }
    }
    for (index = 0; index <= count; index++) {
        lastRow[index] = currentRow[index];
    }
    return 0;
}

int main(void) {
    int maxSum = 0;
    int temp = 0;
    int row_index = 0;
    int i;
    char c;
    FILE *fp;

void populate_triangle(int *triangle, char filename[]) {
    FILE *file = fopen(filename, "r");
    if (file == NULL) {
        printf("Failed to open file");
        exit(1);
    }
    char c,digit[2];
    int i = 0;
    int digit_index = 0;
    while ((c = fgetc(file)) != EOF) {
        if (c == ' ' || c == '\n') {
            triangle[i++] = atoi(digit);
            digit_index = 0;
    fp = fopen("src/resources/018_triangle.txt", "r");

    while ((c = fgetc(fp)) != EOF) {
        if (c == '\n') {
            currentRow[row_index] = temp;
            processRow(row_index);
            temp = 0;
            row_index = 0;
        } else if (c == ' ') {
            currentRow[row_index] = temp;
            temp = 0;
            row_index++;
        } else {
            digit[digit_index++] = c;
            /* Multiply current digit by ten. Since we are iterating one char
               at the time we will receive a 7 and then a 5, so we need to turn
               a 7 to 70 before adding 5 */
            temp *= 10;
            temp += (c - '0'); // convert ascii char to integer
        }
    }
}
    currentRow[row_index] = temp;
    processRow(row_index);

int main() {
    assert(nth_triangular(4) == 10);
    
    int* triangle = calloc(nth_triangular(15),
                           sizeof(int));
    populate_triangle(triangle, "src/resources/018_triangle.txt");
    maximum_path_sum(triangle, 3);
    /* assert(maximum_path_sum(triangle, 3) == 393600); */
    /* printf("018: %d\n", maximum_path_sum(triangle, 15)); */
    free(triangle);
    for (i=0; i<=MAX_SIZE; i++) {
        if (maxSum < lastRow[i]) {
            maxSum = lastRow[i];
        }
    }
    printf("018: %d", maxSum);
}