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:
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;
}