day 9 part 2 wasn't as bad as I thought
This commit is contained in:
		
							
								
								
									
										93
									
								
								09/index.ts
									
									
									
									
									
								
							
							
						
						
									
										93
									
								
								09/index.ts
									
									
									
									
									
								
							@@ -48,9 +48,90 @@ console.log(
 | 
				
			|||||||
  printTime(now.instant().since(timer))
 | 
					  printTime(now.instant().since(timer))
 | 
				
			||||||
);
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// timer = now.instant();
 | 
					timer = now.instant();
 | 
				
			||||||
// console.log(
 | 
					
 | 
				
			||||||
//   "part two:",
 | 
					let spaces: Record<string, number[]> = {
 | 
				
			||||||
//   data.split("\n").slice(0, -1),
 | 
					  1: [],
 | 
				
			||||||
//   printTime(now.instant().since(timer))
 | 
					  2: [],
 | 
				
			||||||
// );
 | 
					  3: [],
 | 
				
			||||||
 | 
					  4: [],
 | 
				
			||||||
 | 
					  5: [],
 | 
				
			||||||
 | 
					  6: [],
 | 
				
			||||||
 | 
					  7: [],
 | 
				
			||||||
 | 
					  8: [],
 | 
				
			||||||
 | 
					  9: [],
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					sparceArray = data
 | 
				
			||||||
 | 
					  .split("\n")
 | 
				
			||||||
 | 
					  .slice(0, -1)[0]
 | 
				
			||||||
 | 
					  .split("")
 | 
				
			||||||
 | 
					  .map(toNum)
 | 
				
			||||||
 | 
					  .reduce((disk, curr, index) => {
 | 
				
			||||||
 | 
					    const fill = index % 2 === 0 ? index / 2 : -1; // -1 represents free space
 | 
				
			||||||
 | 
					    if (fill === -1 && curr !== 0) {
 | 
				
			||||||
 | 
					      // memoize where all the gaps are, and their sizes
 | 
				
			||||||
 | 
					      spaces[curr].push(disk.length);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return [...disk, ...Array.from({ length: curr }, () => fill)];
 | 
				
			||||||
 | 
					  }, [] as Array<number>);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					rightCursor = sparceArray.length - 1;
 | 
				
			||||||
 | 
					while (rightCursor > 0) {
 | 
				
			||||||
 | 
					  if (sparceArray[rightCursor] === -1) {
 | 
				
			||||||
 | 
					    rightCursor--;
 | 
				
			||||||
 | 
					    continue;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  let currentFileToMove = sparceArray[rightCursor];
 | 
				
			||||||
 | 
					  let endOfFile = rightCursor;
 | 
				
			||||||
 | 
					  while (sparceArray[rightCursor - 1] === currentFileToMove) {
 | 
				
			||||||
 | 
					    rightCursor--;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  let fileSize = endOfFile - rightCursor + 1;
 | 
				
			||||||
 | 
					  // find a slot, if it exists
 | 
				
			||||||
 | 
					  let target = Object.entries(spaces).reduce(
 | 
				
			||||||
 | 
					    (target, [size, spaceList]) => {
 | 
				
			||||||
 | 
					      if (toNum(size) >= fileSize) {
 | 
				
			||||||
 | 
					        if (spaceList[0] < target.index) {
 | 
				
			||||||
 | 
					          return { index: spaceList[0], size };
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return target;
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    { index: Infinity, size: "" }
 | 
				
			||||||
 | 
					  );
 | 
				
			||||||
 | 
					  if (target.index < Infinity && target.index < rightCursor) {
 | 
				
			||||||
 | 
					    // slot exists; move the file, update the array, and update the space lists
 | 
				
			||||||
 | 
					    sparceArray.splice(
 | 
				
			||||||
 | 
					      target.index,
 | 
				
			||||||
 | 
					      fileSize,
 | 
				
			||||||
 | 
					      ...sparceArray.slice(rightCursor, rightCursor + fileSize)
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					    sparceArray.splice(
 | 
				
			||||||
 | 
					      rightCursor,
 | 
				
			||||||
 | 
					      fileSize,
 | 
				
			||||||
 | 
					      ...Array.from({ length: fileSize }, () => -1)
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
 | 
					    spaces[target.size].shift();
 | 
				
			||||||
 | 
					    if (toNum(target.size) - fileSize > 0) {
 | 
				
			||||||
 | 
					      spaces[(toNum(target.size) - fileSize).toString()].unshift(
 | 
				
			||||||
 | 
					        target.index + fileSize
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					      spaces[(toNum(target.size) - fileSize).toString()].sort((a, b) =>
 | 
				
			||||||
 | 
					        a > b ? 1 : -1
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  rightCursor--;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					console.log(
 | 
				
			||||||
 | 
					  "part two:",
 | 
				
			||||||
 | 
					  sparceArray.reduce((checksum, curr, i) => {
 | 
				
			||||||
 | 
					    if (curr !== -1) {
 | 
				
			||||||
 | 
					      return checksum + curr * i;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return checksum;
 | 
				
			||||||
 | 
					  }, 0),
 | 
				
			||||||
 | 
					  printTime(now.instant().since(timer))
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user