day 16 part 2 final

This commit is contained in:
2021-12-21 12:18:11 +01:00
parent bdfad93f4a
commit f8720a2129
2 changed files with 27 additions and 32 deletions

View File

@@ -193,3 +193,15 @@ aoc-c : res=435
aoc-c : res=2842
time: 0:00.94 real, 0.94 user, 0.00 sys
context-switch: 5+1, page-faults: 0+582
=========================================
================= day16 =================
=========================================
aoc-c : res=923
time: 0:00.00 real, 0.00 user, 0.00 sys
context-switch: 0+1, page-faults: 0+92
aoc-c : res=258888628940
time: 0:00.00 real, 0.00 user, 0.00 sys
context-switch: 0+1, page-faults: 0+89

View File

@@ -33,7 +33,7 @@
#define TYPE_EQUAL 7
#define MAX_STACK 128 /* max stack for operators input */
static u64 totversions; /* sum of versions */
static s64 totversions; /* sum of versions */
static u64 bitval(char *p, int length)
{
@@ -72,68 +72,52 @@ static s64 decode(char *start, char **end)
return decode_value(start, end);
switch (*start++) {
case '0':
case '0': /* we decode count bits */
count = bitval(start, 15);
start += 15;
*end = start;
log(3, "nbits = %lu\n", count);
while ((*end - start) < count) {
while ((*end - start) < count)
stack[nstack++] = decode(*end, end);
//log(3, " end - start = %lu\n", *end - start);
log(3, " stack %d = %ld\n", nstack - 1, stack[nstack - 1]);
}
break;
case '1':
case '1': /* we decode count packets */
count = bitval(start, 11);
start += 11;
*end = start;
log(3, "npackets = %ld\n", count);
while (count--) {
*end = start + 11;
while (count--)
stack[nstack++] = decode(*end, end);
log(3, " stack %d = %ld\n", nstack - 1, stack[nstack - 1]);
break;
}
}
switch (type) {
case TYPE_SUM:
log(3, "OP=sum\n");
while (--nstack > -1)
result += stack[nstack];
break;
case TYPE_PRODUCT:
result = 1; /* forgot this one ;-) */
log(3, "OP=mult\n");
result = 1;
while (--nstack > -1)
result *= stack[nstack];
break;
case TYPE_MIN:
result = INT64_MAX;
log(3, "OP=min\n");
while (--nstack > -1)
if (stack[nstack] < result)
result = stack[nstack];
break;
case TYPE_MAX:
log(3, "OP=max\n");
while (--nstack > -1)
if (stack[nstack] > result)
result = stack[nstack];
break;
case TYPE_GREATER:
log(3, "OP=gt\n");
result = stack[0] > stack[1]? 1: 0;
result = stack[0] > stack[1];
break;
case TYPE_LESS:
log(3, "OP=le\n");
result = stack[0] < stack[1]? 1: 0;
result = stack[0] < stack[1];
break;
case TYPE_EQUAL:
log(3, "OP=eq\n");
result = stack[0] == stack[1]? 1: 0;
result = stack[0] == stack[1];
break;
}
//log_f(3, "bin=[%s] version=%d type=%d\n", bits, version, type);
//log_f(3, "[%s] version=%d type=%d\n", start, version, type);
return result;
}
@@ -191,10 +175,9 @@ int main(int ac, char **av)
if (optind < ac)
return usage(*av);
buf = read_input();
s64 result = decode(buf, &end);
printf("END: end=%lu sum_versions=%lu result=%ld\n", end - buf, totversions, result);
//printf("%s : res=%u\n", *av, part == 1? part1(): part2());
free(buf);
printf("%s : res=%ld\n", *av, part == 1? totversions: result);
exit (0);
}