# Advent of Code Day 1 - brute loops

I'll write about by Advent of Code 2020 solutions here. Let's see how long I'll manage to particiate, and how big my blog-lag will be...

#### Part 1

Straight forward, brute force solution, with a tiny bit of smartness. I remove each element after checking it in the inner loop, because additions are commutative.

``````my @exp = ( <STDIN> );
while (my \$a = shift (@exp)) {
for my \$b (@exp) {
if (\$a + \$b == 2020) {
die \$a*\$b."\n";
}
}
}``````

I use `die` with a sting ending with a newline for a shorter `print () && exit`

But I did not know about the trick where you store the values in a hash and then go through the hash, subtract the value from 2020 and look for an entry in the hash with the result. Maybe it's clearer in code:

``````my %data = map { chomp; \$_=>1 } ( <STDIN> );
for my \$a (keys %data) {
my \$b = 2020 - \$a;
if (\$data{2020 - \$a}) {
die \$a*\$b."\n";
}
}``````

Presumably this is a lot faster, but with this small data set, it makes no difference.

#### Part 2

As the data set is so small, I didn't even consider an smartness and just added another loop. This means we're in O(n^3) territory, but with a runtime of 0.2sec I just don't care...

``````my @exp = ( <STDIN> );
while (my \$a = shift (@exp)) {
for my \$b (@exp) {
for my \$c (@exp) {
if (\$a + \$b +\$c == 2020) {
say \$a*\$b*\$c;
exit;
}
}
}
}``````

Oh, and here I did do `say && exit` (even in two statements...)

#### Look Ma, no spaces!

Here's the same code, slightly golfed:

``@d=<STDIN>;for\$a(@d){for\$b(@d){for\$c(@d){die\$a*\$b*\$c."\n"if\$a+\$b+\$c==2020}}}``