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) === '#'; }