advent2025

Advent of Code 2025 Solutions
git clone git://bsandro.tech/advent2025
Log | Files | Refs | LICENSE

commit 37fe582c54b04e8e8cd7a2967b8887039d3ab047
parent 8665aa1f238c77ed5b0257987f5ab17de80a81a0
Author: bsandro <email@bsandro.tech>
Date:   Mon,  1 Dec 2025 22:35:47 +0200

Huge optimization to get from 0.00047s to 0.00013s

Diffstat:
MMakefile | 2+-
Mcputime.h | 2+-
Mday01.c | 49++++++++++++++++++++++++++++++-------------------
3 files changed, 32 insertions(+), 21 deletions(-)

diff --git a/Makefile b/Makefile @@ -1,6 +1,6 @@ .SUFFIXES: MAKEFLAGS+=-rR -CFLAGS=-Os -std=gnu23 -Werror -Wall -Wextra -ffast-math -march=native -I. +CFLAGS=-O3 -std=gnu23 -Werror -Wall -Wextra -ffast-math -march=native -mtune=native -I. LDFLAGS=-lc CC=cc diff --git a/cputime.h b/cputime.h @@ -10,5 +10,5 @@ void __attribute((constructor)) begin() { void __attribute((destructor)) end() { struct timespec ts; clock_gettime(CLOCK_MONOTONIC_RAW, &ts); - printf("%llu μs\n", ((ts.tv_sec+ts.tv_nsec)-now)/1000); + printf("%f s\n", (double)((ts.tv_sec+ts.tv_nsec)-now)/1e9); } diff --git a/day01.c b/day01.c @@ -1,30 +1,41 @@ #include <stdio.h> #include "cputime.h" -#define BUF_SIZE 32 int main(void) { - char buf[BUF_SIZE]; int cur = 50; int p1 = 0; int p2 = 0; - while (fgets(buf, sizeof(buf), stdin)) { - char dir; - int cnt; - sscanf(buf, "%c%d", &dir, &cnt); - if (cnt>99) p2+=cnt/100; - cnt = cnt%100; - if (dir=='L') { - if (cur&&cnt>cur) p2++; - cur-=cnt; - if (cur<0) cur=100+cur; - } else if (dir=='R') { - if (cur+cnt>100) p2++; - cur+=cnt; - if (cur>99) cur=cur-100; + char dir = 0; + char buf[4] = {0}; + int bufs = 0; + int cnt = 0; + for (char c=getchar();c!=EOF;c=getchar()) { + // sscanf() was here but it felt slow + if (c=='L'||c=='R') { + dir = c; + cnt = 0; + } else if (c>='0'&&c<='9') { + buf[bufs++] = c-'0'; + } else if (c=='\n') { + for (int i=0;i<bufs;++i) { + cnt = cnt*10+buf[i]; + } + if (cnt>99) p2+=cnt/100; + cnt = cnt%100; + if (dir=='L') { + if (cur&&cnt>cur) p2++; + cur-=cnt; + if (cur<0) cur=100+cur; + } else if (dir=='R') { + if (cur+cnt>100) p2++; + cur+=cnt; + if (cur>99) cur=cur-100; + } + if (cur==0) { p1++; p2++; } + cnt=0; + bufs=0; } - if (cur==0) { p1++; p2++; } } - printf("p1: %d\n", p1); - printf("p2: %d\n", p2); + printf("p1: %d\np2: %d\n", p1, p2); return 0; }