AdventOfCode2020/src/2020-day-03.ts

99 lines
2.7 KiB
TypeScript
Raw Normal View History

2020-12-03 04:28:47 +00:00
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));
2020-12-03 05:31:01 +00:00
let example: string =
`..##.......
#...#...#..
.#....#..#.
..#.#...#.#
.#...##..#.
..#.##.....
.#.#.#....#
.#........#
#.##...#...
#...##....#
.#..#...#.#`;
2020-12-03 04:28:47 +00:00
let tasksResults: any[] = ['N/A', 'N/A'];
describe('Day 02', () => {
2020-12-03 05:31:01 +00:00
let sample = example.split('\n');
2020-12-03 06:52:53 +00:00
let m = neededPanels(3, sample);
2020-12-03 05:31:01 +00:00
let input: string[];
let panels: number;
before(() => {
input = readFileSync('./input/2020-day-03.txt', 'utf-8')
.split('\n');
2020-12-03 06:52:53 +00:00
panels = neededPanels(3, input);
2020-12-03 05:31:01 +00:00
})
2020-12-03 04:28:47 +00:00
describe('task01', () => {
2020-12-03 05:31:01 +00:00
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);
})
2020-12-03 04:28:47 +00:00
it('Calculate', () => {
2020-12-03 05:31:01 +00:00
assert.strictEqual(task01(m, sample), 7);
2020-12-03 06:52:53 +00:00
assert.strictEqual(task01(panels, input), 171);
2020-12-03 05:31:01 +00:00
tasksResults[0] = task01(panels, input)
2020-12-03 04:28:47 +00:00
});
});
describe('test02', () => {
it('Calculate', () => {
2020-12-03 06:52:53 +00:00
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);
2020-12-03 04:28:47 +00:00
});
});
after(() => {
console.log('\ntask 01:', tasksResults[0]);
console.log('\ntask 02:', tasksResults[1]);
});
});
2020-12-03 06:52:53 +00:00
function task01(panels: number, input: string[], down: number = 1, right: number = 3): number {
2020-12-03 05:31:01 +00:00
let trees = 0;
2020-12-03 06:52:53 +00:00
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;
}
}
2020-12-03 05:31:01 +00:00
return trees;
2020-12-03 04:28:47 +00:00
}
2020-12-03 06:52:53 +00:00
function task02(right: number, down: number, input: string[]): number {
return task01(neededPanels(down, input), input, right, down);
}
2020-12-03 05:31:01 +00:00
2020-12-03 06:52:53 +00:00
function neededPanels(y: number, i:string[]) {
return Math.ceil(i.length * y / i[0].length);
}
2020-12-03 05:31:01 +00:00
2020-12-03 06:52:53 +00:00
function isTreeLocation(panels: number, col: number, pattern: string): boolean {
2020-12-03 05:31:01 +00:00
let c = pattern;
2020-12-03 06:52:53 +00:00
for (let i = 0; i < panels; i++) {
2020-12-03 05:31:01 +00:00
c += pattern;
}
return c.charAt(col) === '#';
2020-12-03 04:28:47 +00:00
}