day 3 in the books; add a template starter
This commit is contained in:
		
							
								
								
									
										128
									
								
								03/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								03/index.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,128 @@
 | 
			
		||||
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
 | 
			
		||||
    .reduce((total, line) => {
 | 
			
		||||
      let state = {
 | 
			
		||||
        char: "",
 | 
			
		||||
        multiplicand: "",
 | 
			
		||||
        multiplier: "",
 | 
			
		||||
      };
 | 
			
		||||
      for (let index = 0; index < line.length; index++) {
 | 
			
		||||
        switch (true) {
 | 
			
		||||
          case "0123456789".includes(line[index]) && state.char === "(":
 | 
			
		||||
            state.multiplicand += line[index];
 | 
			
		||||
            break;
 | 
			
		||||
          case "0123456789".includes(line[index]) && state.char === ",":
 | 
			
		||||
            state.multiplier += line[index];
 | 
			
		||||
            break;
 | 
			
		||||
          case state.char === "(" &&
 | 
			
		||||
            line[index] === "," &&
 | 
			
		||||
            state.multiplicand !== "":
 | 
			
		||||
            state.char = line[index];
 | 
			
		||||
            break;
 | 
			
		||||
          case line[index] === ")" &&
 | 
			
		||||
            state.char === "," &&
 | 
			
		||||
            state.multiplier !== "":
 | 
			
		||||
            total +=
 | 
			
		||||
              parseInt(state.multiplicand, 10) * parseInt(state.multiplier, 10);
 | 
			
		||||
            state = { char: "", multiplicand: "", multiplier: "" };
 | 
			
		||||
            break;
 | 
			
		||||
          case line[index] === "m" && state.char === "":
 | 
			
		||||
          case line[index] === "u" && state.char === "m":
 | 
			
		||||
          case line[index] === "l" && state.char === "u":
 | 
			
		||||
          case line[index] === "(" && state.char === "l":
 | 
			
		||||
            state.char = line[index];
 | 
			
		||||
            break;
 | 
			
		||||
          default:
 | 
			
		||||
            state = { char: "", multiplicand: "", multiplier: "" };
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      return total;
 | 
			
		||||
    }, 0)
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
console.log(
 | 
			
		||||
  "part two:",
 | 
			
		||||
  data
 | 
			
		||||
    .split("\n")
 | 
			
		||||
    .slice(0, -1) // remove empty trailing newline
 | 
			
		||||
    .reduce(
 | 
			
		||||
      (total, line) => {
 | 
			
		||||
        let state = {
 | 
			
		||||
          char: "",
 | 
			
		||||
          multiplicand: "",
 | 
			
		||||
          multiplier: "",
 | 
			
		||||
          on: total.on,
 | 
			
		||||
        };
 | 
			
		||||
        for (let index = 0; index < line.length; index++) {
 | 
			
		||||
          switch (true) {
 | 
			
		||||
            case "0123456789".includes(line[index]) && state.char === "mul(":
 | 
			
		||||
              state.multiplicand += line[index];
 | 
			
		||||
              break;
 | 
			
		||||
            case "0123456789".includes(line[index]) && state.char === ",":
 | 
			
		||||
              state.multiplier += line[index];
 | 
			
		||||
              break;
 | 
			
		||||
            case state.char === "mul(" &&
 | 
			
		||||
              line[index] === "," &&
 | 
			
		||||
              state.multiplicand !== "":
 | 
			
		||||
              state.char = line[index];
 | 
			
		||||
              break;
 | 
			
		||||
            case line[index] === ")" &&
 | 
			
		||||
              state.char === "," &&
 | 
			
		||||
              state.multiplier !== "":
 | 
			
		||||
              if (state.on) {
 | 
			
		||||
                total = {
 | 
			
		||||
                  ...total,
 | 
			
		||||
                  sum: (total.sum +=
 | 
			
		||||
                    parseInt(state.multiplicand, 10) *
 | 
			
		||||
                    parseInt(state.multiplier, 10)),
 | 
			
		||||
                };
 | 
			
		||||
              }
 | 
			
		||||
              state = {
 | 
			
		||||
                ...state,
 | 
			
		||||
                char: "",
 | 
			
		||||
                multiplicand: "",
 | 
			
		||||
                multiplier: "",
 | 
			
		||||
              };
 | 
			
		||||
              break;
 | 
			
		||||
            case line[index] === ")" && state.char === "don't(":
 | 
			
		||||
              state = { char: "", multiplicand: "", multiplier: "", on: false };
 | 
			
		||||
              break;
 | 
			
		||||
            case line[index] === ")" && state.char === "do(":
 | 
			
		||||
              state = { char: "", multiplicand: "", multiplier: "", on: true };
 | 
			
		||||
              break;
 | 
			
		||||
            case line[index] === "m" && state.char === "":
 | 
			
		||||
            case line[index] === "u" && state.char === "m":
 | 
			
		||||
            case line[index] === "l" && state.char === "mu":
 | 
			
		||||
            case line[index] === "(" && state.char === "mul":
 | 
			
		||||
            case line[index] === "d" && state.char === "":
 | 
			
		||||
            case line[index] === "o" && state.char === "d":
 | 
			
		||||
            case line[index] === "n" && state.char === "do":
 | 
			
		||||
            case line[index] === "(" && state.char === "do":
 | 
			
		||||
            case line[index] === "'" && state.char === "don":
 | 
			
		||||
            case line[index] === "t" && state.char === "don'":
 | 
			
		||||
            case line[index] === "(" && state.char === "don't":
 | 
			
		||||
              state.char += line[index];
 | 
			
		||||
              break;
 | 
			
		||||
            default:
 | 
			
		||||
              state = {
 | 
			
		||||
                ...state,
 | 
			
		||||
                char: "",
 | 
			
		||||
                multiplicand: "",
 | 
			
		||||
                multiplier: "",
 | 
			
		||||
              };
 | 
			
		||||
              break;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        return { ...total, on: state.on };
 | 
			
		||||
      },
 | 
			
		||||
      { sum: 0, on: true }
 | 
			
		||||
    ).sum
 | 
			
		||||
);
 | 
			
		||||
		Reference in New Issue
	
	Block a user