diff --git a/src/exercises/day_9.ts b/src/exercises/day_9.ts index 18c69b4..e347064 100644 --- a/src/exercises/day_9.ts +++ b/src/exercises/day_9.ts @@ -98,90 +98,79 @@ function is_area_red_green( // Error 1: 4560365591 // Error 2: 248032161 // Error 3: 4638219675 - // NOTE: I do not need to verify every wall, just the opposite corners - // 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) - }); + const { red_tiles: tiles } = floor; - 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 {