expeditaet
Version:
Advent of Code Solutions
78 lines (63 loc) • 1.7 kB
text/typescript
import { IntCodeComputer } from '@alexaegis/advent-of-code-intcode';
import { task } from '@alexaegis/advent-of-code-lib';
import { Direction, Vec2 } from '@alexaegis/advent-of-code-lib/model';
import packageJson from '../package.json';
import { parse } from './parse.js';
export enum Color {
WHITE = '#',
BLACK = '.',
}
export enum ColorCode {
WHITE = 1,
BLACK = 0,
}
export const colorCodeToColor = (cc: ColorCode): Color => {
switch (cc) {
case ColorCode.BLACK: {
return Color.BLACK;
}
case ColorCode.WHITE: {
return Color.WHITE;
}
}
};
export const turnToDir = (cc: Turn): Direction => {
switch (cc) {
case Turn.LEFT: {
return Direction.WEST;
}
case Turn.RIGHT: {
return Direction.EAST;
}
}
};
export enum Turn {
LEFT = 0,
RIGHT = 1,
}
export const p1 = (input: string): number => {
const intcode = new IntCodeComputer(parse(input));
const iter = intcode.iter();
const map = new Map<string, ColorCode>();
const pos = new Vec2(0, 0);
let dir = Direction.NORTH;
let nextColor: IteratorResult<number>;
let nextDir: IteratorResult<number>;
let currentColor = ColorCode.BLACK;
let currentDir: Turn;
intcode.pushInput(currentColor);
nextColor = iter.next();
nextDir = iter.next();
while (!nextColor.done && !nextDir.done && !intcode.isHalt()) {
currentColor = nextColor.value as ColorCode;
currentDir = nextDir.value as Turn;
dir = currentDir === Turn.RIGHT ? dir.right() : dir.left();
map.set(pos.toString(), currentColor);
pos.addMut(dir);
intcode.pushInput(map.get(pos.toString()) ?? ColorCode.BLACK);
nextColor = iter.next();
nextDir = iter.next();
}
return map.size;
};
await task(p1, packageJson.aoc); // 2252 ~44ms