80 lines
1.9 KiB
TypeScript
80 lines
1.9 KiB
TypeScript
namespace AdventOfCode2019_24_1
|
|
{
|
|
const DAY = 24;
|
|
const PROBLEM = 1;
|
|
|
|
export async function run()
|
|
{
|
|
let input = await AdventOfCode.getInput(DAY);
|
|
if (input == null) return;
|
|
|
|
AdventOfCode.setIntermedOutputSize("5.00vw");
|
|
|
|
let grid = input
|
|
.split(new RegExp('\r?\n'))
|
|
.filter(p => p.trim().length > 0)
|
|
.map(p => p.trim().split('').map(q => q==='#'));
|
|
|
|
await AdventOfCode.outputIntermed(tostr(grid));
|
|
|
|
let hist: {[_:number]:boolean} = {};
|
|
hist[biodiv(grid)] = true;
|
|
|
|
for(;;)
|
|
{
|
|
grid = step(grid);
|
|
let bd = biodiv(grid);
|
|
if (bd in hist)
|
|
{
|
|
AdventOfCode.output(DAY, PROBLEM, bd.toString());
|
|
return;
|
|
}
|
|
hist[bd] = true;
|
|
|
|
await AdventOfCode.outputIntermed(tostr(grid));
|
|
}
|
|
}
|
|
|
|
function tostr(grid: boolean[][]): string
|
|
{
|
|
return grid.map(p => p.map(q => q ? "#" : ".").join("") ).join("\n");
|
|
}
|
|
|
|
function biodiv(grid: boolean[][]): number
|
|
{
|
|
let n = 0;
|
|
for(let y=0; y<5; y++)
|
|
for(let x=0; x<5; x++)
|
|
{
|
|
n += grid[y][x] ? Math.pow(2, y*5+x) : 0;
|
|
}
|
|
return n;
|
|
}
|
|
|
|
function step(grid: boolean[][]): boolean[][]
|
|
{
|
|
let g2 = [
|
|
[false, false, false, false, false],
|
|
[false, false, false, false, false],
|
|
[false, false, false, false, false],
|
|
[false, false, false, false, false],
|
|
[false, false, false, false, false]
|
|
];
|
|
|
|
for(let y=0; y<5; y++)
|
|
for(let x=0; x<5; x++)
|
|
{
|
|
let adjac = 0;
|
|
if (x>0 && grid[y][x-1]) adjac++;
|
|
if (y>0 && grid[y-1][x]) adjac++;
|
|
if (x<4 && grid[y][x+1]) adjac++;
|
|
if (y<4 && grid[y+1][x]) adjac++;
|
|
|
|
if (grid[y][x] && adjac !== 1) g2[y][x] = false; // A bug dies (becoming an empty space) unless there is exactly one bug adjacent to it.
|
|
else if (!grid[y][x] && (adjac === 1 || adjac === 2)) g2[y][x] = true; // An empty space becomes infested with a bug if exactly one or two bugs are adjacent to it.
|
|
else g2[y][x] = grid[y][x]; // Otherwise, a bug or empty space remains the same.
|
|
}
|
|
return g2;
|
|
}
|
|
}
|