diff --git a/2024/09/solution.js b/2024/09/solution.js new file mode 100644 index 0000000..4cba1bf --- /dev/null +++ b/2024/09/solution.js @@ -0,0 +1,55 @@ + +const input = (await Bun.file("input.txt").text()).trim() + +// const input = "12345"; + +const files = []; + +const spaces = []; + +let pos = 0; +for (let i = 0; i < input.length; i++ ) { + const size = parseInt(input[i]) + if (i % 2 == 0) { + files.push({size, id: i / 2, start: pos,}) + } else { + spaces.push({size, start: pos}) + } + pos += size; +} + +const inserted = []; + +let j = 0; +let end; +for (let i = files.length - 1; j < spaces.length; i--) { + const file = files[i]; + + let rem = file.size; + while (rem > 0) { + const space = spaces[j]; + if (space.start > file.start) { + end = file.start + file.size; + break; + }; + const amt = Math.min(space.size, files[i].size) + + spaces[j] = {size: space.size - amt, start: space.start + amt}; + inserted.push({id: file.id, start: space.start, size: amt,}) + files[i] = {id: file.id, start: file.start, size: files[i].size - amt,}; + rem -= amt; + + if (amt == space.size) j++ + } + + if (end) break +} + +const newfiles = files.concat(inserted) + .filter(file => file.size > 0) + .sort((a, b) => a.start > b.start) + +const checksum = newfiles.reduce((acc, current) => acc + (current.id * current.size * (current.start + (current.size - 1) / 2)), 0) + +console.log(checksum) +