|
|
@@ -0,0 +1,79 @@
|
|
|
+
|
|
|
+const fs = require('fs');
|
|
|
+const readline = require('readline');
|
|
|
+
|
|
|
+function taxiCab(a, b) {
|
|
|
+ return Math.abs(b[0] - a[0]) + Math.abs(a[1] - b[1]);
|
|
|
+}
|
|
|
+
|
|
|
+function Sensor(arr) {
|
|
|
+ this.pos = [arr[0], arr[1]];
|
|
|
+ this.closestBeacon = [ arr[2], arr[3] ];
|
|
|
+ this.dist = taxiCab(this.pos, this.closestBeacon);
|
|
|
+}
|
|
|
+
|
|
|
+Sensor.prototype.canBeacon = function(pos) {
|
|
|
+ return taxiCab(this.pos, pos) > this.dist || (
|
|
|
+ pos[0] === this.closestBeacon[0] && pos[1] === this.closestBeacon[1]);
|
|
|
+}
|
|
|
+
|
|
|
+Sensor.prototype.canBeDetress = function(pos) {
|
|
|
+ return taxiCab(this.pos, pos) > this.dist;
|
|
|
+}
|
|
|
+
|
|
|
+function checkRow(rowId, minX, maxX, sensors) {
|
|
|
+ let result = 0;
|
|
|
+ for (let i =minX; i < maxX; ++i)
|
|
|
+ if (!sensors.every(s => s.canBeacon([i, rowId])))
|
|
|
+ result++;
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
+function checkPos(sensors, maxSize, i, j) {
|
|
|
+ if (i < maxSize && j < maxSize && i >= 0 && j >=0 && sensors.every(s => s.canBeDetress([i, j])))
|
|
|
+ return [ i, j ];
|
|
|
+ return null;
|
|
|
+}
|
|
|
+
|
|
|
+function findPos(maxSize, sensors) {
|
|
|
+ for (let sensor of sensors) {
|
|
|
+ for (let i =0; i <= sensor.dist +1; ++i) {
|
|
|
+ let j = sensor.dist +1 - i;
|
|
|
+ let result =
|
|
|
+ checkPos(sensors, maxSize, sensor.pos[0] + i, sensor.pos[1] + j) ||
|
|
|
+ checkPos(sensors, maxSize, sensor.pos[0] + i, sensor.pos[1] - j) ||
|
|
|
+ checkPos(sensors, maxSize, sensor.pos[0] - i, sensor.pos[1] - j) ||
|
|
|
+ checkPos(sensors, maxSize, sensor.pos[0] - i, sensor.pos[1] + j);
|
|
|
+ if (result) {
|
|
|
+ console.log(result);
|
|
|
+ return 4000000 * result[0] + result[1];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+async function main() {
|
|
|
+ let sensors = [];
|
|
|
+ let minX = Infinity;
|
|
|
+ let maxX = -Infinity;
|
|
|
+ let maxY = -Infinity;
|
|
|
+ let maxDist = -Infinity;
|
|
|
+ for await (let line of readline.createInterface({ input: process.stdin })) {
|
|
|
+ let sensor = new Sensor(line.match(/(-?\d+)/g).map(i => parseInt(i)));
|
|
|
+ minX = Math.min(minX, sensor.pos[0]);
|
|
|
+ maxX = Math.max(maxX, sensor.pos[0]);
|
|
|
+ maxY = Math.max(maxY, sensor.pos[1]);
|
|
|
+ maxDist = Math.max(maxDist, sensor.dist);
|
|
|
+ sensors.push(sensor);
|
|
|
+ }
|
|
|
+ // part1
|
|
|
+ console.log(checkRow(10, minX -maxDist, maxX + maxDist, sensors));
|
|
|
+ console.log(findPos(20, sensors));
|
|
|
+
|
|
|
+ // part2
|
|
|
+ console.log(checkRow(2000000, minX -maxDist, maxX + maxDist, sensors));
|
|
|
+ console.log(findPos(4000000, sensors));
|
|
|
+};
|
|
|
+
|
|
|
+(main());
|
|
|
+
|