feat(day_9): improvements but not enough, some corner-case is still arround
This commit is contained in:
@@ -98,90 +98,79 @@ function is_area_red_green(
|
|||||||
// Error 1: 4560365591
|
// Error 1: 4560365591
|
||||||
// Error 2: 248032161
|
// Error 2: 248032161
|
||||||
// Error 3: 4638219675
|
// Error 3: 4638219675
|
||||||
// NOTE: I do not need to verify every wall, just the opposite corners
|
const { red_tiles: tiles } = floor;
|
||||||
// Verify left wall
|
|
||||||
const ls_cover = floor.red_tiles.some((tile) => {
|
|
||||||
return (tile.x === tl_corner.x && tile.y <= tl_corner.y &&
|
|
||||||
((floor.red_tiles.some((tile_2) =>
|
|
||||||
tile_2.x === tile.x && tile_2.y >= bl_corner.y
|
|
||||||
)) || (floor.red_tiles.some((tile_3) =>
|
|
||||||
tile_3.x <= tile.x && tile_3.y >= bl_corner.y &&
|
|
||||||
floor.red_tiles.some((tile_4) =>
|
|
||||||
tile_3.x <= tile_4.x && tile_3.y === tile_4.y
|
|
||||||
)
|
|
||||||
)))) ||
|
|
||||||
(tile.x === bl_corner.x && tile.y <= bl_corner.y &&
|
|
||||||
((floor.red_tiles.some((tile_2) =>
|
|
||||||
tile_2.x === tile.x && tile_2.y <= tl_corner.y
|
|
||||||
)) || (floor.red_tiles.some((tile_3) =>
|
|
||||||
tile_3.x <= tile.x && tile_3.y <= tl_corner.y &&
|
|
||||||
floor.red_tiles.some((tile_4) =>
|
|
||||||
tile_3.x <= tile_4.x && tile_3.y === tile_4.y
|
|
||||||
)
|
|
||||||
)))); // NOTE: should also compare with opposite situation (first side and then point or 2 sides)
|
|
||||||
});
|
|
||||||
const rs_cover = floor.red_tiles.some((tile) => {
|
|
||||||
return (tile.x === tr_corner.x && tile.y <= tr_corner.y &&
|
|
||||||
((floor.red_tiles.some((tile_2) =>
|
|
||||||
tile_2.x === tile.x && tile_2.y >= br_corner.y
|
|
||||||
)) || (floor.red_tiles.some((tile_3) =>
|
|
||||||
tile_3.x <= tile.x && tile_3.y >= br_corner.y &&
|
|
||||||
floor.red_tiles.some((tile_4) =>
|
|
||||||
tile_3.x <= tile_4.x && tile_3.y === tile_4.y
|
|
||||||
)
|
|
||||||
)))) ||
|
|
||||||
(tile.x === br_corner.x && tile.y >= br_corner.y &&
|
|
||||||
((floor.red_tiles.some((tile_2) =>
|
|
||||||
tile_2.x === tile.x && tile_2.y <= tr_corner.y
|
|
||||||
)) || (floor.red_tiles.some((tile_3) =>
|
|
||||||
tile_3.x <= tile.x && tile_3.y <= tr_corner.y &&
|
|
||||||
floor.red_tiles.some((tile_4) =>
|
|
||||||
tile_3.x <= tile_4.x && tile_3.y === tile_4.y
|
|
||||||
)
|
|
||||||
)))); // NOTE: should also compare with opposite situation (first side and then point)
|
|
||||||
});
|
|
||||||
const ts_cover = floor.red_tiles.some((tile) => {
|
|
||||||
return (tile.x <= tl_corner.x && tile.y === tr_corner.y &&
|
|
||||||
((floor.red_tiles.some((tile_2) =>
|
|
||||||
tile_2.x >= tr_corner.x && tile_2.y === tile.y
|
|
||||||
)) || (floor.red_tiles.some((tile_3) =>
|
|
||||||
tile_3.x >= tile.x && tile_3.y <= tr_corner.y &&
|
|
||||||
floor.red_tiles.some((tile_4) =>
|
|
||||||
tile_3.x === tile_4.x && tile_3.y >= tile_4.y
|
|
||||||
)
|
|
||||||
)))) ||
|
|
||||||
(tile.x >= bl_corner.x && tile.y === br_corner.y &&
|
|
||||||
((floor.red_tiles.some((tile_2) =>
|
|
||||||
tile_2.x <= br_corner.x && tile_2.y === tile.y
|
|
||||||
)) || (floor.red_tiles.some((tile_3) =>
|
|
||||||
tile_3.x >= tile.x && tile_3.y >= br_corner.y &&
|
|
||||||
floor.red_tiles.some((tile_4) =>
|
|
||||||
tile_3.x === tile_4.x && tile_3.y >= tile_4.y
|
|
||||||
)
|
|
||||||
)))); // NOTE: should also compare with opposite situation (first side and then point)
|
|
||||||
});
|
|
||||||
const bs_cover = floor.red_tiles.some((tile) => {
|
|
||||||
return (tile.x <= bl_corner.x && tile.y === bl_corner.y &&
|
|
||||||
((floor.red_tiles.some((tile_2) =>
|
|
||||||
tile_2.x >= tr_corner.x && tile_2.y === tile.y
|
|
||||||
)) || (floor.red_tiles.some((tile_3) =>
|
|
||||||
tile_3.x >= tile.x && tile_3.y >= br_corner.y &&
|
|
||||||
floor.red_tiles.some((tile_4) =>
|
|
||||||
tile_3.x === tile_4.x && tile_3.y <= tile_4.y
|
|
||||||
)
|
|
||||||
)))) ||
|
|
||||||
(tile.x >= tr_corner.x && tile.y === tr_corner.y &&
|
|
||||||
((floor.red_tiles.some((tile_2) =>
|
|
||||||
tile_2.x <= tl_corner.x && tile_2.y === tile.y
|
|
||||||
)) || (floor.red_tiles.some((tile_3) =>
|
|
||||||
tile_3.x >= tile.x && tile_3.y <= tr_corner.y &&
|
|
||||||
floor.red_tiles.some((tile_4) =>
|
|
||||||
tile_3.x === tile_4.x && tile_3.y <= tile_4.y
|
|
||||||
)
|
|
||||||
)))); // NOTE: should also compare with opposite situation (first side and then point)
|
|
||||||
});
|
|
||||||
|
|
||||||
return ls_cover && rs_cover && ts_cover && bs_cover;
|
let first_verify = false;
|
||||||
|
if (
|
||||||
|
tl_corner.x === a.x && tl_corner.y === a.y ||
|
||||||
|
tl_corner.x === b.x && tl_corner.y === b.y
|
||||||
|
) {
|
||||||
|
first_verify = tiles.some((tile) =>
|
||||||
|
tile.x === tl_corner.x && tile.y >= max_y ||
|
||||||
|
tile.x <= min_x && tile.y === max_y
|
||||||
|
) || tiles.some((tile) =>
|
||||||
|
tile.x <= min_x && tile.y <= max_y && tiles.some((tile_2) =>
|
||||||
|
tile_2.y >= max_y && tile_2.x === tile.x
|
||||||
|
)
|
||||||
|
) || tiles.some((tile) =>
|
||||||
|
tile.y >= max_y && tile.x <= min_x && tiles.some((tile_2) =>
|
||||||
|
tile_2.x >= min_x && tile_2.y === tile.y
|
||||||
|
)
|
||||||
|
);
|
||||||
|
} else if (
|
||||||
|
tr_corner.x === a.x && tr_corner.y === a.y ||
|
||||||
|
tr_corner.x === b.x && tr_corner.y === b.y
|
||||||
|
) {
|
||||||
|
first_verify = tiles.some((tile) =>
|
||||||
|
tile.x === tr_corner.x && tile.y >= max_y ||
|
||||||
|
tile.x >= max_x && tile.y === max_y
|
||||||
|
) || tiles.some((tile) =>
|
||||||
|
tile.x >= max_x && tile.y <= max_y && tiles.some((tile_2) =>
|
||||||
|
tile_2.y >= max_y && tile_2.x === tile.x
|
||||||
|
)
|
||||||
|
) || tiles.some((tile) =>
|
||||||
|
tile.y >= max_y && tile.x >= max_x && tiles.some((tile_2) =>
|
||||||
|
tile_2.x <= min_x && tile_2.y === tile.y
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
let second_verify = false;
|
||||||
|
if (
|
||||||
|
bl_corner.x === a.x && bl_corner.y === a.y ||
|
||||||
|
bl_corner.x === b.x && bl_corner.y === b.y
|
||||||
|
) {
|
||||||
|
second_verify = tiles.some((tile) =>
|
||||||
|
tile.x === min_x && tile.y <= min_y ||
|
||||||
|
tile.x <= min_x && tile.y === min_y
|
||||||
|
) || tiles.some((tile) =>
|
||||||
|
tile.x <= min_x && tile.y <= min_y && tiles.some((tile_2) =>
|
||||||
|
tile_2.y >= min_y && tile_2.x === tile.x
|
||||||
|
)
|
||||||
|
) || tiles.some((tile) =>
|
||||||
|
tile.y <= min_y && tile.x <= min_x && tiles.some((tile_2) =>
|
||||||
|
tile_2.x >= min_x && tile_2.y === tile.y
|
||||||
|
)
|
||||||
|
);
|
||||||
|
} else if (
|
||||||
|
br_corner.x === a.x && br_corner.y === a.y ||
|
||||||
|
br_corner.x === b.x && br_corner.y === b.y
|
||||||
|
) {
|
||||||
|
second_verify = tiles.some((tile) =>
|
||||||
|
tile.x === tr_corner.x && tile.y <= min_y ||
|
||||||
|
tile.x >= max_x && tile.y === min_y
|
||||||
|
) || tiles.some((tile) =>
|
||||||
|
tile.x >= max_x && tile.y <= min_y && tiles.some((tile_2) =>
|
||||||
|
tile_2.y >= min_y && tile_2.x === tile.x
|
||||||
|
)
|
||||||
|
) || tiles.some((tile) =>
|
||||||
|
tile.y <= min_y && tile.x <= max_x && tiles.some((tile_2) =>
|
||||||
|
tile_2.x >= max_x && tile_2.y === tile.y
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return first_verify && second_verify;
|
||||||
}
|
}
|
||||||
|
|
||||||
function calc_distance(a: Coordinate, b: Coordinate): number {
|
function calc_distance(a: Coordinate, b: Coordinate): number {
|
||||||
|
|||||||
Reference in New Issue
Block a user