day 16 part 2 final
This commit is contained in:
@@ -193,3 +193,15 @@ aoc-c : res=435
|
|||||||
aoc-c : res=2842
|
aoc-c : res=2842
|
||||||
time: 0:00.94 real, 0.94 user, 0.00 sys
|
time: 0:00.94 real, 0.94 user, 0.00 sys
|
||||||
context-switch: 5+1, page-faults: 0+582
|
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
|
||||||
|
@@ -33,7 +33,7 @@
|
|||||||
#define TYPE_EQUAL 7
|
#define TYPE_EQUAL 7
|
||||||
|
|
||||||
#define MAX_STACK 128 /* max stack for operators input */
|
#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)
|
static u64 bitval(char *p, int length)
|
||||||
{
|
{
|
||||||
@@ -72,68 +72,52 @@ static s64 decode(char *start, char **end)
|
|||||||
return decode_value(start, end);
|
return decode_value(start, end);
|
||||||
|
|
||||||
switch (*start++) {
|
switch (*start++) {
|
||||||
case '0':
|
case '0': /* we decode count bits */
|
||||||
count = bitval(start, 15);
|
count = bitval(start, 15);
|
||||||
start += 15;
|
start += 15;
|
||||||
*end = start;
|
*end = start;
|
||||||
log(3, "nbits = %lu\n", count);
|
while ((*end - start) < count)
|
||||||
while ((*end - start) < count) {
|
|
||||||
stack[nstack++] = decode(*end, end);
|
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;
|
break;
|
||||||
case '1':
|
case '1': /* we decode count packets */
|
||||||
count = bitval(start, 11);
|
count = bitval(start, 11);
|
||||||
start += 11;
|
*end = start + 11;
|
||||||
*end = start;
|
while (count--)
|
||||||
log(3, "npackets = %ld\n", count);
|
|
||||||
while (count--) {
|
|
||||||
stack[nstack++] = decode(*end, end);
|
stack[nstack++] = decode(*end, end);
|
||||||
log(3, " stack %d = %ld\n", nstack - 1, stack[nstack - 1]);
|
break;
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TYPE_SUM:
|
case TYPE_SUM:
|
||||||
log(3, "OP=sum\n");
|
|
||||||
while (--nstack > -1)
|
while (--nstack > -1)
|
||||||
result += stack[nstack];
|
result += stack[nstack];
|
||||||
break;
|
break;
|
||||||
case TYPE_PRODUCT:
|
case TYPE_PRODUCT:
|
||||||
result = 1; /* forgot this one ;-) */
|
result = 1;
|
||||||
log(3, "OP=mult\n");
|
|
||||||
while (--nstack > -1)
|
while (--nstack > -1)
|
||||||
result *= stack[nstack];
|
result *= stack[nstack];
|
||||||
break;
|
break;
|
||||||
case TYPE_MIN:
|
case TYPE_MIN:
|
||||||
result = INT64_MAX;
|
result = INT64_MAX;
|
||||||
log(3, "OP=min\n");
|
|
||||||
while (--nstack > -1)
|
while (--nstack > -1)
|
||||||
if (stack[nstack] < result)
|
if (stack[nstack] < result)
|
||||||
result = stack[nstack];
|
result = stack[nstack];
|
||||||
break;
|
break;
|
||||||
case TYPE_MAX:
|
case TYPE_MAX:
|
||||||
log(3, "OP=max\n");
|
|
||||||
while (--nstack > -1)
|
while (--nstack > -1)
|
||||||
if (stack[nstack] > result)
|
if (stack[nstack] > result)
|
||||||
result = stack[nstack];
|
result = stack[nstack];
|
||||||
break;
|
break;
|
||||||
case TYPE_GREATER:
|
case TYPE_GREATER:
|
||||||
log(3, "OP=gt\n");
|
result = stack[0] > stack[1];
|
||||||
result = stack[0] > stack[1]? 1: 0;
|
|
||||||
break;
|
break;
|
||||||
case TYPE_LESS:
|
case TYPE_LESS:
|
||||||
log(3, "OP=le\n");
|
result = stack[0] < stack[1];
|
||||||
result = stack[0] < stack[1]? 1: 0;
|
|
||||||
break;
|
break;
|
||||||
case TYPE_EQUAL:
|
case TYPE_EQUAL:
|
||||||
log(3, "OP=eq\n");
|
result = stack[0] == stack[1];
|
||||||
result = stack[0] == stack[1]? 1: 0;
|
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;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -191,10 +175,9 @@ int main(int ac, char **av)
|
|||||||
if (optind < ac)
|
if (optind < ac)
|
||||||
return usage(*av);
|
return usage(*av);
|
||||||
|
|
||||||
|
|
||||||
buf = read_input();
|
buf = read_input();
|
||||||
s64 result = decode(buf, &end);
|
s64 result = decode(buf, &end);
|
||||||
printf("END: end=%lu sum_versions=%lu result=%ld\n", end - buf, totversions, result);
|
free(buf);
|
||||||
//printf("%s : res=%u\n", *av, part == 1? part1(): part2());
|
printf("%s : res=%ld\n", *av, part == 1? totversions: result);
|
||||||
exit (0);
|
exit (0);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user