main.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. const fs = require('fs');
  2. const readline = require('readline');
  3. function taxiCab(a, b) {
  4. return Math.abs(b[0] - a[0]) + Math.abs(a[1] - b[1]);
  5. }
  6. function Sensor(arr) {
  7. this.pos = [arr[0], arr[1]];
  8. this.closestBeacon = [ arr[2], arr[3] ];
  9. this.dist = taxiCab(this.pos, this.closestBeacon);
  10. }
  11. Sensor.prototype.canBeacon = function(pos) {
  12. return taxiCab(this.pos, pos) > this.dist || (
  13. pos[0] === this.closestBeacon[0] && pos[1] === this.closestBeacon[1]);
  14. }
  15. Sensor.prototype.canBeDetress = function(pos) {
  16. return taxiCab(this.pos, pos) > this.dist;
  17. }
  18. function checkRow(rowId, minX, maxX, sensors) {
  19. let result = 0;
  20. for (let i =minX; i < maxX; ++i)
  21. if (!sensors.every(s => s.canBeacon([i, rowId])))
  22. result++;
  23. return result;
  24. }
  25. function checkPos(sensors, maxSize, i, j) {
  26. if (i < maxSize && j < maxSize && i >= 0 && j >=0 && sensors.every(s => s.canBeDetress([i, j])))
  27. return [ i, j ];
  28. return null;
  29. }
  30. function findPos(maxSize, sensors) {
  31. for (let sensor of sensors) {
  32. for (let i =0; i <= sensor.dist +1; ++i) {
  33. let j = sensor.dist +1 - i;
  34. let result =
  35. checkPos(sensors, maxSize, sensor.pos[0] + i, sensor.pos[1] + j) ||
  36. checkPos(sensors, maxSize, sensor.pos[0] + i, sensor.pos[1] - j) ||
  37. checkPos(sensors, maxSize, sensor.pos[0] - i, sensor.pos[1] - j) ||
  38. checkPos(sensors, maxSize, sensor.pos[0] - i, sensor.pos[1] + j);
  39. if (result) {
  40. console.log(result);
  41. return 4000000 * result[0] + result[1];
  42. }
  43. }
  44. }
  45. }
  46. async function main() {
  47. let sensors = [];
  48. let minX = Infinity;
  49. let maxX = -Infinity;
  50. let maxY = -Infinity;
  51. let maxDist = -Infinity;
  52. for await (let line of readline.createInterface({ input: process.stdin })) {
  53. let sensor = new Sensor(line.match(/(-?\d+)/g).map(i => parseInt(i)));
  54. minX = Math.min(minX, sensor.pos[0]);
  55. maxX = Math.max(maxX, sensor.pos[0]);
  56. maxY = Math.max(maxY, sensor.pos[1]);
  57. maxDist = Math.max(maxDist, sensor.dist);
  58. sensors.push(sensor);
  59. }
  60. // part1
  61. console.log(checkRow(10, minX -maxDist, maxX + maxDist, sensors));
  62. console.log(findPos(20, sensors));
  63. // part2
  64. console.log(checkRow(2000000, minX -maxDist, maxX + maxDist, sensors));
  65. console.log(findPos(4000000, sensors));
  66. };
  67. (main());