add optimisations

This commit is contained in:
2024-12-07 01:32:31 +01:00
parent 2261742442
commit 777f37ca17

View File

@ -6,7 +6,7 @@
/* By: tomoron <tomoron@student.42.fr> +#+ +:+ +#+ */ /* By: tomoron <tomoron@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */ /* +#+#+#+#+#+ +#+ */
/* Created: 2024/07/17 23:03:36 by tomoron #+# #+# */ /* Created: 2024/07/17 23:03:36 by tomoron #+# #+# */
/* Updated: 2024/12/06 13:04:52 by tomoron ### ########.fr */ /* Updated: 2024/12/07 01:26:11 by tomoron ### ########.fr */
/* */ /* */
/* ************************************************************************** */ /* ************************************************************************** */
@ -77,7 +77,7 @@ static void next_dir(int *dir)
} }
} }
static void move(char **map, t_guard *guard) static void move(char **map, t_guard *guard, int replace)
{ {
int nx; int nx;
int ny; int ny;
@ -87,9 +87,11 @@ static void move(char **map, t_guard *guard)
if(is_on_map(map, nx, ny) && map[ny][nx] == '#') if(is_on_map(map, nx, ny) && map[ny][nx] == '#')
{ {
next_dir(guard->dir); next_dir(guard->dir);
move(map, guard); move(map, guard, replace);
return ; return ;
} }
if(replace)
map[guard->pos[0]][guard->pos[1]] = 'X';
guard->pos[0] = ny; guard->pos[0] = ny;
guard->pos[1] = nx; guard->pos[1] = nx;
} }
@ -126,8 +128,8 @@ int is_loop(char **map, t_guard start, int x, int y)
map[x][y] = '#'; map[x][y] = '#';
while(is_on_map(map, guard.pos[1], guard.pos[0])) while(is_on_map(map, guard.pos[1], guard.pos[0]))
{ {
move(map, &guard); move(map, &guard, 0);
if(!memcmp(&guard, &start, sizeof(t_guard)) || i++ > 50000) if(i++ > 6000)
{ {
map[x][y] = '.'; map[x][y] = '.';
return(1); return(1);
@ -143,9 +145,13 @@ long int resolve_part2(char *input, char **split)
int x; int x;
int y; int y;
t_guard guard; t_guard guard;
t_guard tmp;
long int res; long int res;
find_guard(split, &guard); find_guard(split, &guard);
tmp = guard;
while(is_on_map(split, tmp.pos[1], tmp.pos[0]))
move(split, &tmp, 1);
y = 0; y = 0;
res = 0; res = 0;
while(split[y]) while(split[y])
@ -153,7 +159,7 @@ long int resolve_part2(char *input, char **split)
x = 0; x = 0;
while(split[y][x]) while(split[y][x])
{ {
if(split[x][y] == '.' && is_loop(split, guard, x, y)) if(split[x][y] == 'X' && is_loop(split, guard, x, y))
res++; res++;
x++; x++;
} }