solved day 4 in reasonable runtime

This commit is contained in:
laura 2025-12-11 21:45:36 +01:00
parent 76be0eb02a
commit 6706d5a87e
2 changed files with 118 additions and 0 deletions

13
4/Makefile Normal file
View file

@ -0,0 +1,13 @@
client: main.c
gcc -o main main.c -O3 -Wall -Wextra -g -march=x86-64-v3
client-debug: main.c
gcc -o main main.c -O1 -Wall -Wextra -g -fsanitize=address
client-debug-nosanitize: main.c
gcc -o main main.c -O1 -Wall -Wextra -g
clean:
rm main
.PHONY: clean

105
4/main.c Normal file
View file

@ -0,0 +1,105 @@
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <time.h>
char input[] =
{
#embed "input.txt"
,'\0' // null terminator
,'\0'
};
int width = 0;
int height = 0;
uint64_t power(uint64_t base, uint64_t exp) {
uint64_t i, result = 1;
for (i = 0; i < exp; i++)
result *= base;
return result;
}
void print_field(uint8_t* surrounds){
for(int x = 0; x < height; x++){
for(int y = 0; y < width; y++){
if(surrounds[(x)*(width+2)+(y)] < 4 && input[(x)*(width+1)+(y)] == '@'){
printf("%d", surrounds[(x)*(width+2)+(y)]);
}else{
printf("%c", input[(x)*(width+1)+(y)]);
}
}
printf("\n");
}
}
int main(int argc, char *argv[]){
clock_t start, end;
start = clock();
while(input[width] != '\n'){
width++;
}
//printf("width: %d\n", width);
while(input[height*(width+1)+1] != 0){
height++;
}
//printf("height: %d\n", height);
uint8_t* surrounds = calloc((height+2)*(width+2), sizeof(uint8_t))+width+1;
for(int x = 0; x < height; x++){
for(int y = 0; y< width; y++){
if(input[(x)*(width+1)+(y)] == '@'){
surrounds[(x-1)*(width+2)+(y-1)] += 1;
surrounds[(x-1)*(width+2)+(y)] += 1;
surrounds[(x-1)*(width+2)+(y+1)] += 1;
surrounds[(x)*(width+2)+(y-1)] += 1;
surrounds[(x)*(width+2)+(y)] += 0;
surrounds[(x)*(width+2)+(y+1)] += 1;
surrounds[(x+1)*(width+2)+(y-1)] += 1;
surrounds[(x+1)*(width+2)+(y)] += 1;
surrounds[(x+1)*(width+2)+(y+1)] += 1;
}
//if(surrounds[(x)*width+(y)] < 8 && input[(x)*(width+1)+(y)] == '@'){
// printf("%d", surrounds[(x)*(width+2)+(y)]);
//}else{
// printf("%c", input[(x)*(width+1)+(y)]);
//}
}
//printf("\n");
}
uint64_t count = 0;
for(int x = 0; x < height; x++){
for(int y = 0; y < width; y++){
if(surrounds[(x)*(width+2)+(y)] < 4 && input[(x)*(width+1)+(y)] == '@'){
count++;
//printf("%d", surrounds[(x)*width+(y)]);
}else{
//printf("%c", input[(x)*width+(y)]);
}
}
//printf("\n");
}
//print_field(surrounds);
free(surrounds-width-1);
end = clock();
printf("count: %lu\n", count);
clock_t ticks_taken = end - start;
double time_taken = ((double)ticks_taken)/CLOCKS_PER_SEC;
printf("time take: %f ticks\n", time_taken);
printf("CLOCKS_PER_SEC: %ld\n", CLOCKS_PER_SEC);
exit(1);
}