99 lines
2.7 KiB
TypeScript
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) === '#';
|
|
} |