Initial commit

This commit is contained in:
Dimitri Lozeve 2024-11-12 21:43:32 +01:00
commit f242d2b0df
420 changed files with 62521 additions and 0 deletions

165
2020/day08/day08.c Normal file
View file

@ -0,0 +1,165 @@
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/time.h>
enum operation {
NOP,
ACC,
JMP,
};
struct instruction {
enum operation op;
int arg;
};
enum outcome {
ERROR,
LOOP,
END,
};
struct result {
enum outcome out;
int ret;
};
size_t count_lines(FILE *fp) {
size_t count = 0;
for (char c = getc(fp); c != EOF; c = getc(fp)) {
if (c == '\n') {
count++;
}
}
return count;
}
struct result execute(size_t n, struct instruction program[n]) {
int acc = 0;
size_t ip = 0;
bool visited[n];
for (size_t i = 0; i < n; ++i) {
visited[i] = false;
}
while (visited[ip] == false && ip < n) {
visited[ip] = true;
switch (program[ip].op) {
case NOP: {
ip++;
break;
}
case ACC: {
acc += program[ip].arg;
ip++;
break;
}
case JMP: {
ip += program[ip].arg;
break;
}
default:
printf("ERROR: invalid instruction %d %d in position %zu\n",
program[ip].op, program[ip].arg, ip);
return (struct result){.out = ERROR, .ret = 0};
}
}
if (ip == n) {
return (struct result){.out = END, .ret = acc};
}
return (struct result){.out = LOOP, .ret = acc};
}
int main(int argc, char *argv[]) {
if (argc < 2) {
printf("Usage: %s <input file>\n", argv[0]);
return 0;
}
FILE *fp = fopen(argv[1], "r");
if (fp == NULL) {
printf("Could not open file %s\n", argv[1]);
return 1;
}
size_t n = count_lines(fp);
struct instruction program[n];
rewind(fp);
char *buf = NULL;
size_t buf_size = 0;
size_t i = 0;
while (getline(&buf, &buf_size, fp) != -1) {
int arg;
if (strncmp(buf, "nop", 3) == 0) {
sscanf(buf, "nop %d", &arg);
program[i] = (struct instruction){.op = NOP, .arg = arg};
} else if (strncmp(buf, "acc", 3) == 0) {
sscanf(buf, "acc %d", &arg);
program[i] = (struct instruction){.op = ACC, .arg = arg};
} else if (strncmp(buf, "jmp", 3) == 0) {
sscanf(buf, "jmp %d", &arg);
program[i] = (struct instruction){.op = JMP, .arg = arg};
}
i++;
}
free(buf);
fclose(fp);
// Part 1
printf("Part 1: ");
struct timeval tv1, tv2;
gettimeofday(&tv1, NULL);
struct result res = execute(n, program);
if (res.out == LOOP) {
printf("%d\n", res.ret);
}
gettimeofday(&tv2, NULL);
printf("Time: %lds %ldµs\n", tv2.tv_sec - tv1.tv_sec,
tv2.tv_usec - tv1.tv_usec);
// Part 2 (bruteforce)
printf("Part 2: ");
gettimeofday(&tv1, NULL);
bool finished = false;
i = 0;
while (!finished && i < n) {
switch (program[i].op) {
case NOP: {
program[i].op = JMP;
res = execute(n, program);
if (res.out == END) {
finished = true;
}
program[i].op = NOP;
break;
}
case JMP: {
program[i].op = NOP;
res = execute(n, program);
if (res.out == END) {
finished = true;
}
program[i].op = JMP;
break;
}
default:
break;
}
i++;
}
printf("%d\n", res.ret);
gettimeofday(&tv2, NULL);
printf("Time: %lds %ldµs\n", tv2.tv_sec - tv1.tv_sec,
tv2.tv_usec - tv1.tv_usec);
return 0;
}

75
2020/day08/day08.rkt Normal file
View file

