Advertisement
Guest User

DAY 14 | AOC

a guest
Dec 14th, 2022
160
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import * as fs from "fs/promises";
  2.  
  3. async function part1() {
  4.   const input = (await fs.readFile("./day14/input.txt")).toString().split("\n");
  5.  
  6.   // CaveMap
  7.   const caveMap: string[][] = [];
  8.   for (var i = 0; i < 250; i++) {
  9.     caveMap.push([]);
  10.     for (var j = 0; j < 1000; j++) {
  11.       caveMap[i].push(".");
  12.     }
  13.   }
  14.  
  15.   // Parsing Input
  16.   input.forEach((line) => {
  17.     const points = line.split("->");
  18.     for (var i = 1; i < points.length; i++) {
  19.       const p1 = points[i - 1]
  20.         .trim()
  21.         .split(",")
  22.         .map((p) => parseInt(p));
  23.       const p2 = points[i]
  24.         .trim()
  25.         .split(",")
  26.         .map((p) => parseInt(p));
  27.  
  28.       // console.log(p1, p2);
  29.       caveMap[p2[1]][p2[0]] = "#";
  30.       if (p1[0] === p2[0]) {
  31.         var diff = p1[1] - p2[1];
  32.         if (diff < 0) {
  33.           while (diff !== 0) {
  34.             p2[1]--;
  35.             diff++;
  36.             caveMap[p2[1]][p2[0]] = "#";
  37.             // console.log(p1, p2);
  38.           }
  39.         } else {
  40.           while (diff !== 0) {
  41.             p2[1]++;
  42.             diff--;
  43.             caveMap[p2[1]][p2[0]] = "#";
  44.             // console.log(p1, p2);
  45.           }
  46.         }
  47.       } else if (p1[1] === p2[1]) {
  48.         var diff = p1[0] - p2[0];
  49.         if (diff < 0) {
  50.           while (diff !== 0) {
  51.             p2[0]--;
  52.             diff++;
  53.             caveMap[p2[1]][p2[0]] = "#";
  54.             // console.log(p1, p2);
  55.           }
  56.         } else {
  57.           while (diff !== 0) {
  58.             p2[0]++;
  59.             diff--;
  60.             caveMap[p2[1]][p2[0]] = "#";
  61.             // console.log(p1, p2);
  62.           }
  63.         }
  64.       }
  65.       // console.log("\n");
  66.     }
  67.   });
  68.  
  69.   // Sand
  70.   caveMap[0][500] = "+";
  71.   var i = 0;
  72.   var j = 500;
  73.   var count = 0;
  74.  
  75.   // Simulating Sand
  76.   while (
  77.     i + 1 < caveMap.length &&
  78.     j < caveMap[0].length &&
  79.     caveMap[1][500] !== "o"
  80.   ) {
  81.     // console.log(i, j);
  82.     if (caveMap[i + 1][j] === "#" || caveMap[i + 1][j] === "o") {
  83.       if (caveMap[i + 1][j - 1] === ".") {
  84.         i++;
  85.         j--;
  86.       } else if (caveMap[i + 1][j + 1] === ".") {
  87.         i++;
  88.         j++;
  89.       } else {
  90.         caveMap[i][j] = "o";
  91.         i = 0;
  92.         j = 500;
  93.         count++;
  94.       }
  95.     } else {
  96.       i++;
  97.     }
  98.   }
  99.   console.log("PART 1 : ", count);
  100. }
  101.  
  102. async function part2() {
  103.   const input = (await fs.readFile("./day14/input.txt")).toString().split("\n");
  104.  
  105.   // CaveMap
  106.   const caveMap: string[][] = [];
  107.   for (var i = 0; i < 250; i++) {
  108.     caveMap.push([]);
  109.     for (var j = 0; j < 1000; j++) {
  110.       caveMap[i].push(".");
  111.     }
  112.   }
  113.  
  114.   // Base - 2 CoOrdinate
  115.   var maxY = 0;
  116.  
  117.   // Parsing Input
  118.   input.forEach((line) => {
  119.     const points = line.split("->");
  120.     for (var i = 1; i < points.length; i++) {
  121.       const p1 = points[i - 1]
  122.         .trim()
  123.         .split(",")
  124.         .map((p) => parseInt(p));
  125.       const p2 = points[i]
  126.         .trim()
  127.         .split(",")
  128.         .map((p) => parseInt(p));
  129.  
  130.       const maxPY = Math.max(p1[1], p2[1]);
  131.       if (maxPY > maxY) {
  132.         maxY = maxPY;
  133.       }
  134.  
  135.       // console.log(p1, p2);
  136.       caveMap[p2[1]][p2[0]] = "#";
  137.       if (p1[0] === p2[0]) {
  138.         var diff = p1[1] - p2[1];
  139.         if (diff < 0) {
  140.           while (diff !== 0) {
  141.             p2[1]--;
  142.             diff++;
  143.             caveMap[p2[1]][p2[0]] = "#";
  144.             // console.log(p1, p2);
  145.           }
  146.         } else {
  147.           while (diff !== 0) {
  148.             p2[1]++;
  149.             diff--;
  150.             caveMap[p2[1]][p2[0]] = "#";
  151.             // console.log(p1, p2);
  152.           }
  153.         }
  154.       } else if (p1[1] === p2[1]) {
  155.         var diff = p1[0] - p2[0];
  156.         if (diff < 0) {
  157.           while (diff !== 0) {
  158.             p2[0]--;
  159.             diff++;
  160.             caveMap[p2[1]][p2[0]] = "#";
  161.             // console.log(p1, p2);
  162.           }
  163.         } else {
  164.           while (diff !== 0) {
  165.             p2[0]++;
  166.             diff--;
  167.             caveMap[p2[1]][p2[0]] = "#";
  168.             // console.log(p1, p2);
  169.           }
  170.         }
  171.       }
  172.       // console.log("\n");
  173.     }
  174.   });
  175.  
  176.   // Drawing the Base
  177.   // console.log(maxY);
  178.   maxY += 2;
  179.   for (var j = 0; j < caveMap[0].length; j++) {
  180.     caveMap[maxY][j] = "#";
  181.   }
  182.  
  183.   // Sand
  184.   caveMap[0][500] = "+";
  185.   var i = 0;
  186.   var j = 500;
  187.   var count = 0;
  188.  
  189.   // Simulating Sand
  190.   while (
  191.     i + 1 < caveMap.length &&
  192.     j < caveMap[0].length &&
  193.     caveMap[0][500] !== "o"
  194.   ) {
  195.     // console.log(i, j);
  196.     if (caveMap[i + 1][j] === "#" || caveMap[i + 1][j] === "o") {
  197.       if (caveMap[i + 1][j - 1] === ".") {
  198.         i++;
  199.         j--;
  200.       } else if (caveMap[i + 1][j + 1] === ".") {
  201.         i++;
  202.         j++;
  203.       } else {
  204.         caveMap[i][j] = "o";
  205.         i = 0;
  206.         j = 500;
  207.         count++;
  208.       }
  209.     } else {
  210.       i++;
  211.     }
  212.   }
  213.  
  214.   console.log("PART 2 : ", count);
  215. }
  216.  
  217. part1();
  218. part2();
  219.  
  220. // FOR VISUALIZATION EXAMPLE INPUT
  221. async function simulateSand() {
  222.   const input = (await fs.readFile("./day14/input.test.txt")) // Have Example File Input - not actual input file
  223.     .toString()
  224.     .split("\n");
  225.  
  226.   // CaveMap
  227.   const caveMap: string[][] = [];
  228.   for (var i = 0; i < 14; i++) {
  229.     caveMap.push([]);
  230.     for (var j = 0; j < 22; j++) {
  231.       caveMap[i].push(".");
  232.     }
  233.   }
  234.  
  235.   // Base - 2 CoOrdinate
  236.   var maxY = 0;
  237.   const translateBy = 490;
  238.  
  239.   // Parsing Input
  240.   input.forEach((line) => {
  241.     const points = line.split("->");
  242.     for (var i = 1; i < points.length; i++) {
  243.       const p1 = points[i - 1]
  244.         .trim()
  245.         .split(",")
  246.         .map((p) => parseInt(p));
  247.       const p2 = points[i]
  248.         .trim()
  249.         .split(",")
  250.         .map((p) => parseInt(p));
  251.  
  252.       const maxPY = Math.max(p1[1], p2[1]);
  253.       if (maxPY > maxY) {
  254.         maxY = maxPY;
  255.       }
  256.  
  257.       // console.log(p1, p2);
  258.       caveMap[p2[1]][p2[0] - translateBy] = "#";
  259.       if (p1[0] === p2[0]) {
  260.         var diff = p1[1] - p2[1];
  261.         if (diff < 0) {
  262.           while (diff !== 0) {
  263.             p2[1]--;
  264.             diff++;
  265.             caveMap[p2[1]][p2[0] - translateBy] = "#";
  266.             // console.log(p1, p2);
  267.           }
  268.         } else {
  269.           while (diff !== 0) {
  270.             p2[1]++;
  271.             diff--;
  272.             caveMap[p2[1]][p2[0]] = "#";
  273.             // console.log(p1, p2);
  274.           }
  275.         }
  276.       } else if (p1[1] === p2[1]) {
  277.         var diff = p1[0] - p2[0];
  278.         if (diff < 0) {
  279.           while (diff !== 0) {
  280.             p2[0]--;
  281.             diff++;
  282.             caveMap[p2[1]][p2[0] - translateBy] = "#";
  283.             // console.log(p1, p2);
  284.           }
  285.         } else {
  286.           while (diff !== 0) {
  287.             p2[0]++;
  288.             diff--;
  289.             caveMap[p2[1]][p2[0] - translateBy] = "#";
  290.             // console.log(p1, p2);
  291.           }
  292.         }
  293.       }
  294.       // console.log("\n");
  295.     }
  296.   });
  297.  
  298.   // Drawing the Base
  299.   // Un Comment to simulate Part 2
  300.   // console.log(maxY);
  301.   // maxY += 2;
  302.   // for (var j = 0; j < caveMap[0].length; j++) {
  303.   //   caveMap[maxY][j] = "#";
  304.   // }
  305.  
  306.   // Sand
  307.   caveMap[0][500 - translateBy] = "+";
  308.   var i = 0;
  309.   var j = 500 - translateBy;
  310.   var count = 0;
  311.  
  312.   // Simulating Sand
  313.   while (
  314.     i + 1 < caveMap.length &&
  315.     j < caveMap[0].length &&
  316.     caveMap[1][500 - translateBy] !== "o" // change to caveMap[0][500-translatedBy] for Part 2
  317.   ) {
  318.     // console.log(i, j);
  319.     if (caveMap[i + 1][j] === "#" || caveMap[i + 1][j] === "o") {
  320.       if (caveMap[i + 1][j - 1] === ".") {
  321.         i++;
  322.         j--;
  323.       } else if (caveMap[i + 1][j + 1] === ".") {
  324.         i++;
  325.         j++;
  326.       } else {
  327.         caveMap[i][j] = "o";
  328.         i = 0;
  329.         j = 500 - translateBy;
  330.         count++;
  331.       }
  332.     } else {
  333.       i++;
  334.     }
  335.     console.clear();
  336.     console.log(caveMap.map((row) => row.join("")).join("\n"));
  337.     await new Promise((r) => setTimeout(r, 10));
  338.   }
  339.  
  340.   console.log("PART 1 : ", count);
  341. }
  342.  
  343. // simulateSand();
  344.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement