2024 day 8 part 2
This commit is contained in:
parent
47b5c84bc6
commit
e1c3006456
|
@ -1,15 +1,19 @@
|
||||||
{lib, ...}: let
|
{lib, ...}: input: let
|
||||||
|
|
||||||
|
abs = n: if n > 0 then n else -n;
|
||||||
|
|
||||||
addVec = a: b: {x = a.x + b.x; y = a.y + b.y;};
|
addVec = a: b: {x = a.x + b.x; y = a.y + b.y;};
|
||||||
subVec = a: b: {x = a.x - b.x; y = a.y - b.y;};
|
subVec = a: b: {x = a.x - b.x; y = a.y - b.y;};
|
||||||
|
multVec = m: vec: {x = vec.x * m; y = vec.y * m;};
|
||||||
|
modVec = m: vec: {x = lib.mod vec.x m; y = lib.mod vec.y m;};
|
||||||
|
|
||||||
toCharList = builtins.foldl'
|
toCharList = builtins.foldl'
|
||||||
({y, x, chars}: char:
|
({y, x, chars}: char:
|
||||||
if char == "." || char == "#" then {inherit y; x = x + 1; inherit chars;}
|
if char == "." || char == "#" then {inherit y; x = x + 1; inherit chars;}
|
||||||
else if char == "\n" then {y = y + 1; x = 1; inherit chars;}
|
else if char == "\n" then {y = y + 1; x = 0; inherit chars;}
|
||||||
else {inherit y; x = x + 1; chars = chars ++ [{inherit x y char;}];}
|
else {inherit y; x = x + 1; chars = chars ++ [{inherit x y char;}];}
|
||||||
)
|
)
|
||||||
{y = 1; x = 1; chars = [];} # yeah starting at 1,1 what you gonna do about it
|
{y = 0; x = 0; chars = [];}
|
||||||
;
|
;
|
||||||
|
|
||||||
toNodes = {chars, ...}@amap: amap // {
|
toNodes = {chars, ...}@amap: amap // {
|
||||||
|
@ -25,17 +29,44 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
getUniqueNodes = amap: let
|
getUniqueNodes = amap: let
|
||||||
size = amap.x;
|
# assumes width == height ¯\_(ツ)_/¯
|
||||||
|
size = assert amap.x == amap.y + 1; amap.x;
|
||||||
in amap.nodes
|
in amap.nodes
|
||||||
|> lib.concatLists
|
|> lib.concatLists
|
||||||
|> builtins.filter ({x, y}: x > 0 && y > 0 && x < size && y < size)
|
|> builtins.filter ({x, y}: x >= 0 && y >= 0 && x < size && y < size)
|
||||||
|> lib.unique
|
|> lib.unique
|
||||||
;
|
;
|
||||||
|
|
||||||
in {
|
cut = i: list: lib.sublist i (builtins.length list) list;
|
||||||
inherit addVec subVec toCharList toNodes;
|
|
||||||
|
|
||||||
part1result = s: s
|
toDeltas = {chars, ...}@amap: amap // {
|
||||||
|
deltas = chars |> lib.imap0 (i: antenna: {
|
||||||
|
pos = {inherit (antenna) x y;};
|
||||||
|
deltas = chars |> cut i |> builtins.foldl' (acc: antenna2:
|
||||||
|
if antenna == antenna2 then acc
|
||||||
|
else if antenna.char != antenna2.char then acc
|
||||||
|
else let
|
||||||
|
delta = subVec antenna antenna2;
|
||||||
|
in acc ++ [delta]
|
||||||
|
) [];
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
deltaToNodes = size: {pos, delta}:
|
||||||
|
builtins.genList
|
||||||
|
(i: delta |> multVec i |> subVec (minNode size pos delta))
|
||||||
|
(size / (lib.max (abs delta.x) (abs delta.y)) + 1)
|
||||||
|
|> builtins.filter ({x, y}: x >= 0 && y >= 0 && x < size && y < size)
|
||||||
|
;
|
||||||
|
|
||||||
|
minNode = size: pos: delta: let sub = addVec pos delta; in
|
||||||
|
if sub.x < 0 || sub.y < 0 || sub.x >= size || sub.y >= size then pos
|
||||||
|
else minNode size sub delta;
|
||||||
|
|
||||||
|
in {
|
||||||
|
inherit addVec subVec toCharList toNodes toDeltas multVec modVec deltaToNodes minNode;
|
||||||
|
|
||||||
|
part1result = input
|
||||||
|> lib.trim
|
|> lib.trim
|
||||||
|> lib.stringToCharacters
|
|> lib.stringToCharacters
|
||||||
|> toCharList
|
|> toCharList
|
||||||
|
@ -44,5 +75,21 @@ in {
|
||||||
|> builtins.length
|
|> builtins.length
|
||||||
;
|
;
|
||||||
|
|
||||||
|
part2result = input
|
||||||
|
|> lib.trim
|
||||||
|
|> lib.stringToCharacters
|
||||||
|
|> toCharList
|
||||||
|
|> toDeltas
|
||||||
|
|> ({deltas,x,...}: deltas |> map (antenna:
|
||||||
|
antenna.deltas |> map (delta: deltaToNodes x {
|
||||||
|
inherit delta;
|
||||||
|
inherit (antenna) pos;
|
||||||
|
}
|
||||||
|
)))
|
||||||
|
|> lib.concatLists
|
||||||
|
|> lib.concatLists
|
||||||
|
|> lib.unique
|
||||||
|
|> builtins.length
|
||||||
|
;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,34 @@
|
||||||
{describe, it, ...}:
|
{describe, it, ...}:
|
||||||
let
|
let
|
||||||
pkgs = import <nixpkgs> {};
|
pkgs = import <nixpkgs> {};
|
||||||
|
lib = pkgs.lib;
|
||||||
solution = import ./solution.nix pkgs;
|
solution = import ./solution.nix pkgs;
|
||||||
exampleInput = pkgs.lib.readFile ./example;
|
exampleInput = pkgs.lib.readFile ./example;
|
||||||
sample1Input = pkgs.lib.readFile ./sample1;
|
sample1Input = pkgs.lib.readFile ./sample1;
|
||||||
|
|
||||||
|
charmap = {
|
||||||
|
chars = [
|
||||||
|
{ char = "0"; x = 8; y = 1; }
|
||||||
|
{ char = "0"; x = 5; y = 2; }
|
||||||
|
{ char = "0"; x = 7; y = 3; }
|
||||||
|
{ char = "0"; x = 4; y = 4; }
|
||||||
|
{ char = "A"; x = 6; y = 5; }
|
||||||
|
{ char = "A"; x = 8; y = 8; }
|
||||||
|
{ char = "A"; x = 9; y = 9; }
|
||||||
|
];
|
||||||
|
x = 12;
|
||||||
|
y = 11;
|
||||||
|
};
|
||||||
|
|
||||||
|
deltamap = [
|
||||||
|
{ deltas = [ { x = 3; y = -1; } { x = 1; y = -2; } { x = 4; y = -3; } ]; pos = { x = 8; y = 1; }; }
|
||||||
|
{ deltas = [ { x = -2; y = -1; } { x = 1; y = -2; } ]; pos = { x = 5; y = 2; }; }
|
||||||
|
{ deltas = [ { x = 3; y = -1; } ]; pos = { x = 7; y = 3; }; }
|
||||||
|
{ deltas = []; pos = { x = 4; y = 4; }; }
|
||||||
|
{ deltas = [ { x = -2; y = -3; } { x = -3; y = -4; } ]; pos = { x = 6; y = 5; }; }
|
||||||
|
{ deltas = [ { x = -1; y = -1; } ]; pos = { x = 8; y = 8; }; }
|
||||||
|
{ deltas = []; pos = { x = 9; y = 9; }; }
|
||||||
|
];
|
||||||
in [
|
in [
|
||||||
(describe "part 1" [
|
(describe "part 1" [
|
||||||
(it "get's the answer with example input" {
|
(it "get's the answer with example input" {
|
||||||
|
@ -23,4 +48,43 @@ in [
|
||||||
expected = {x = 3; y = 1;};
|
expected = {x = 3; y = 1;};
|
||||||
})
|
})
|
||||||
])
|
])
|
||||||
|
(describe "part 2" [
|
||||||
|
(it "get's char list" {
|
||||||
|
actual = exampleInput |> lib.trim |> lib.stringToCharacters
|
||||||
|
|> solution.toCharList;
|
||||||
|
expected = charmap;
|
||||||
|
})
|
||||||
|
(it "gets deltas" {
|
||||||
|
actual = (charmap |> solution.toDeltas).deltas;
|
||||||
|
expected = deltamap;
|
||||||
|
})
|
||||||
|
(it "gets nodes" {
|
||||||
|
/*
|
||||||
|
.#...
|
||||||
|
.....
|
||||||
|
..A..
|
||||||
|
.....
|
||||||
|
...#.
|
||||||
|
*/
|
||||||
|
actual = solution.deltaToNodes 5 {pos = {x=2;y=2;}; delta = {x=-1;y=-2;};};
|
||||||
|
expected = [
|
||||||
|
{x = 1; y = 0;}
|
||||||
|
{x = 2; y = 2;}
|
||||||
|
{x = 3; y = 4;}
|
||||||
|
];
|
||||||
|
})
|
||||||
|
(it "gets min node" {
|
||||||
|
# .....
|
||||||
|
# #....
|
||||||
|
# .#...
|
||||||
|
# ..A..
|
||||||
|
# ...#.
|
||||||
|
actual = solution.minNode 5 {x = 2; y = 3;} {x = -1; y = -1;};
|
||||||
|
expected = {x = 0; y = 1;};
|
||||||
|
})
|
||||||
|
(it "gets result" {
|
||||||
|
actual = solution.part2result exampleInput;
|
||||||
|
expected = 34;
|
||||||
|
})
|
||||||
|
])
|
||||||
]
|
]
|
||||||
|
|
|
@ -16,18 +16,6 @@
|
||||||
input = (pkgs.lib.readFile ./06/input.txt);
|
input = (pkgs.lib.readFile ./06/input.txt);
|
||||||
in {
|
in {
|
||||||
example = (solution example);
|
example = (solution example);
|
||||||
sample1 = (solution ''
|
|
||||||
.#.
|
|
||||||
..#
|
|
||||||
#^.
|
|
||||||
.#.'');
|
|
||||||
sample2 = (solution ''
|
|
||||||
.#....
|
|
||||||
......
|
|
||||||
.....#
|
|
||||||
#.....
|
|
||||||
..#.#.
|
|
||||||
...^..'');
|
|
||||||
real = (solution input);
|
real = (solution input);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -48,8 +36,8 @@
|
||||||
example = (pkgs.lib.readFile ./08/example);
|
example = (pkgs.lib.readFile ./08/example);
|
||||||
input = (pkgs.lib.readFile ./08/input);
|
input = (pkgs.lib.readFile ./08/input);
|
||||||
in {
|
in {
|
||||||
solution = solution;
|
example = solution example;
|
||||||
part1result = solution.part1result input;
|
real = solution input;
|
||||||
test = tix.run [
|
test = tix.run [
|
||||||
./08/solution.test.nix
|
./08/solution.test.nix
|
||||||
];
|
];
|
||||||
|
|
Loading…
Reference in a new issue