121 lines
2.5 KiB
TypeScript
121 lines
2.5 KiB
TypeScript
import { sumArray } from '../../utils/array.ts';
|
|
|
|
export function solveFirst(input: string): number {
|
|
const finalPositions = decompressInput(input);
|
|
|
|
let l = 0;
|
|
let r = finalPositions.length - 1;
|
|
while (l < r) {
|
|
if (finalPositions[l] !== -1) {
|
|
l++;
|
|
continue;
|
|
}
|
|
|
|
if (finalPositions[r] === -1) {
|
|
r--;
|
|
continue;
|
|
}
|
|
|
|
finalPositions[l] = finalPositions[r];
|
|
finalPositions[r] = -1;
|
|
l++;
|
|
r--;
|
|
}
|
|
|
|
return sumArray(finalPositions.map((v, i) => (v > 0 ? v * i : 0)));
|
|
}
|
|
|
|
function decompressInput(input: string) {
|
|
const len = input.length;
|
|
const finalPositions: number[] = [];
|
|
|
|
for (let i = 0; i < len; i++) {
|
|
const amount = Number(input[i]);
|
|
|
|
const id = i % 2 === 0 ? Math.floor(i / 2) : -1;
|
|
for (let j = 0; j < amount; j++) {
|
|
finalPositions.push(id);
|
|
}
|
|
}
|
|
return finalPositions;
|
|
}
|
|
|
|
function getSpaceMap(memory: number[]) {
|
|
const spaces = Array.from({ length: 10 }, () => [] as number[]);
|
|
|
|
let i = 0;
|
|
while (i < memory.length) {
|
|
if (memory[i] >= 0) {
|
|
// not a space
|
|
i++;
|
|
continue;
|
|
}
|
|
|
|
let size = 0;
|
|
while (memory[i] < 0) {
|
|
size++;
|
|
i++;
|
|
}
|
|
|
|
// push start position
|
|
spaces[size].push(i - size);
|
|
}
|
|
|
|
return spaces;
|
|
}
|
|
|
|
export function solveSecond(input: string): number {
|
|
const finalPositions = decompressInput(input);
|
|
const spaces = getSpaceMap(finalPositions);
|
|
|
|
// TODO: theres bug in her somewhere
|
|
|
|
let moved: number[] = [];
|
|
let r = finalPositions.length - 1;
|
|
while (r > 0) {
|
|
if (finalPositions[r] < 0) {
|
|
// spaces can't be moved
|
|
r--;
|
|
continue;
|
|
}
|
|
|
|
let size = 0;
|
|
const id = finalPositions[r];
|
|
while (finalPositions[r] === id) {
|
|
r--;
|
|
size++;
|
|
}
|
|
|
|
const firstFreeSpaceSize = spaces.findIndex(
|
|
(sp, si) => si >= size && sp.length > 0 && sp[0] < r
|
|
);
|
|
|
|
if (firstFreeSpaceSize < 0) {
|
|
continue;
|
|
}
|
|
|
|
const spaceIdx = spaces[firstFreeSpaceSize].shift()!;
|
|
|
|
if (moved.includes(id)) {
|
|
continue;
|
|
}
|
|
moved.push(id);
|
|
for (let i = 0; i < size; i++) {
|
|
finalPositions[r + i + 1] = -1;
|
|
finalPositions[spaceIdx + i] = id;
|
|
}
|
|
|
|
const spaceDiff = firstFreeSpaceSize - size;
|
|
if (spaceDiff > 0) {
|
|
spaces[spaceDiff].push(spaceIdx + firstFreeSpaceSize - spaceDiff);
|
|
spaces[spaceDiff].sort((a, b) => a - b);
|
|
}
|
|
|
|
// r = position;
|
|
}
|
|
|
|
// console.log(finalPositions);
|
|
|
|
return sumArray(finalPositions.map((v, i) => (v > 0 ? v * i : 0)));
|
|
}
|