day one
This commit is contained in:
		
							
								
								
									
										59
									
								
								01/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								01/index.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,59 @@
 | 
			
		||||
import fs from "node:fs";
 | 
			
		||||
 | 
			
		||||
const data = fs.readFileSync("./inputs/input", "utf8");
 | 
			
		||||
 | 
			
		||||
console.log(
 | 
			
		||||
  "part one:",
 | 
			
		||||
  data
 | 
			
		||||
    .split("\n")
 | 
			
		||||
    .slice(0, -1) // remove empty trailing newline
 | 
			
		||||
    .map(
 | 
			
		||||
      (v) => v.split(" ").filter((c) => c) // abusing js string nullity to remove empty members
 | 
			
		||||
    )
 | 
			
		||||
    .reduce(
 | 
			
		||||
      (result, current) => {
 | 
			
		||||
        // build two arrays, one of each column
 | 
			
		||||
        result[0].push(parseInt(current[0], 10));
 | 
			
		||||
        result[1].push(parseInt(current[1], 10));
 | 
			
		||||
        return result;
 | 
			
		||||
      },
 | 
			
		||||
      [[], []] as Array<Array<number>>
 | 
			
		||||
    )
 | 
			
		||||
    .map((list) => [...list].sort()) // hacky return-sorted-values step
 | 
			
		||||
    .reduce((result, current) => {
 | 
			
		||||
      // rotate arrays into pairs
 | 
			
		||||
      current.forEach((n, i) => {
 | 
			
		||||
        result[i] === undefined ? (result[i] = [n]) : result[i].push(n);
 | 
			
		||||
      });
 | 
			
		||||
      return result;
 | 
			
		||||
    }, [] as Array<Array<number>>)
 | 
			
		||||
    .reduce((result, current) => {
 | 
			
		||||
      // do the math
 | 
			
		||||
      return result + Math.abs(current[0] - current[1]);
 | 
			
		||||
    }, 0)
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
console.log(
 | 
			
		||||
  "part two:",
 | 
			
		||||
  Object.entries(
 | 
			
		||||
    data
 | 
			
		||||
      .split("\n")
 | 
			
		||||
      .slice(0, -1) // remove empty trailing newline
 | 
			
		||||
      .map(
 | 
			
		||||
        (v) => v.split(" ").filter((c) => c) // abusing js string nullity to remove empty members
 | 
			
		||||
      )
 | 
			
		||||
      .reduce((result, current) => {
 | 
			
		||||
        // build one object that contains the full set of frequencies
 | 
			
		||||
        result[current[0]] = !result[current[0]]
 | 
			
		||||
          ? [1, 0]
 | 
			
		||||
          : [result[current[0]][0] + 1, result[current[0]][1]];
 | 
			
		||||
        result[current[1]] = !result[current[1]]
 | 
			
		||||
          ? [0, 1]
 | 
			
		||||
          : [result[current[1]][0], result[current[1]][1] + 1];
 | 
			
		||||
        return result;
 | 
			
		||||
      }, [] as Array<Array<number>>)
 | 
			
		||||
  ).reduce((result, current) => {
 | 
			
		||||
    // and then just reduce down the object.
 | 
			
		||||
    return result + parseInt(current[0], 10) * current[1][0] * current[1][1];
 | 
			
		||||
  }, 0)
 | 
			
		||||
);
 | 
			
		||||
		Reference in New Issue
	
	Block a user