-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathday25.c
72 lines (64 loc) · 1.53 KB
/
day25.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include "advent_of_code.h"
uint64_t parse_fuel(const char* c) {
uint64_t f = 0;
for(; *c != 0; c++) {
f *= 5;
switch(*c) {
default:
f += *c - '0';
break;
case '=':
f -= 2;
break;
case '-':
f--;
break;
case 0:
break;
}
}
return f;
}
void print_fuel(FuriString* str, uint64_t f) {
furi_string_reset(str);
char c;
while(f > 0) {
switch(f % 5) {
default:
c = '0' + f % 5;
f -= f % 5;
break;
case 3:
c = '=';
f += 3;
break;
case 4:
c = '-';
f += 4;
break;
}
f /= 5;
furi_string_push_back(str, c);
}
size_t l = furi_string_size(str);
char* cstr = (char*)furi_string_get_cstr(str);
for(size_t i = 0; i < l / 2; i++) {
M_SWAP(char, cstr[i], cstr[l - 1 - i]);
}
}
void solve_day25(AdventOfCode* aoc, Stream* file_stream) {
FuriString* line = furi_string_alloc();
uint64_t tot = 0;
while(true) {
if(!stream_read_line(file_stream, line)) break;
furi_string_trim(line);
tot += parse_fuel(furi_string_get_cstr(line));
}
print_fuel(line, tot);
FuriString* overflow = furi_string_alloc_set(line);
furi_string_left(line, 10);
furi_string_right(overflow, 10);
update_results(aoc, line, overflow);
furi_string_free(overflow);
furi_string_free(line);
}