I decided to solve this year’s Advent of Code problems using awk(1), a woefully underutilised unix tool and programming language. The below solutions may be run using the command:

awk -f solution.awk input.txt


## Day 1

{ total += int($0 / 3.0) - 2 } END { print total }  ### Puzzle 2 { fuel = int($0 / 3.0) - 2;
while (fuel > 0) {
total += fuel;
fuel = int(fuel / 3.0) - 2;
}
}
END { print total }


## Day 2

These are a fair bit less elegant than the previous two solutions. I’m not entirely happy with the second, in particular the array copy, but it works.

### Puzzle 1

BEGIN { RS = "," }
{ ops[i++] = $1 } END { for (i = 0; ops[i] != 99; i += 4) { if (ops[i] == 1) ops[ops[i+3]] = ops[ops[i+1]] + ops[ops[i+2]]; else if (ops[i] == 2) ops[ops[i+3]] = ops[ops[i+1]] * ops[ops[i+2]]; } print ops; }  ### Puzzle 2 BEGIN { RS = "," } { oops[i++] =$1  }
END {
for (noun = 0; noun <= 99; noun++)
for (verb = 0; verb <= 99; verb++) {
for (op in oops) ops[op] = oops[op];
ops = noun;
ops = verb;
for (i = 0; ops[i] != 99; i += 4) {
if (ops[i] == 1)
ops[ops[i+3]] = ops[ops[i+1]] + ops[ops[i+2]];
else if (ops[i] == 2)
ops[ops[i+3]] = ops[ops[i+1]] * ops[ops[i+2]];
}
if (ops == 19690720) {
print 100*noun + verb;
exit 0;
}
}
}