61 lines
1.7 KiB
C
61 lines
1.7 KiB
C
#define DJSTD_BASIC_ENTRY
|
|
#include "./djstdlib/core.c"
|
|
|
|
int djstd_entry(Arena *arena, StringList args) {
|
|
string input = os_readEntireFile(arena, s("./day1-input"));
|
|
|
|
int64 dial = 50;
|
|
int64 lineNo = 0;
|
|
StringList split = strSplit(arena, s("\n"), input);
|
|
|
|
int32 password = 0;
|
|
|
|
for (EachEl(split, string, line)) {
|
|
if (!strEql(*line, s(""))) {
|
|
bool lineValid = false;
|
|
if (line->length > 1) {
|
|
char dir = line->str[0];
|
|
Int32Result numStrParsed = parsePositiveInt32(strChopStart(*line, 1));
|
|
if (numStrParsed.valid) {
|
|
lineValid = true;
|
|
|
|
int32 dialPrev = dial;
|
|
int32 pwPrev = password;
|
|
|
|
int32 turns = (+numStrParsed.result)/100;
|
|
password += turns;
|
|
|
|
int32 remainder = numStrParsed.result - (numStrParsed.result/100)*100;
|
|
|
|
if (dir == 'L') {
|
|
dial -= remainder;
|
|
} else if (dir == 'R') {
|
|
dial += remainder;
|
|
}
|
|
|
|
if (dialPrev != 0 && (dial >= 100 || dial <= 0)) {
|
|
password += 1;
|
|
}
|
|
|
|
println("turn: %S, %d => %d, %d", *line, dialPrev, dial, password - pwPrev);
|
|
|
|
dial %= 100;
|
|
if (dial < 0) {
|
|
dial += 100;
|
|
}
|
|
}
|
|
}
|
|
if (!lineValid) {
|
|
println("Input corrupted at line %d", lineNo);
|
|
return 1;
|
|
}
|
|
}
|
|
lineNo++;
|
|
}
|
|
|
|
println("%d", password);
|
|
|
|
return 0;
|
|
}
|
|
|