AdventOfCode2020/src/2020-day-03.ts

99 lines
2.7 KiB
TypeScript

import 'mocha';
import assert from 'assert';
import { readFileSync } from 'fs';
let input = readFileSync('./input/2020-day-03.txt', 'utf-8')
.split('\n')
.map(l => parseInt(l.trim(), 10));
let example: string =
`..##.......
#...#...#..
.#....#..#.
..#.#...#.#
.#...##..#.
..#.##.....
.#.#.#....#
.#........#
#.##...#...
#...##....#
.#..#...#.#`;
let tasksResults: any[] = ['N/A', 'N/A'];
describe('Day 02', () => {
let sample = example.split('\n');
let m = neededPanels(3, sample);
let input: string[];
let panels: number;
before(() => {
input = readFileSync('./input/2020-day-03.txt', 'utf-8')
.split('\n');
panels = neededPanels(3, input);
})
describe('task01', () => {
it('find a safe location', () => {
assert.strictEqual(m, 3);
assert.strictEqual(isTreeLocation(m, 0, sample[0]), false);
assert.strictEqual(isTreeLocation(m, 3, sample[1]), false);
assert.strictEqual(isTreeLocation(m, 6, sample[2]), true);
})
it('Calculate', () => {
assert.strictEqual(task01(m, sample), 7);
assert.strictEqual(task01(panels, input), 171);
tasksResults[0] = task01(panels, input)
});
});
describe('test02', () => {
it('Calculate', () => {
assert.strictEqual(task02(1, 3, input), 171);
assert.strictEqual(task02(2, 1, sample), 2);
let slopes = [
task02(1, 1, input),
task02(1, 3, input),
task02(1, 5, input),
task02(1, 7, input),
task02(2, 1, input),
];
assert.strictEqual(slopes[1], 171);
tasksResults[1] = slopes.reduce((t, c) => {
console.log(c, t);
return t *= c
}, 1);
});
});
after(() => {
console.log('\ntask 01:', tasksResults[0]);
console.log('\ntask 02:', tasksResults[1]);
});
});
function task01(panels: number, input: string[], down: number = 1, right: number = 3): number {
let trees = 0;
for (let i = 0; i < input.length; i++) {
let d = i * down;
let r = i * right;
if (input[d]) {
trees += isTreeLocation(panels, r, input[d]) ? 1 : 0;
}
}
return trees;
}
function task02(right: number, down: number, input: string[]): number {
return task01(neededPanels(down, input), input, right, down);
}
function neededPanels(y: number, i:string[]) {
return Math.ceil(i.length * y / i[0].length);
}
function isTreeLocation(panels: number, col: number, pattern: string): boolean {
let c = pattern;
for (let i = 0; i < panels; i++) {
c += pattern;
}
return c.charAt(col) === '#';
}