This commit is contained in:
Chris
2024-12-11 12:20:05 +00:00
parent c92c847701
commit 8b9c5f91fe
2 changed files with 108 additions and 48 deletions

View File

@@ -4,9 +4,7 @@ const input = fs.readFileSync(__dirname + '/input.txt', 'utf8');
interface MyFile { id: number, addr: number, size: number }; interface MyFile { id: number, addr: number, size: number };
const freeSpaces: Array<{ addr: number, size: number }> = [];
const files: Array<MyFile> = []; const files: Array<MyFile> = [];
const reorderedFiles: Array<MyFile> = [];
let pointer = 0; let pointer = 0;
let id = 0; let id = 0;
@@ -16,18 +14,10 @@ for (let i = 0; i < input.length; i++) {
if (i % 2 === 0) { if (i % 2 === 0) {
files.push({ id, size, addr: pointer }); files.push({ id, size, addr: pointer });
id++; id++;
} else if (size) {
freeSpaces.push({ addr: pointer, size });
} }
pointer += size; pointer += size;
} }
const finalSpace = { addr: pointer, size: 0 };
if (input.length % 2 !== 0) {
freeSpaces.push(finalSpace);
}
function printDisk() { function printDisk() {
const disk: Array<string> = []; const disk: Array<string> = [];
files.forEach((file) => { files.forEach((file) => {
@@ -35,28 +25,48 @@ function printDisk() {
disk[i] = ''+file.id; 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) { while (true) {
const lastFile = files.pop()!; const lastFile = files.pop()!;
let remainingSize = lastFile.size; let remainingSize = lastFile.size;
console.log(files, lastFile, freeSpaces);
while (remainingSize > 0) { 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 filePartSize;
let remainingFreeSpace; let remainingFreeSpace;
if (remainingSize < firstFreeSpace.size) { if (remainingSize < firstFreeSpace.size) {
@@ -66,35 +76,14 @@ while (true) {
filePartSize = firstFreeSpace.size; filePartSize = firstFreeSpace.size;
remainingFreeSpace = 0; remainingFreeSpace = 0;
} }
reorderedFiles.push({ addr: firstFreeSpace.addr, id: lastFile.id, size: filePartSize }); files.splice(firstFreeSpace.index, 0, { addr: firstFreeSpace.addr, id: lastFile.id, size: filePartSize });
finalSpace.size += filePartSize;
finalSpace.addr -= filePartSize;
remainingSize -= 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; let checksum = 0;
const allFiles = files.concat(reorderedFiles); files.forEach((file) => {
allFiles.sort((a, b) => a.addr - b.addr);
console.log(allFiles, freeSpaces);
allFiles.forEach((file) => {
for (let i = file.addr; i < file.addr + file.size; i++) { for (let i = file.addr; i < file.addr + file.size; i++) {
checksum += i * file.id; checksum += i * file.id;
} }

71
2024/09/index2.ts Normal file
View File

@@ -0,0 +1,71 @@
const fs = require('fs');
const input = fs.readFileSync(__dirname + '/input.txt', 'utf8');
interface MyFile { id: number, addr: number, size: number };
const files: Array<MyFile> = [];
let pointer = 0;
let id = 0;
for (let i = 0; i < input.length; i++) {
const size = parseInt(input[i]);
if (i % 2 === 0) {
files.push({ id, size, addr: pointer });
id++;
}
pointer += size;
}
function printDisk() {
const disk: Array<string> = [];
files.forEach((file) => {
for (let i = file.addr; i < file.addr + file.size; i++) {
disk[i] = ''+file.id;
}
});
let diskStr = '';
for (let i = 0; i < disk.length; i++) {
diskStr += disk[i] || '.';
}
console.log(diskStr);
}
function getFirstSpace(size: number): 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 >= size) {
return {
addr: fileEnd,
size: nextFile.addr - fileEnd,
index: i + 1,
};
}
}
}
return null;
}
files.slice().reverse().forEach((lastFile, i) => {
const firstFreeSpace = getFirstSpace(lastFile.size);
if (!firstFreeSpace || firstFreeSpace.addr >= lastFile.addr) {
return;
}
files.splice(files.indexOf(lastFile), 1);
files.splice(firstFreeSpace.index, 0, { addr: firstFreeSpace.addr, id: lastFile.id, size: lastFile.size });
});
let checksum = 0;
files.forEach((file) => {
for (let i = file.addr; i < file.addr + file.size; i++) {
checksum += i * file.id;
}
});
console.log(checksum);