saw part 2 coming so it was indeed straightforward
This commit is contained in:
		
							
								
								
									
										91
									
								
								05/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								05/index.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,91 @@
 | 
				
			|||||||
 | 
					import fs from "node:fs";
 | 
				
			||||||
 | 
					import { printTime, now } from "../util";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const test = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const data = fs.readFileSync(
 | 
				
			||||||
 | 
					  test ? "./inputs/testinput" : "./inputs/input",
 | 
				
			||||||
 | 
					  "utf8"
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					let timer = now.instant();
 | 
				
			||||||
 | 
					console.log(
 | 
				
			||||||
 | 
					  "part one:",
 | 
				
			||||||
 | 
					  (() => {
 | 
				
			||||||
 | 
					    const { ordering, manuals } = data
 | 
				
			||||||
 | 
					      .split("\n")
 | 
				
			||||||
 | 
					      .slice(0, -1)
 | 
				
			||||||
 | 
					      .reduce(
 | 
				
			||||||
 | 
					        (coll, curr) => {
 | 
				
			||||||
 | 
					          if (curr === "") {
 | 
				
			||||||
 | 
					            return coll;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          if (curr[2] === "|") {
 | 
				
			||||||
 | 
					            return { ...coll, ordering: [...coll.ordering, curr.split("|")] };
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          if (curr[2] === ",") {
 | 
				
			||||||
 | 
					            return { ...coll, manuals: [...coll.manuals, curr.split(",")] };
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          return coll;
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        { ordering: [], manuals: [] } as {
 | 
				
			||||||
 | 
					          ordering: Array<Array<string>>;
 | 
				
			||||||
 | 
					          manuals: Array<Array<string>>;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return manuals.reduce((coll, curr) => {
 | 
				
			||||||
 | 
					      const sorted = [...curr].sort((a, b) => {
 | 
				
			||||||
 | 
					        return ordering.filter((v) => v[0] === a && v[1] === b).length === 0
 | 
				
			||||||
 | 
					          ? 1
 | 
				
			||||||
 | 
					          : -1;
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      if (sorted.join(",") === curr.join(",")) {
 | 
				
			||||||
 | 
					        return coll + parseInt(curr[Math.floor(curr.length / 2)], 10);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return coll;
 | 
				
			||||||
 | 
					    }, 0);
 | 
				
			||||||
 | 
					  })(),
 | 
				
			||||||
 | 
					  printTime(now.instant().since(timer))
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					timer = now.instant();
 | 
				
			||||||
 | 
					console.log(
 | 
				
			||||||
 | 
					  "part two:",
 | 
				
			||||||
 | 
					  (() => {
 | 
				
			||||||
 | 
					    const { ordering, manuals } = data
 | 
				
			||||||
 | 
					      .split("\n")
 | 
				
			||||||
 | 
					      .slice(0, -1)
 | 
				
			||||||
 | 
					      .reduce(
 | 
				
			||||||
 | 
					        (coll, curr) => {
 | 
				
			||||||
 | 
					          if (curr === "") {
 | 
				
			||||||
 | 
					            return coll;
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          if (curr[2] === "|") {
 | 
				
			||||||
 | 
					            return { ...coll, ordering: [...coll.ordering, curr.split("|")] };
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          if (curr[2] === ",") {
 | 
				
			||||||
 | 
					            return { ...coll, manuals: [...coll.manuals, curr.split(",")] };
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					          return coll;
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        { ordering: [], manuals: [] } as {
 | 
				
			||||||
 | 
					          ordering: Array<Array<string>>;
 | 
				
			||||||
 | 
					          manuals: Array<Array<string>>;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return manuals.reduce((coll, curr) => {
 | 
				
			||||||
 | 
					      const sorted = [...curr].sort((a, b) => {
 | 
				
			||||||
 | 
					        return ordering.filter((v) => v[0] === a && v[1] === b).length === 0
 | 
				
			||||||
 | 
					          ? 1
 | 
				
			||||||
 | 
					          : -1;
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					      if (sorted.join(",") !== curr.join(",")) {
 | 
				
			||||||
 | 
					        return coll + parseInt(sorted[Math.floor(curr.length / 2)], 10);
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      return coll;
 | 
				
			||||||
 | 
					    }, 0);
 | 
				
			||||||
 | 
					  })(),
 | 
				
			||||||
 | 
					  printTime(now.instant().since(timer))
 | 
				
			||||||
 | 
					);
 | 
				
			||||||
		Reference in New Issue
	
	Block a user