@ -0,0 +1,75 @@
#lang racket/base
(require racket/string
racket/vector
racket/file
racket/match)
(module+ test
(require rackunit))
(module+ main
(displayln "Day 8"))
(define (parse-instruction str)
(define instr (string-split str))
(cons (string->symbol (car instr))
(map string->number (cdr instr))))
(define (read-input filename)
(list->vector (map parse-instruction (file->lines filename))))
(define (execute program)
(define n (vector-length program))
(let loop ([acc 0]
[i 0]
[visited '()])
(cond
[(member i visited) (values 'loop visited acc)]
[(= i n) (values 'end visited acc)]
[else (match (vector-ref program i)
[(list 'nop x) (loop acc (add1 i) (cons i visited))]
[(list 'acc x) (loop (+ acc x) (add1 i) (cons i visited))]
[(list 'jmp x) (loop acc (+ i x) (cons i visited))]
[instr (error "invalid instruction" i instr)])])))
(define (part1 filename)
(define program (read-input filename))
(define-values (state visited acc) (execute program))
acc)
(module+ test
(check-equal? (part1 "test") 5))
(module+ main
(displayln (part1 "input")))
(define (change-instruction program visited)
(define new-program (vector-copy program))
(define new-visited
(let loop ([instructions visited])
(match (vector-ref new-program (car instructions))
[(list 'nop x)
(vector-set! new-program (car instructions) (list 'jmp x))
(cdr instructions)]
[(list 'jmp x)
(vector-set! new-program (car instructions) (list 'nop x))
(cdr instructions)]
[z (loop (cdr instructions))])))
(values new-program new-visited))
(define (part2 filename)
(define program (read-input filename))
(define-values (initial-reason initial-visited initial-acc) (execute program))
(let loop ([visited initial-visited])
(let*-values ([(new-program new-visited) (change-instruction program visited)]
[(reason visited acc) (execute new-program)])
(if (equal? reason 'end)
acc
(loop new-visited)))))
(module+ test
(check-equal? (part2 "test") 8))
(module+ main
(displayln (part2 "input")))

641
2020/day08/input Normal file
View file

@ -0,0 +1,641 @@
acc +29
acc +0
acc +36
jmp +292
acc +11
acc +16
nop +280
nop +320
jmp +310
acc +15
jmp +76
acc +31
acc +6
acc +29
acc +35
jmp +524
acc +4
acc +12
jmp +162
acc +14
acc -10
jmp +312
acc +19
jmp +385
acc +46
acc +13
acc -19
jmp +366
jmp +56
acc -9
nop +74
jmp +357
acc +28
jmp +223
acc -12
jmp +292
nop +385
acc +45
jmp +255
jmp +337
nop +465
acc +43
jmp +555
acc +20
acc +23
acc +39
jmp -6
acc -4
jmp -39
acc +7
acc -13
acc +41
acc +4
jmp +80
jmp +1
jmp +484
acc -16
acc +2
acc +20
jmp +244
jmp +258
acc +27
acc -7
acc +40
nop +490
jmp +247
nop +363
acc +46
acc +27
acc -4
jmp +379
jmp +62
acc -15
acc +38
acc -4
acc +4
jmp +312
acc +37
jmp +271
acc +3
jmp +538
jmp +1
acc +33
jmp +99
jmp +107
jmp -38
jmp +359
jmp +1
acc +11
acc -3
jmp +109
acc +17
jmp +146
acc +34
acc -5
jmp +174
jmp +482
acc +43
acc +35
acc +8
acc +36
jmp -41
jmp +260
jmp -49
acc +30
nop -33
acc +49
acc +40
jmp +157
acc -11
acc -11
acc +21
acc +35
jmp +489
jmp +219
acc +33
acc +22
jmp +224
jmp +1
jmp +278
acc +0
acc +31
jmp +271
acc -19
acc +38
acc -15
acc +0
jmp +81
acc +7
acc +50
nop +55
nop +2
jmp +195
acc -18
acc +14
jmp +1
jmp -57
acc -17
nop +495
jmp -21
jmp +1
acc +39
acc +35
acc +27
jmp +301
acc +6
acc +11
acc -10
jmp +1
jmp +56
acc +38
jmp +333
acc +26
acc -15
acc +32
acc -9
jmp +412
acc -17
acc +9
jmp +110
nop +298
acc +4
acc +25
acc +0
jmp -136
acc +24
jmp +418
acc -2
acc +38
jmp +92
acc +5
acc +22
acc -4
acc -12
jmp +241
acc +19
nop -6
acc -11
acc +24
jmp +236
jmp +106
jmp +343
jmp -17
acc +5
jmp +143
nop +354
acc +20
acc -11
jmp +63
nop +252
jmp +96
acc -11
acc +35
nop +409
acc +2
jmp +83
acc +0
acc -1
jmp +299
acc +46
jmp +426
acc +8
acc +50
acc +33
jmp +384
nop -20
jmp -152
jmp +283
nop -161
nop -76
acc +34
nop -202
jmp -98
acc +11
jmp +194
acc +12
acc +32
acc -18
acc +4
jmp +202
acc -12
acc +43
acc -11
jmp +70
acc +8
acc -5
acc +9
jmp -187
acc +49
acc +42
acc +10
jmp +274
jmp -216
acc -11
acc -8
acc +49
nop -56
jmp -197
nop -33
nop -167
jmp -174
acc +41
acc +19
acc +13
jmp +334
acc +48
acc +37
acc +35
jmp +323
jmp +1
jmp -184
nop +76
acc +47
acc +5
jmp -150
jmp +133
acc -1
jmp +197
nop +175
acc +28
jmp +328
jmp +209
nop -190
jmp +1
jmp +181
acc +33
acc +34
jmp +345
jmp -118
acc +40
acc +36
nop +32
jmp +261
acc +38
acc +1
acc -19
acc +48
jmp +320
acc +32
acc -7
acc +34
jmp +64
acc +6
acc +3
acc -11
jmp +293
acc +49
acc +23
acc +46
jmp +231
jmp +1
acc -17
jmp +35
jmp -78
jmp +82
acc +31
nop +31
acc +35
acc +42
jmp -208
acc +2
acc -16
jmp +139
nop -170
acc -4
acc +22
acc +9
jmp +295
nop -248
acc +33
acc +32
jmp +186
acc -11
jmp +151
acc +15
acc -7
acc +20
jmp -215
acc +43
acc +12
acc +6
acc +5
jmp +225
acc +15
jmp +1
nop +263
jmp -317
acc +34
jmp +1
jmp -275
acc -15
acc -12
jmp +165
nop -254
acc +12
nop +277
jmp +105
acc +35
jmp +1
acc +34
jmp +93
acc +9
jmp -282
acc +43
jmp -335
acc +21
jmp -114
acc +30
jmp -246
acc -17
acc +10
nop -211
nop +202
jmp +76
acc +34
acc +23
acc +9
acc +48
jmp -208
jmp -241
acc +37
jmp +97
acc +10
acc +47
nop -292
acc -13
jmp +27
acc -18
nop -56
jmp +33
acc +7
jmp -12
acc -11
acc -2
acc +13
jmp -328
acc +21
acc +30
jmp -208
acc -7
jmp -87
acc +41
nop +76
acc +22
jmp +222
acc +48
acc +4
jmp +225
jmp +200
acc -14
acc -12
nop -79
jmp +192
acc +41
acc +3
jmp -355
jmp -292
acc -18
jmp -174
acc +44
acc +23
jmp -163
acc +5
nop -125
nop -7
acc +41
jmp -266
jmp +90
acc +5
jmp +213
acc +10
acc -11
nop -403
jmp +1
jmp -386
acc -18
acc +9
nop +107
acc +0
jmp -383
jmp +104
acc +30
acc -3
nop -208
acc -15
jmp +211
acc -12
acc +18
jmp -392
acc +25
acc +30
jmp -170
jmp -282
acc +38
acc -16
jmp -108
acc +29
acc +31
acc +29
acc +32
jmp -258
acc -16
jmp -40
acc +41
jmp -365
acc +17
acc +20
jmp -77
jmp -55
acc +3
acc +28
nop -227
jmp +116
jmp +165
acc +16
jmp -74
acc -4
jmp -275
acc +28
jmp -254
acc +13
acc -12
acc -16
jmp -5
acc +17
nop -369
nop -375
nop +66
jmp -173
jmp -40
jmp -448
acc -10
nop -332
acc +39
acc -8
jmp +64
acc -19
acc +14
jmp -376
acc +20
acc +25
acc +11
acc +29
jmp -392
acc +33
acc +28
nop -241
acc -6
jmp +2
jmp -410
acc +15
nop -351
jmp -254
acc -2
acc +15
acc +11
jmp -103
acc +29
acc +7
jmp +21
acc +20
acc +3
acc -4
acc +31
jmp -7
acc -1
jmp +1
jmp -158
acc +11
acc -8
jmp +123
acc -9
acc +42
acc +6
acc -18
jmp -483
nop -507
acc +37
acc -10
jmp -61
jmp +98
acc +38
acc +36
jmp -358
nop -231
acc +23
acc +49
jmp -151
acc +48
acc +2
acc +19
acc +34
jmp -8
acc -14
acc -16
jmp -439
acc -7
acc -14
jmp -466
acc +1
nop -254
acc +11
jmp -72
acc +33
acc +11
acc +40
jmp -428
acc +26
acc +8
acc +19
jmp -305
nop +71
acc +3
jmp -457
acc -6
acc +36
jmp +77
acc +11
nop +68
jmp -69
acc +7
acc -8
acc +50
jmp -516
acc +11
acc +46
acc +4
jmp -179
jmp -265
nop -64
jmp +63
acc +27
nop -340
jmp -62
acc +15
acc +42
acc -9
jmp -549
acc +3
acc -10
acc +28
jmp -376
jmp +1
jmp -78
jmp -87
acc +34
acc -17
jmp -275
acc +50
acc +17
acc +39
jmp -133
nop -331
acc +33
acc +38
acc +25
jmp -215
acc +0
acc -9
jmp -258
acc +25
jmp -81
jmp -574
acc +37
acc +48
jmp -327
acc +34
nop -493
acc +42
jmp -459
jmp +1
jmp -135
jmp -489
acc +33
acc +19
acc +17
acc +7
jmp -106
nop -164
jmp -462
acc +27
jmp -612
acc +15
jmp -438
acc +35
jmp -171
acc +10
acc +4
acc +34
jmp -496
nop -4
acc +16
jmp -541
acc +13
jmp -201
jmp -551
acc +40
acc +9
acc +0
acc +33
jmp +1

9
2020/day08/test Normal file
View file

@ -0,0 +1,9 @@
nop +0
acc +1
jmp +4
acc +3
jmp -3
acc -99
acc +1
jmp -4
acc +6