| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- 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());
|