smt
12/4/2017 - 3:22 PM

AoC 2017 - Day 2

AoC 2017 - Day 2

function prepare(data) {
    return data
        .split('\n')
        .map(x => x
            .split('\t')
            .map(Number)
        );
}

function findMinMax(nums) {
    return [
        Math.min.apply(Math, nums),
        Math.max.apply(Math, nums)
    ];
}

function findQuotient(nums) {
    const sortedNums = nums.slice().filter(Boolean).sort((a, b) => b - a);
    function go(xs) {
        for (let i = 1; i < xs.length; i += 1) {
            const mod = xs[0] % xs[i];
            if (mod === 0) {
                return xs[0] / xs[i];
            }
        }
        return go(xs.slice(1));
    }
    return go(sortedNums);
}

function checksum(data) {
    return prepare(data)
        .map(findMinMax)
        .reduce((a, [min, max]) => a + (max - min), 0);
}

function checksum2(data) {
    return prepare(data)
        .map(findQuotient)
        .reduce((a, quotient) => a + quotient, 0);
}

//console.log('part 1:', checksum(input));
//console.log('part 2:', checksum2(input));