Day 9
This commit is contained in:
@@ -4,9 +4,7 @@ const input = fs.readFileSync(__dirname + '/input.txt', 'utf8');
|
||||
|
||||
interface MyFile { id: number, addr: number, size: number };
|
||||
|
||||
const freeSpaces: Array<{ addr: number, size: number }> = [];
|
||||
const files: Array<MyFile> = [];
|
||||
const reorderedFiles: Array<MyFile> = [];
|
||||
|
||||
let pointer = 0;
|
||||
let id = 0;
|
||||
@@ -16,18 +14,10 @@ for (let i = 0; i < input.length; i++) {
|
||||
if (i % 2 === 0) {
|
||||
files.push({ id, size, addr: pointer });
|
||||
id++;
|
||||
} else if (size) {
|
||||
freeSpaces.push({ addr: pointer, size });
|
||||
}
|
||||
pointer += size;
|
||||
}
|
||||
|
||||
const finalSpace = { addr: pointer, size: 0 };
|
||||
|
||||
if (input.length % 2 !== 0) {
|
||||
freeSpaces.push(finalSpace);
|
||||
}
|
||||
|
||||
function printDisk() {
|
||||
const disk: Array<string> = [];
|
||||
files.forEach((file) => {
|
||||
@@ -35,28 +25,48 @@ function printDisk() {
|
||||
disk[i] = ''+file.id;
|
||||
}
|
||||
});
|
||||
reorderedFiles.forEach((file) => {
|
||||
for (let i = file.addr; i < file.addr + file.size; i++) {
|
||||
disk[i] = ''+file.id;
|
||||
}
|
||||
});
|
||||
freeSpaces.forEach((space) => {
|
||||
for (let i = space.addr; i < space.addr + space.size; i++) {
|
||||
disk[i] = '.';
|
||||
}
|
||||
});
|
||||
|
||||
console.log(disk.join(''));
|
||||
let diskStr = '';
|
||||
for (let i = 0; i < disk.length; i++) {
|
||||
diskStr += disk[i] || '.';
|
||||
}
|
||||
console.log(diskStr);
|
||||
}
|
||||
|
||||
function getFirstSpace(): null|{ addr: number, size: number, index: number } {
|
||||
for (let i = 0; i < files.length; i++) {
|
||||
const file = files[i];
|
||||
const nextFile = files[i+1];
|
||||
if (file && nextFile) {
|
||||
const fileEnd = file.addr + file.size;
|
||||
if (nextFile.addr > fileEnd) {
|
||||
return {
|
||||
addr: fileEnd,
|
||||
size: nextFile.addr - fileEnd,
|
||||
index: i + 1,
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
console.log(files);
|
||||
|
||||
|
||||
top:
|
||||
while (true) {
|
||||
const lastFile = files.pop()!;
|
||||
let remainingSize = lastFile.size;
|
||||
console.log(files, lastFile, freeSpaces);
|
||||
while (remainingSize > 0) {
|
||||
const firstFreeSpace = freeSpaces.shift()!;
|
||||
const firstFreeSpace = getFirstSpace();
|
||||
if (!firstFreeSpace || firstFreeSpace.addr >= lastFile.addr) {
|
||||
const secondLastFile = files[files.length - 1];
|
||||
files.push({
|
||||
addr: secondLastFile.addr + secondLastFile.size,
|
||||
size: remainingSize,
|
||||
id: lastFile.id,
|
||||
});
|
||||
break top;
|
||||
}
|
||||
let filePartSize;
|
||||
let remainingFreeSpace;
|
||||
if (remainingSize < firstFreeSpace.size) {
|
||||
@@ -66,38 +76,17 @@ while (true) {
|
||||
filePartSize = firstFreeSpace.size;
|
||||
remainingFreeSpace = 0;
|
||||
}
|
||||
reorderedFiles.push({ addr: firstFreeSpace.addr, id: lastFile.id, size: filePartSize });
|
||||
finalSpace.size += filePartSize;
|
||||
finalSpace.addr -= filePartSize;
|
||||
files.splice(firstFreeSpace.index, 0, { addr: firstFreeSpace.addr, id: lastFile.id, size: filePartSize });
|
||||
remainingSize -= filePartSize;
|
||||
if (remainingFreeSpace) {
|
||||
freeSpaces.unshift({ addr: firstFreeSpace.addr + filePartSize, size: remainingFreeSpace });
|
||||
}
|
||||
}
|
||||
|
||||
let i = freeSpaces.length - 2;
|
||||
if (!freeSpaces[i]) {
|
||||
break;
|
||||
}
|
||||
while (freeSpaces[i].addr + freeSpaces[i].size === finalSpace.addr) {
|
||||
finalSpace.addr = freeSpaces[i].addr;
|
||||
finalSpace.size += freeSpaces[i].size;
|
||||
freeSpaces[i] = finalSpace;
|
||||
freeSpaces.pop();
|
||||
i--;
|
||||
}
|
||||
}
|
||||
|
||||
let checksum = 0;
|
||||
|
||||
const allFiles = files.concat(reorderedFiles);
|
||||
allFiles.sort((a, b) => a.addr - b.addr);
|
||||
console.log(allFiles, freeSpaces);
|
||||
|
||||
allFiles.forEach((file) => {
|
||||
files.forEach((file) => {
|
||||
for (let i = file.addr; i < file.addr + file.size; i++) {
|
||||
checksum += i * file.id;
|
||||
}
|
||||
});
|
||||
|
||||
console.log(checksum);
|
||||
console.log(checksum);
|
||||
|
||||
Reference in New Issue
Block a user