day 4
This commit is contained in:
130
day2_plasl.c
Normal file
130
day2_plasl.c
Normal file
@@ -0,0 +1,130 @@
|
||||
#include "lib.h"
|
||||
|
||||
#define DBG 0
|
||||
|
||||
static
|
||||
unsigned char input[] = {
|
||||
#embed "day2_input.txt"
|
||||
};
|
||||
|
||||
static
|
||||
unsigned char test[] = {
|
||||
#embed "day2_test.txt"
|
||||
};
|
||||
|
||||
uint64_t ipow(uint64_t a, uint64_t b) {
|
||||
uint64_t m = a;
|
||||
for (;b;b--) m += a;
|
||||
return m;
|
||||
}
|
||||
|
||||
static
|
||||
uint64_t range(uint64_t start, uint64_t end, uint64_t len) {
|
||||
#if DBG
|
||||
print("==\n");
|
||||
printd(start); print(" "); printd(end); print("\n");
|
||||
#endif
|
||||
|
||||
if ((len & 1) == 1) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint64_t divisor = ipow(10, len / 2);
|
||||
|
||||
uint64_t first = (start + divisor - 1) / divisor;
|
||||
uint64_t second = end / divisor;
|
||||
|
||||
#if DBG
|
||||
print("\n");
|
||||
printd(divisor); print("\n");
|
||||
printd(first); print(" "); printd(second); print("\n");
|
||||
#endif
|
||||
|
||||
uint64_t r = (((second + first) * (second + 1 - first)) / 2) * divisor;
|
||||
|
||||
#if DBG
|
||||
printd(r); print("\n");
|
||||
#endif
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
static
|
||||
uint64_t do_part1(size_t file_len, unsigned char file[file_len]) {
|
||||
unsigned char buffer[65535];
|
||||
memcpy(buffer, file, file_len);
|
||||
size_t size = file_len;
|
||||
buffer[file_len-1] = ',';
|
||||
|
||||
uint64_t out = 0;
|
||||
uint64_t i = 0;
|
||||
|
||||
while (i < size) {
|
||||
#if DBG
|
||||
print("--------------\n");
|
||||
#endif
|
||||
uint64_t startlen = 0, endlen = 0;
|
||||
uint64_t start = grabnum(buffer+i, NULL);
|
||||
|
||||
while (buffer[i] != '-') {
|
||||
i++;
|
||||
startlen++;
|
||||
}
|
||||
i++;
|
||||
|
||||
uint64_t end = grabnum(buffer+i, NULL);
|
||||
|
||||
while (buffer[i] != ',') {
|
||||
i++;
|
||||
endlen++;
|
||||
}
|
||||
i++;
|
||||
|
||||
#if DBG
|
||||
printd(startlen); print(" "); printd(start); print((char[]){ 10 });
|
||||
printd(startlen); print(" "); printd(start); print((char[]){ 10 });
|
||||
#endif
|
||||
|
||||
if (endlen != startlen) {
|
||||
out += range(start, ipow(10, startlen) - 1, startlen)
|
||||
+ range(ipow(10, startlen), end, endlen);
|
||||
} else {
|
||||
out += range(start, end, startlen);
|
||||
}
|
||||
|
||||
#if DBG
|
||||
print((char[]) { 10 });
|
||||
#endif
|
||||
}
|
||||
|
||||
return out;
|
||||
}
|
||||
|
||||
#define RUN_TEST1 1
|
||||
#define RUN_PART1 1
|
||||
|
||||
#define TEST1_EXPECT 0x1227775554l
|
||||
|
||||
void run() {
|
||||
volatile uintptr_t s = (uintptr_t)&s;
|
||||
printh(s);
|
||||
print("\n");
|
||||
#if RUN_TEST1
|
||||
print("PART 1 TEST: ");
|
||||
if (uint64_t v = do_part1(countof(test), test); v != TEST1_EXPECT) {
|
||||
print("FAILED (got ");
|
||||
printd(v);
|
||||
print(", expected " xstr(TEST1_EXPECT) ")\n");
|
||||
} else {
|
||||
print("PASSED\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
#if RUN_PART1
|
||||
print("PART 1 RESULT: ");
|
||||
printd(do_part1(countof(input), input));
|
||||
print("\n");
|
||||
#endif
|
||||
|
||||
exit_group(0);
|
||||
}
|
||||
Reference in New Issue
Block a user