2021-02
This commit is contained in:
parent
703990eedc
commit
902e83b8ba
8
2021/02/part1.mjs
Normal file
8
2021/02/part1.mjs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
import fp from "lodash/fp.js";
|
||||||
|
|
||||||
|
export const solution = fp.flow([
|
||||||
|
fp.groupBy(0),
|
||||||
|
fp.mapValues(fp.map(fp.get(1))),
|
||||||
|
fp.mapValues(fp.sum),
|
||||||
|
({ forward, up, down }) => forward * (down - up),
|
||||||
|
]);
|
35
2021/02/part1.pm
Normal file
35
2021/02/part1.pm
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
package part1;
|
||||||
|
|
||||||
|
use 5.34.0;
|
||||||
|
use warnings;
|
||||||
|
use experimental 'signatures';
|
||||||
|
|
||||||
|
use List::AllUtils qw/sum/;
|
||||||
|
|
||||||
|
sub group_by(@lines) {
|
||||||
|
my %grouped = ();
|
||||||
|
|
||||||
|
for my $line (@lines) {
|
||||||
|
my( $action, $move ) = split ' ', $line;
|
||||||
|
$grouped{$action} //= [];
|
||||||
|
push $grouped{$action}->@*, $move;
|
||||||
|
}
|
||||||
|
|
||||||
|
return %grouped;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub solution(@lines) {
|
||||||
|
my %grouped = group_by(@lines);
|
||||||
|
|
||||||
|
for my $v (values %grouped) {
|
||||||
|
$v = sum @$v;
|
||||||
|
}
|
||||||
|
|
||||||
|
my $depth = $grouped{down} - $grouped{up};
|
||||||
|
my $forward = $grouped{forward};
|
||||||
|
|
||||||
|
return $depth * $forward;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
18
2021/02/part2.mjs
Normal file
18
2021/02/part2.mjs
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
import fp from "lodash/fp.js";
|
||||||
|
import u from "updeep";
|
||||||
|
|
||||||
|
const update = (action, value) =>
|
||||||
|
action === "down" ? u({ aim: fp.add(value) })
|
||||||
|
: action === "up" ? u({ aim: fp.add(-value) })
|
||||||
|
: u((state) =>
|
||||||
|
u({ x: fp.add(value), depth: fp.add(value * state.aim) }, state)
|
||||||
|
);
|
||||||
|
|
||||||
|
export function solution(lines) {
|
||||||
|
const { x, depth } = lines.reduce(
|
||||||
|
(accum, line) => update(...line)(accum),
|
||||||
|
{ depth: 0, aim: 0, x: 0 }
|
||||||
|
);
|
||||||
|
|
||||||
|
return x * depth;
|
||||||
|
}
|
27
2021/02/part2.pm
Normal file
27
2021/02/part2.pm
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package part2;
|
||||||
|
|
||||||
|
use 5.34.0;
|
||||||
|
|
||||||
|
use experimental qw/ signatures switch/;
|
||||||
|
|
||||||
|
sub solution(@lines) {
|
||||||
|
my( $depth, $aim, $x );
|
||||||
|
|
||||||
|
for my $line ( @lines ) {
|
||||||
|
my( $action, $value ) = split ' ', $line;
|
||||||
|
|
||||||
|
given($action) {
|
||||||
|
$aim+=$value when 'down';
|
||||||
|
$aim-=$value when 'up';
|
||||||
|
when( 'forward' ) {
|
||||||
|
$x += $value;
|
||||||
|
$depth += $aim * $value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $x * $depth;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
6
2021/02/sample
Normal file
6
2021/02/sample
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
forward 5
|
||||||
|
down 5
|
||||||
|
forward 8
|
||||||
|
up 3
|
||||||
|
down 8
|
||||||
|
forward 2
|
25
2021/02/test.mjs
Normal file
25
2021/02/test.mjs
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
import tap from "tap";
|
||||||
|
import fs from "fs-extra";
|
||||||
|
|
||||||
|
import * as part1 from "./part1.mjs";
|
||||||
|
import * as part2 from "./part2.mjs";
|
||||||
|
|
||||||
|
const processFile = async (f) =>
|
||||||
|
fs
|
||||||
|
.readFile(f, "utf8")
|
||||||
|
.then((x) => x.split("\n"))
|
||||||
|
.then((lines) => lines.map((l) => l.split(" ")))
|
||||||
|
.then((lines) => lines.filter( ([action]) => action ).map((l) => [l[0], parseInt(l[1])]));
|
||||||
|
|
||||||
|
const sample = processFile("sample");
|
||||||
|
const input = processFile("input");
|
||||||
|
|
||||||
|
tap.test("part1", async (t) => {
|
||||||
|
t.equal(part1.solution(await sample), 150);
|
||||||
|
t.equal(part1.solution(await input), 2091984);
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test("part2", async (t) => {
|
||||||
|
t.equal(part2.solution(await sample), 900);
|
||||||
|
t.equal(part2.solution(await input), 2086261056);
|
||||||
|
});
|
20
2021/02/test.t
Normal file
20
2021/02/test.t
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
use 5.34.0;
|
||||||
|
|
||||||
|
use Test2::V0;
|
||||||
|
use Path::Tiny;
|
||||||
|
|
||||||
|
require './part1.pm';
|
||||||
|
require './part2.pm';
|
||||||
|
|
||||||
|
my @sample = path('sample')->lines;
|
||||||
|
my @input = path('input')->lines;
|
||||||
|
|
||||||
|
subtest part1 => sub {
|
||||||
|
is part1::solution(@sample) => 150;
|
||||||
|
is part1::solution(@input) => 2091984;
|
||||||
|
};
|
||||||
|
|
||||||
|
subtest part2 => sub {
|
||||||
|
is part2::solution(@sample ) => 900;
|
||||||
|
is part2::solution(@input) => 2086261056;
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user