Merge branch '2022-14'

main
Yanick Champoux 2022-12-14 10:40:27 -05:00
commit 799f329eea
19 changed files with 1350 additions and 75 deletions

View File

@ -3,14 +3,14 @@ import Victor from "@a-robu/victor";
import { readFile } from "../05/part1.js";
const V = (x,y) => new Victor(x,y);
const V = (x, y) => new Victor(x, y);
const readInput = (...args) =>
R.pipe(
readFile(...args),
(lines) => lines.split("\n"),
R.compact, // remove last line
R.map((line) => line.split("").map( c => c ==='S' ? '`' : c === 'E' ? '{' : c ))
R.map((l) => l.split(""))
);
export const puzzleInput = readInput(import.meta.url, "input");
@ -19,76 +19,81 @@ export const sample = readInput(import.meta.url, "sample");
export const findStart = (topoMap) => {
let y;
let x = R.findIndex(topoMap, (row) => {
let z = row.indexOf("`");
let z = row.indexOf("S");
if (z === -1) return false;
y = z;
return true;
});
return V(x,y);
return V(x, y);
};
const directions = [ [0,1], [0,-1],[1,0],[-1,0] ].map(
d => V(...d)
);
export const findEnd = (topoMap) => {
let y;
let x = R.findIndex(topoMap, (row) => {
let z = row.indexOf("E");
if (z === -1) return false;
y = z;
return true;
});
return V(x, y);
};
const outOfMap = (maxX,maxY) => (loc) => {
if( Math.min( loc.x, loc.y ) < 0 ) return true;
if( loc.x >= maxX ) return true;
if( loc.y >= maxY ) return true;
return false;
}
const directions = [
[0, 1],
[0, -1],
[1, 0],
[-1, 0],
].map((d) => V(...d));
const isReachable = (topoMap,pos) => {
const baseline = topoMap[pos.x][pos.y].charCodeAt(0);
const outOfMap = (maxX, maxY) => (loc) => {
if (Math.min(loc.x, loc.y) < 0) return true;
if (loc.x >= maxX) return true;
if (loc.y >= maxY) return true;
return false;
};
return (next) => {
return [0,1].includes(
topoMap[next.x][next.y].charCodeAt(0) - baseline
)
}
}
const isReachable = (topoMap, pos) => {
const baseline = topoMap[pos.x][pos.y].charCodeAt(0);
return (next) => {
return topoMap[next.x][next.y].charCodeAt(0) - baseline <= 1;
};
};
function findShortestPath(topoMap) {
const initial = findStart(topoMap);
initial.steps = 0;
const final = findEnd(topoMap);
const initial = findStart(topoMap);
initial.steps = 0;
initial.beenThere = [];
topoMap = topoMap.map((line) =>
line.map((c) => c.replace("S", "a").replace("E", "z"))
);
const potentials = [ initial ];
const potentials = [initial];
let bestSoFar;
const beenThere = topoMap.map((line) => line.map(() => 9999));
const oom = outOfMap(topoMap.length,topoMap[0].length );
const oom = outOfMap(topoMap.length, topoMap[0].length);
let failsafe = 100000;
while( potentials.length > 0 ) {
// if(! failsafe--) return;
const pos = potentials.pop(); // depth-first
//console.log(pos.steps, bestSoFar);
let failsafe = 10; //topoMap.length*topoMap[0].length ;
while (potentials.length > 0) {
// if(! failsafe--) return;
const pos = potentials.shift(); // depth-first
if( bestSoFar && (bestSoFar <= pos.steps) ) continue;
if (beenThere[pos.x][pos.y] <= pos.steps) continue;
beenThere[pos.x][pos.y] = pos.steps;
if( topoMap[pos.x][pos.y] === '{' ) {
bestSoFar = pos.steps;
continue;
}
const next = directions
.map((d) => d.clone().add(pos))
.filter(R.isNot(oom))
.filter(isReachable(topoMap, pos));
const next = directions.map(
d => d.clone().add(pos)
).filter( R.isNot(oom ))
.filter( isReachable(topoMap,pos) )
.filter( next => !pos.beenThere.includes( next.toArray().join(',') ) );
next.forEach((n) => (n.steps = pos.steps + 1));
next.forEach( n => n.steps = pos.steps + 1 );
next.forEach( n => n.beenThere = [
...pos.beenThere, pos.toArray().join(',')
] );
potentials.push(...next);
}
return bestSoFar;
potentials.push(...next);
}
return beenThere[final.x][final.y];
}
export default findShortestPath;

View File

@ -1,4 +1,94 @@
import * as R from "remeda";
import Victor from "@a-robu/victor";
import { readFile } from "../05/part1.js";
export default () => {};
const V = (x, y) => new Victor(x, y);
export const findAs = (topoMap) => {
const locations = [];
topoMap.forEach((line, x) =>
line.forEach((v, y) => {
if (v === "a") locations.push([x, y]);
})
);
return locations;
};
export const findEnd = (topoMap) => {
let y;
let x = R.findIndex(topoMap, (row) => {
let z = row.indexOf("E");
if (z === -1) return false;
y = z;
return true;
});
return V(x, y);
};
const directions = [
[0, 1],
[0, -1],
[1, 0],
[-1, 0],
].map((d) => V(...d));
const outOfMap = (maxX, maxY) => (loc) => {
if (Math.min(loc.x, loc.y) < 0) return true;
if (loc.x >= maxX) return true;
if (loc.y >= maxY) return true;
return false;
};
const isReachable = (topoMap, pos) => {
const baseline = topoMap[pos.x][pos.y].charCodeAt(0);
return (next) => {
return baseline - topoMap[next.x][next.y].charCodeAt(0) <= 1;
};
};
function findShortestPath(topoMap) {
const final = findEnd(topoMap);
final.steps = 0;
topoMap = topoMap.map((line) =>
line.map((c) => c.replace("S", "a").replace("E", "z"))
);
const initial = findAs(topoMap);
const potentials = [final];
const beenThere = topoMap.map((line) => line.map(() => 9999));
const oom = outOfMap(topoMap.length, topoMap[0].length);
let failsafe = 10; //topoMap.length*topoMap[0].length ;
while (potentials.length > 0) {
// if(! failsafe--) return;
const pos = potentials.shift(); // depth-first
if (beenThere[pos.x][pos.y] <= pos.steps) continue;
beenThere[pos.x][pos.y] = pos.steps;
const next = directions
.map((d) => d.clone().add(pos))
.filter(R.isNot(oom))
.filter(isReachable(topoMap, pos));
next.forEach((n) => (n.steps = pos.steps + 1));
potentials.push(...next);
}
return R.pipe(
initial,
R.map(([x, y]) => beenThere[x][y]),
R.minBy(R.identity)
);
}
export default findShortestPath;

View File

@ -1,5 +1,4 @@
\--- Day 12: Hill Climbing Algorithm ---
----------
## \--- Day 12: Hill Climbing Algorithm ---
You try contacting the Elves using your handheld device, but the river you're following must be too low to get a decent signal.
@ -7,7 +6,7 @@ You ask the device for a heightmap of the surrounding area (your puzzle input).
Also included on the heightmap are marks for your current position (`S`) and the location that should get the best signal (`E`). Your current position (`S`) has elevation `a`, and the location that should get the best signal (`E`) has elevation `z`.
You'd like to reach `E`, but to save energy, you should do it in *as few steps as possible*. During each step, you can move exactly one square up, down, left, or right. To avoid needing to get out your climbing gear, the elevation of the destination square can be *at most one higher* than the elevation of your current square; that is, if your current elevation is `m`, you could step to elevation `n`, but not to elevation `o`. (This also means that the elevation of the destination square can be much lower than the elevation of your current square.)
You'd like to reach `E`, but to save energy, you should do it in _as few steps as possible_. During each step, you can move exactly one square up, down, left, or right. To avoid needing to get out your climbing gear, the elevation of the destination square can be _at most one higher_ than the elevation of your current square; that is, if your current elevation is `m`, you could step to elevation `n`, but not to elevation `o`. (This also means that the elevation of the destination square can be much lower than the elevation of your current square.)
For example:
@ -35,10 +34,10 @@ In the above diagram, the symbols indicate whether the path exits each square mo
This path reaches the goal in `*31*` steps, the fewest possible.
*What is the fewest steps required to move from your current position to the location that should get the best signal?*
_What is the fewest steps required to move from your current position to the location that should get the best signal?_
To begin, [get your puzzle input](12/input).
Answer:
You can also [Shareon [Twitter](https://twitter.com/intent/tweet?text=%22Hill+Climbing+Algorithm%22+%2D+Day+12+%2D+Advent+of+Code+2022&url=https%3A%2F%2Fadventofcode%2Ecom%2F2022%2Fday%2F12&related=ericwastl&hashtags=AdventOfCode) [Mastodon](javascript:void(0);)] this puzzle.
You can also [Shareon [Twitter](https://twitter.com/intent/tweet?text=%22Hill+Climbing+Algorithm%22+%2D+Day+12+%2D+Advent+of+Code+2022&url=https%3A%2F%2Fadventofcode%2Ecom%2F2022%2Fday%2F12&related=ericwastl&hashtags=AdventOfCode) [Mastodon](<javascript:void(0);>)] this puzzle.

View File

@ -5,22 +5,24 @@ import part1, { findStart, sample, puzzleInput } from "./part1.js";
import part2 from "./part2.js";
describe("part 1", () => {
test( "findStart", () => {
expect( findStart(sample).toArray() ).toEqual(
[0,0]
)
});
test( "sample", async () => {
expect(part1(sample)).toEqual(31);
});
test.only("solution", () => {
expectSolution(part1(puzzleInput)).toEqual("TODO");
test("findStart", () => {
expect(findStart(sample).toArray()).toEqual([0, 0]);
});
test("sample", () => {
expect(part1(sample)).toEqual(31);
});
test("solution", () => {
const r = part1(puzzleInput);
expect(r).toBeLessThan(9999);
expectSolution(r).toEqual(361);
});
});
describe("part 2", () => {
test.todo("solution", () => {
expectSolution(part2(puzzleInput)).toEqual("TODO");
describe.only("part 2", () => {
test("sample", () => {
expect(part2(sample)).toEqual(29);
});
test("solution", () => {
expectSolution(part2(puzzleInput)).toEqual(354);
});
});

449
2022/13/input Normal file
View File

@ -0,0 +1,449 @@
[[[[10,6],3,[9,6,7,9,7]],[[2,4,10,7,1],[7,9],[8,2,9,9,2],5,[1]],5,[]],[[[8,6,6,9,1],1],[7,[8,3],9,4,[0,3,10,9,7]]],[[[10,1]],0,[],[[4,1],[3],[10,6,4],10]],[8,[7],2,9],[[],2,[[3,6,3,6],4,[8,7,4,7,2],3]]]
[[8,9,[[]]],[],[]]
[[10,8]]
[[[[4,1,5,2],[2,9,0,7,10],[7,0]],0,[],[7,10,6,[2,10,0,10]],0]]
[[[4,7,[],3,[]],5,2,[]],[10,6,9],[3,6,8,[]],[3,[[3,1,6,0],9,8]],[[0,3,1],0,6,[4,9]]]
[[[[7],5,10],5]]
[[2,[],[10]],[9,1,[5,[4,5,0],[6,3,3,3,2]]],[[[6,0,2,7]],[10,6,[]],10,8]]
[[0,[4,7],10],[4,8,0,4,6],[],[[[5,10,0],10,[9,5],9],4,[3]],[[],0]]
[[],[[[8,6,8],[6],3],1,4,[[7,4,9,1,10],[3,10,5,4],[6],8],5]]
[[],[0,[0,3,2],8,10],[9,[[],9,6,[]],10,[]],[9],[[[9,5],4,5],[[7,2],[7,1,1]],6,[]]]
[[6,[6,[7,3,8,8,8],[0,1]],0,[[10],[1],[6,10,10,3,4],6],[[10,3,1,9,0],[8,10,3],1,[8,9]]],[9,[4,[10,10,7,7],5,[4]],[],2],[6,[[7,8],2],[[2,8,6,6],[8,4,5,3,4]],3],[[1,[],[6,1,0,8,5]],[6],[5],0]]
[[[9,[],0,[0,1,0,6,6]],[6,7,9],[8,7,0,3,[5,6,3,0]],3,[[0,0,10,1],[6],8]]]
[[[[2,0,3,3,6],8],[[9,5,2,6,7],[2,4,9,6,8],3,5],[[2,4,9,7]]],[2,[4,[]]],[[6,[3,9,7,5,0],[0,7,8,6],[6,6,7],[0,7,2,5]],[[2],[10],5],9,6,[10,[],0,[4,8,7,5],[10]]]]
[[3,[]],[[3,0],5],[3,1,[[8,3],6,[9,3,10]],[[1],7,8,8],3],[]]
[[[5],[[8],5,[0],6],3,5]]
[[],[[[],[8,4,1],0]],[]]
[[1,[[0],7,[0,8],4,[]],8,[3,5,[2,4,9,6,3],4]]]
[[5,[[],7,[7,10,1],6,0],4,[[0,8,7,9],4,8]],[2,[4,[2,8,4,1,1],[5,7,6,10,2],10,[4]],0]]
[[6,[2],[[6,9,2,3]]],[],[6,8],[],[[4,10,3],2,5,[[8,4],[6,0,2,2],[0,1]],5]]
[[[[5,3,6],[4,9],10,7],1]]
[[],[[8,[8,1,3,9,1]],0],[4,3]]
[[[1,[10],9],[[3,10],[2,2,6]],[],[[7],6],[8,1,[0],7,[10]]],[],[0,[2,9],[0,1,5],8]]
[[[],[9,9]]]
[[],[],[6,[[7]],2],[8,9,2,0,[8,8,[0,3,0,3],9]],[]]
[[[]]]
[[2,5,[0],6],[[2,[8,3,1],5],[],[0,[2,3],6,[],6],[[8,1,8,10,5],[5]],[10,2]],[]]
[[[[1]]]]
[[[],[2,[8,5],2,[0,8]],4],[[[6],7,8,[]]],[[]],[],[6]]
[[[],0],[[2,[],6],3,[8,[5,9,4,3,3]],2,[1,10,[1]]],[[0,[1,5,2,3],7,1],[10,7,[5,3,2],5],[[9,7],10,1,[4]],[9,[3,5,0,5],[1,10]]],[[7,4,5],[[5,5,5,0,4],[7,3,8,5,3],[2,0,10,0,4],4],8,[8,[]]],[2,9,0]]
[[]]
[[],[1,[4],[[7],[1],10,5,8],10,8],[2,[],[[],[],2,[9,7]],9,[2]],[[2,[10,7,5,8,0],4],2,[7,[5,5,8,7,9],0,[],[9]]]]
[[1],[],[9,[9],[2]],[[[6]],[],1,[],4]]
[[[[],10,[10,10,0]],[[9],[8,6,9,0]],9,[]],[3],[5,6,[4,1,7,[7,6,3,1,4],8]]]
[[[3,5,[1,7],2,[6,4,0]]],[]]
[[3,[],1,[],5],[[0,[1]],[6,[4,2,3]],[[],5,[6],[8,9,6,10]]]]
[[],[[[0,10,9],6,[8,0]],2,[[5,3,3,4,7]],[2]],[[10,[8,3,9],[2,2,2],[2]],[2,3,8],9]]
[[],[],[[[1],5,2,[7,8,9]],8,[],2],[7]]
[[1],[[10,[0],9],3,[],2],[0,[[8,1,7,6,10],[7,1,8,10,2],10],1,[0,10,10,[5]]],[[[],[4,3,6],[8,4],[2],[9,6,2]],9,7,4]]
[[4,[2,8,5,0],[2,3,6,[2,3,4,0],[6,5,4,1,1]],5],[]]
[[],[4,6,0]]
[[],[[[7]],[7,[9],[8,0,7,7],1]]]
[[[10,2,3],[3,3,[]],[],3,[10,[2,8],8]]]
[[[6,[1,3,4],[6],7],[1],7,[[1,2,0],5,[7],0,0]]]
[[1,[5],10],[9],[[[3,10,8,5],[9,2,7,6,4],8]],[[7,1,7],8,1,[],4],[[[1,3],[8],[1,3]],[[4,8],5,10,6,[10,10,3,10]],7,[3]]]
[[[[2,2,8,4,2],0,8,3],8,1,7],[[4,[]],[5,8,6],[[9,6,4],4],[7,[4,8,0],8,8],[]],[10,2],[4,[3],[7],[[3,1,9,10],[10,0,3]],[3,[7],9]],[3,[5],[[6,9,4]]]]
[[10,0,0,[4,2,[3,9,0],9]],[10,[[0]],5],[[[6,1,6],4,[8],7],0,[[10],[7,3,3,6,4]]]]
[[[],9,[7,[6,3,1,10,9]]],[],[7],[7,[],[[],[9,0,8,5,3]]]]
[[8],[[[8],7],[1,[4],[7,6],10,10]]]
[1,0,9,5,8]
[1,0,9,5]
[[[5,[],[2]]],[9],[7,9,[4,2,0,[0]],4],[9,[3,2,0,[6,5,6,1,8],[]],3,10],[10,10]]
[[],[[],0,3],[2,[3,[2,7,3,6,9],[8,1,1,6,0],[10,9,8,8,4],6],9,[[8,8,6]],[]],[6],[[[],5,4,6,[]],7,[10,6,[7,8,0],[1,4,4]],[[6,10,0,7,0],9,[6]],[5,9]]]
[[6],[4],[8]]
[[[],3],[[3,[3],[9,8,2,1],[0,9,3,7,7],[]]],[0]]
[[],[[8,[3,3,2,6,4],[],10],10,0,[[1,1,6,9]],[0,[5,9,10,3],2,1,7]],[[[]],[[10,4],[3,4]],[[],[6,7,6,6,7]],2],[4,8,[[8,0,4],10,[3,3]],[5,2,[0,1,2,1,2],[0,4],[]]],[6,[7],[[9],[],[],0,4],2]]
[[[[],[5,9,8,0]],[4]],[4,2],[[[8,7,4,4,2],6,2,7],7,7,7,4]]
[[],[8,[[4,6,4],[4,3,2,0]]],[[[10,2,9,9],[7],[6,4],[9,8]],[[1],[],3,[7,5,9,0,10],[10,6,3,9,4]],[[9,5,0],0,[]]],[0,[3,[0,9,5,10,4],10,2,3]],[[[6],6,[5,0]],8,4]]
[[10],[[],[[5,9]]],[8,3,1,7,4],[8]]
[[[5,1]],[]]
[[[6,10,[2]],0,[8,[]]],[10,[[10,4,6,4,1],2,2,[6,2,9,5,2],[]]],[[[],8,10],4,6],[[[3,3,2,7,4],2],[10],[7,6,[3,4,8],[7,1],[2]]]]
[[2],[5]]
[[[[]],6,4],[]]
[[3,8,7,4]]
[[9,[[10,2,9,9]],[1,[0,2,1,4,10],0],10],[[[],5,2,[1,7,3,3]],[[9],4,5,9],[]],[],[[[8,6,6,7,0]],[[3],0,[1,2]],[[8,5],9,[10,9],7],3]]
[[4,[[]],[[8,10,9,7,6],6,[4]],10],[[]],[[[2,9,0],9,7,[0,6,8,4],[7,7,8,2,8]],[0,[1],[1]],[10,[1,10]],10],[]]
[[6,[9,9]],[[5,[9,1,9],[]]],[],[5,[[0,1,7,8],[9,1],2,5,3],10,6],[]]
[[7,[2,0],[[9,2,1,10,1],1,[10,2,9],0]],[[8],1,7,7],[0],[[9,7]],[5,[4,[],5,[2,7,1,9,5]],[],[],3]]
[[6,10],[5,9],[6,4]]
[[10,[[8],[1,7]],[[],[3,5,0,2,2],[4,7,1],[6,8,5]]],[[[5],8],[3]]]
[[],[],[3,[3,[10,2,9],[7,10,0,7],3,1],5,[9,10,[],[0,2,10,6]],6],[7,[],[[10,2,8,10,5],8,[0,2,5,2,8],[8,8,1],[0,5,7]]],[5]]
[[[8,[8,7,8]]],[2,[3,[]],4]]
[[8],[2,[[]],2,[]],[9,5]]
[[[],[1,8,[2,10],[8,1,10]],[[5,6],8,4,8]],[[0],[[9,0,7],7,9,10,1],[[5,9,0],2,8,[4,8,8,3]],5],[[7,9,[1,10,4,3]],7,[7,3,1,[9,8,0,4]]],[[],2]]
[[[],5,10,5,4],[[7,[6],4]],[[9,[6,0,5,10,9],[2,3,6,0]],[0,6,2]]]
[[[3,4],[[2,4],[5,9,1,6,8],[7,10],3],[9,3],9],[[[1],7]],[[4,[6,3],[],4]],[1,[[],[0,0,4,7,7],1,6]],[[[8,9,5,3],9,4,9],8]]
[[[4],[3],[8,[2,6,5,10,8],2,[3,6,7]]]]
[[],[],[],[2,[[3],7,1,3,[]],[[4,8,7,0,10],0,[5,9]],0,[3,[3,8],0]]]
[[3,[3,[0],[2,10,9,9,8]],[10,[6,5,9]]]]
[[6,[]],[1,4,[[9,6,3,4,4]],[[10]]],[[9],8,8],[[[2,2,7,0,9]],10,[7,[2,8,1,0],[2,8],9,[3,4,10]],7]]
[[[5,[],6,8,10],[]],[1,[2],[[3],10,[2],[7,4],6],[7,2,2,[0,4,7]]],[5,[3,[0],[8,8,2],[]],[],2,[0,1,[9,8,8,9],[3,0,10,10]]],[8]]
[[],[2,10,[[6,4,3],[2],8]],[3],[]]
[[4,1,[0,[10,2,4],[0],[8,7,7,5,9],1],1,[]],[],[[1,1,[4,4,3,9]],[[1,7,4],8,[5,7,6,6],[2,9,0]],5,5,[[7,8],[5,4,6],[6,1,7],[6,2,6,6]]],[6,[],4,[[2,7,6],8],7]]
[[3],[[[8,5,2,4],[],3,1],5,[[],[6,8,7,6],[],[2,1]],6,6]]
[[],[8]]
[[[],[[10,8,10,2]],[],[[8,8,10],[6],[]]],[10,1,1]]
[[[5,2,[4,10,4]],[5,8,[7]],[4]],[3,[5,[6,5,8,7,2],[9,0,3,6],[2,3,6,0],10],0],[1]]
[[[4,[],8,[7,5,8,7],9],[[2,7,7,9]],3,[],8]]
[[5,[7,6],[1,[],10],[[9,9,3,2]]],[],[3,8,8,9,8]]
[[[[6,0],5,[5,6,8,0,10],1,6],5,4,1],[[[2,8,1,8],[],3,[6,8,4,1,10]],[0],[[8,1],10,[],5],[[],[],[4,2,9,0,9],[1,2,4,6]],4],[],[[[8],1,2,4],0,[5]],[[[4,4,9,9,4]],1,7,[1,1],5]]
[[4,[[10,4]],[]],[6,[[],1],[[10,1,0],[5],[3]],[[3],[8,7,9,1],7,9]],[9]]
[[9],[]]
[[10,[3],[6,5,0,[7]],8]]
[[1,0,8,9,2],[[9,1,7,[4,10,3],[]],[[0,6,9,1,6]],6],[10]]
[[1,0,[[],[6,0]],[[5,9,0,7,4],[1,9],4,0]]]
[[[[8,7,9],[5,1,10]],[7,[4,6,6]],5,2,4],[[[2,5,2,6,0],[2,0,9,4,7],2,[3],[2]],2,1,6,8],[[[2,3],10,2,[7,4,10]],2,1],[[[4],9,[],[4],[2,8,6,6]],1],[]]
[[[[],0,[4,9,10,5,1]],[1,2,2,8,8],[4,[5],0,[7,1,3,0,3],[3]]],[0]]
[[4,8],[7,4],[[[2,0],[9,4,10,4,3]],4,[[2,2,2,9,5],8,[10,3,8],8]]]
[[3,[],6,0],[[]],[],[3],[0,[0,1,[5,1,3]],6]]
[[[[0,0,2,3,10]],2],[[3,8,[5,5,8,6,0]],[[1,8,6],10,0,[0]]],[[[2],1],0,[5,7],0,0],[[],[5,2,6,1,[6,7]],3],[]]
[[[6,[],7],7,5],[2,10],[2,[0,7,3,8],[[],[7,9,8,1]],[4],[[],9,[1,8,3,2]]],[6,7,[[5]],3,0]]
[[[[],8,[9,5],[2,7,3,7,6]],[4],4,[],6],[],[],[[[3],[9,0,7,6],2],[6,3],9]]
[[2,[[7,1]],[1,9]]]
[[9,8,1,[[],[5,8,9,4,1],2,[6,9,9,2,7]]],[[9],10,5]]
[[[3],[[0,2,9],2,5],7,[[],2]],[],[[10,4,[7,0,1],5],[5,[9,6,6,6,7],[2],9],7]]
[[[[3,6],[3],[8,10,7]],7],[8,3,2,1],[6,4,3,[],[0,[10,3,2,9]]],[0],[]]
[[[[2,10],[3,7,8]],[[3,2,5,7],0,3]],[],[],[]]
[[[[3,6,9,7],3,6,2,[]],[7,10,[10,1,3,8],[]],1,9],[[[2,8,0]]],[7,[[6],8,1,9,[7,2,1,0,7]]]]
[[7,[5,[5,5],[6],[3,6],6],5,[3]],[6]]
[[3,[7,[2],[10,10],8],8,[0,[6,4,1,9,9],[],2]]]
[[[1]],[8],[10],[9,[2],1,[[6],[8,3,1,0]],[[8,3,7,8],6,3]]]
[[[7,2,[5,8]],0,[[1,6,9,8],[2,7,9,9]],10]]
[[[6,4],9,[[5,3,3],[0],1,3,7]],[7,[5],[[10,1,6,2],[]],0],[],[6,[],5,5,[2,1]]]
[[6,6,[],1,9],[[],[7,5,[],[4,1],[3,6,1]],[[7,3,0,7]],[[0,2,6,9],6,[8,2]]],[4,[[],6,10,[]]],[]]
[[6],[4,[[1,5,10,6],[5,1],7]]]
[[1],[5],[[],[0,[],[3,8],7,[4,9,1,3,3]],10,[[1,6,4,8,2],[4]]],[],[]]
[[8,[[3,9],[3,8]],[[1,3,6]],7,0],[[4],8,[[],[0,8,8,10,10],[10]]]]
[[[],[[2],[1,0,6,1,7],4,[8,1,6]],[10,1,[9,7,0],[2,0,10,9,1],8],[]],[8],[8,[[8,9,5,0],4,10,[3,8],[9,1,8]]],[0],[7,5,[],0,[]]]
[[],[],[[[8],[]],7,10],[[[9,4,5],9],6]]
[[[[7,4,9,2]],9]]
[[1,8,[]],[[3,8,2,0,1],[7,5,3,[6],[9]],[8,[1,6,10],[2,4,2],10],[[10,1,3,8],8,[10,0,8,8,7],5]],[[[7,0],[]]]]
[[[[],3,3,0,0],[]],[[]],[[[4,0,2],[6,2,9],[2,5]],[[3,6,6],[2,0,5]],[[1,3],[]],10,[6,[],10,[9,6]]],[[1,10,0,6],[[8,0],1,0,[0,7,2,7,9],[7,7,9]]],[[[1,9],0],[[5],[7,4,3,10],[4,6,0,1],[0,5,10,1]],[],5]]
[[[4,4,[],[]],4,[[5,9,4,3,4],3]],[],[1,9,8,[[2,3,7,8],[2,1,3,3],[]]],[10,[]]]
[[7,[[]],3,[],[[2,6]]]]
[[3,[1,[2,6,9],[10,2]]],[[[1],[2,3,0,6,7]],[[1,10,0,7,4],[8,8,8,10],10,[0,9,3]],[],[4,[1,2]]]]
[[1,[[],[2,6,0,5,7]],8,[],6],[],[[],[10,[],8],[[10,5,7,9,9],[0,3],9,8]]]
[[1,1],[[6,9,1,[1]],8],[7]]
[[[9,[3,8,9],2,[5,10,0,1,10],[6,5,4]],[3,[9,2]],5,4,6],[[[8,3,8,5]],[[5,7,2,4],5]],[10]]
[[10,[2,[2,0,10]],3]]
[[[],[[1,10,1],[1,9],[0,1,3,3]],[4,1,[1,2,4,3,8],[8,10,10,3],6]],[3],[[[9,6,3]]],[8]]
[[[3],[[7,2],[3,10,2,7]],9]]
[10,7,9,4]
[10,7,9,4,1]
[[[[7]],9,[[6,6],[6,10,9,3],[3]],[2,[10]],[4,[5,0,5,0],[6]]],[[0,9,4,[2],0],[1,[3,8],1],3],[0],[[],[]],[[[8,3]],[10,[8],4,10],[[],[10,3],8]]]
[[],[8,[[10,10]]],[[],[0,6,7,[6,5,3,9]],8,[],1],[1,7,[[1,3,10,5,0],[1,7,6,0,4],9,[7,2],[8,5,4]]]]
[[8,6,[[],9,3,3,[10,6]],7],[6,[]]]
[[9,0,[[3],3,0,[0,2,9,10,5],5]],[[[8],8,[6]],[[5,3,6,10,9],4],[[6],[10,1],[3,9,6]],7],[[[9,6,1],3],5],[[4,0,[2]],[[],7,[2,4,7,5],8],[],[[],[],[0,6,4]]],[[[3,3,8],2,[3,0,1],[5,3,4]],[[7],4,[2,3]],3,[[3,5,8,8,6],4]]]
[[5,8,[],[[],[5,1,9],7],[[10]]],[7,[[4,7],10,1,2,3],9,[[8,3,6,9],[9,7,5,4],4,[]],[[],5,[5,8,0]]]]
[[5,[4,[8,8,5,7],5,5]]]
[[[6,5,1,6,6],4,[5,[0],7,1,10]]]
[[[[3]],[6,6],6,[[7],5,[2,1,0]],[]],[10,[[0,5],[1,3,0,7,9],[2,8,2,10,8],[]],[[10,2,6,1]],6]]
[[10,1,7],[[[10,1,9]],[[6,4,9],5,9],[[6,5,9,3],8,[8,10,9,0],3,[5,6,8,1,9]],4,[]],[10,[[3,6]],[9,4,[3,8,9],[7,7,4]]],[],[[],[],[[8]],0]]
[[5,6],[10],[4],[1,9,[[1],0,[2,3,10,3]],10],[]]
[[[[1],[2,0,4]],[[7,3,8]]],[]]
[[],[[],3],[3]]
[[[]],[[6,3],7,4,3,2],[9,[[7,5,9,4],7]],[],[]]
[[5],[2,4,[4,[10,8,1],[3,9,1],[],4]],[[]],[[[3,5,4]],[[5,8],[6],[],[9,3,2,7,2],[1,5,5,1,8]],[8,[7,2,4],6],[7],1],[1,1,[[2,8,6,9,0]]]]
[[1,6,8,8],[[[1,5,3,8,3],5,[5,2],[7,6],6],[]],[[[10,9,9,1,4],[6,9,1],6,8,6],4,[7,[8],1,3],4,10]]
[[[[1,2,1],[6,7,5,1]],[[7,5,0,3,5],9,0,[9],6]],[9]]
[[[5],4,10]]
[[5,8,2],[2]]
[]
[[2,[[10],[1,5,4,3],[]],10,5]]
[[0,[9,5,0,3,8]]]
[[[2,[5],[9,7,9,8,7]],0],[[2,0,5,10],7,[[1,8,10,9],[9,2,6],7,[],4]],[]]
[[6,5,3,[7,2,[1,0,6,7,6]],[10]],[[[10],[8,4],[0,1]]]]
[[[],[9,[10]]],[[[5,4,3,4],1,1,[4,8,3]],[2,5]],[2,[[0,6,3,3,9],4,[0,5]],[2,8],[[10,2],6,[1,6]],[[8,0,6],8,0]],[[[7,4,1,4],[0,7]],8,[],[[10]]],[[1,[8,10,1,2],[1,10,5,2]],1,7,7,6]]
[[[],10]]
[[1,[[0,5]]],[1],[[]]]
[[9,1,[]],[[[],[9]],2,[]],[[[5,8,5,10,9],8,[],[0,7,0,4,10]],[],[[8,1,10],[9,10]]],[1,[3,[3,4,8,9,10],[]],7,[1,3,6,9,[0,0,5]],6]]
[[[6,5,[10,7,0],[1,2]]],[4],[],[[0,7]],[4,[[9,0,6]],6,5,[9]]]
[[[[6]],2,[[],2],4],[4,9],[5,4,0,[4],[10]],[],[[8,7,3,10],9,10]]
[[0,[6],6],[[],[8],[],3,4]]
[[],[[],4],[[1,2,[1,9,5],1],[7,[],[]],8,6,[]],[[8,[8,5,4,0,9],[10],[8,2,1,3]],[[5,1],10],1,8]]
[[9],[[[],0,4,5],4,[8,[],4,10]],[[[4,8,4,2],6],[[9],[]]],[2,[]]]
[[[[6,6,5,7],10],[3,[],[0,0,8,1,8],[10,4]],[[5],8,[3,5,8],2],[10,[8,0,4,9],1,[3,4,8,6],[8,6]],[[9,8,7,6,1],[1,6],3,8]],[[9,4,4],[[10],[],[2,5],[9,7,4,3,2]],[[6],5],[6,0],[[3,4],10,[5,2,4,7],[5]]],[3],[[[3,0],3,[5,4,8,0,8]],9,1,2,[[0,8],[3,9],8,6,6]]]
[[3]]
[[[[1],10,[3,6,3],[9,8,3]],0]]
[[0,[9,[8,8,1,9],3],3,7,7],[3,[3],6,2,1],[],[[0,[0,9,10,7],[9],0],[2,4,3,[4,5,1,3,9],10],3,2,[[],9]],[[0,[10,6,3]],[],2]]
[[2,[],[10,[7,6,3,5]],3,[2]],[0],[9,[6,10,10,0,10],1,9]]
[[[[9,6,4,6],[0,10,3,5,3],2,5,9],[[10],4,9],[9,6,8,2,1],4,6],[[[6,1],[5,9],3,1],[],[[1,4],[],6,7,[1,4,6,1,3]],6,2],[0,5,[[10,5,10],[2,8],[3,4],10,[6,4,8,6]],2,5]]
[[7,[8],[[9,9,7]],6],[[[3,3,8,5,3],[],[3,3],[2,3,8],8]],[4,9,[7,5,[1,5,2],4,[9,6]]]]
[[],[9,3,[[7,3,5,4,7]],4],[],[[],2,[[1,10,3]],[8]]]
[[8,1,1,[1,0,[2,4],8,[]],10],[2,9,1,10,1],[[[],0,1,[9,1,8],3]],[8,[]],[1,[5,[],[10,4,8,10]],[[8],5,[],3,[7,0,4,9,0]],9]]
[[],[[[2,8,5]],10,[[6],10],[[3,10,9,5],0,10],0],[10,6,[10,9,9]],[10,3]]
[[6,[[4,0,7,4],[10,1,1,9],[],1,1]],[[],6,3]]
[[[3,1,6],9],[1,0,[5,[5,4]],[[2,5],[0,3,4],[],9],[]],[1,3,[[2],0,[4,1],[4,2,9,0,6],2]],[10,2,7,[9,[],[2,1,1,4,2]]]]
[[[9,3,[0,0,2],9]],[6],[[[10,4],[3,5,10,7],6,2,[6,1,3]],7],[[7,2,4,3,4],5,[5,5,[2,8],[9,2],7]]]
[[3,7,4,[[8,7],0,4,2],3],[],[2,[[5]]]]
[[9,[1,10,[2,3,0]],[],2],[[10,1]],[]]
[[0,5],[0,[[9]],[[2,5],4,[],[4],2]]]
[[[6,9,[7]],[8,[9,8,9,1],8,5],[],[]],[[[8,1,8,8],1],[],9],[[[],5,[3]],[[6,6,2],5,[]],[[4,7,7]],[[5,5,10,8]],[1,[9],1]]]
[[[1],6,[[3,9,0],10,[9],2,3],[6,[],[2]],[]],[8,5,[4,[0,5]]],[2,6,[[7,5,8,3,7],[2,10,6],[1],[],5]],[5,7,[[8,6,10,10],[],5],6],[]]
[[[],[[6,8,6]],[9,10,[8]],[4,4,[2,1,6,1,10],2]]]
[[],[],[],[[3,[]]]]
[[],[4,[5,4,[2,9,6],[8],4]],[2,[2,[],4],[8,4],[8,3,[6,1,6,8],7,2]],[[[],0,[4,2,6,4,3],[],[]]]]
[[7,[[],[1,8],[9,0,1,10,10],5],9,[1,[10,0,2,8,9],2,7,4]],[[4,6,[2,6,9,10],[4]]],[[[8,3,4],6,[2,10,1]],[0,9,[8],4,5],4,5],[2]]
[[9,[[9,5,4,0,10],3,7],[[9],[],[4],[6,8,9]],6],[[9,8,2]],[6]]
[[[1,[7],9,7,1]],[[[1,0,7]]]]
[[8,7,[[],5,[2,9,1]],[]],[1,[5,4,2],8,9,9],[7,[[5,10,0,10],0,1],3]]
[[2,7,4,8,2],[10,8,[4]],[[[],[6,0,3,5,10]]],[[2,[]],9,[]]]
[[9,[[8,7,3,7,2]],10]]
[[],[]]
[[[[4,8],[4,2,0],8,3],8,6,[]]]
[[[[8,2],7,2,[10,1,4,2],9],2,9],[8,[7],0],[],[6,6,2,[0,[1,3,7],[1,10,1],5]],[6]]
[[[],[[1,3,10],[4,3,0,2,3],[9],9],4],[]]
[[[7,1,4],5,[4,[6,6],0],[[],[4,5,0,4,8],3,[3,10,0,2,6],[2,4,9,1,5]],[]],[[[]]],[[[6,6,10]],[9],3,5,[4,[2,5],1,8,[9]]]]
[[[[4,2],[4,8,10,2],0,[8,8]],[[4,3,0,4],[6],9,[0,0,4,0]],0],[5,[4,[8,7,2,0],4,6,1],[]]]
[[7,[],[3,1,9,[8,8,0,5],6]],[10,[],[[4,8,9,3],[9,1],[5,6,6]]]]
[[[],6,3,[]]]
[[2,[8,[3,5,6],2,4,[9,9,8,7,2]],9,[[3,5,5,7],[6,3]],1]]
[[1,[1,1],[6,[7,8],10,6,0],0,[8,[5,5,3,9],[0,8,5,8,8]]],[[[8,7,6,1]],[],7,10],[3,8]]
[[6],[4,[],[4,[0,9,4,7,4],0,[]],[5,6,3,[1,8,6]]],[1,[],7,10,[]]]
[[[[6],[1,1,7,7,7],[1,4,4]]],[[[]],6,[2,6,5,3],[4,[8,2,7,10],9,[8],1],4],[[10,9],1,3,[[10,0,0,4],[],[1,7],7,[]]],[[4,10,6,6],8],[9]]
[[],[[[9],[3,5,2]],[0,[9,5],9],6],[],[],[[]]]
[[[[8],[0,10,6]],[4,5,5],0,8],[]]
[[[2,[6]],[[1,10,4,1,3]]],[],[10,[4],[0],[0,[0,9,8],[3,8,8,2],5,4]],[[],4],[]]
[[[5,3,[0,2],3,5]],[],[],[5,[[2],[6]]]]
[[],[[6,4],[0,[2,2,10],3],[],[]]]
[[10,[[]]],[],[[9,2],3,[[8,9,4,5,4],[0,2]],10,[]],[[[1,0,9,8],9]]]
[[6,8,[[],5,7,[0,7,1,7],[5,5]]],[[0,3,[9,2,0,2,6]],8,3,[2,2]],[9,[],[]]]
[[3,[[2,2,0,7,0],[0],8,7,[1,8,10]],[[4,8,0,6]],6],[]]
[[[5,[6,4,6],[1,8,4],8],4],[[],2,6,8,7],[[]]]
[[7,[5,5,6,[8,9,9,7,1]],[[3,8,8,8],[9,0,1],10]],[[[7,4,3],[2,5],[5,9,3]],8,10],[[3,10,9,[],10],[5,[2,10]],8,8,[3]],[7],[[[3,5,0,2]]]]
[[],[[8,10,[4,5,2,4],[3]],10,[[]],9],[[2,[7,7,10,10],[7,3,10,10]],[[1,2,5],9,6]]]
[[1,10,10,[]],[[[9]],[[5,10,0],2,[5,5]],4]]
[[8,2,[[],[2,1,7,7]]],[[6,[7,2,8,8]],[],1,[[10],[0,6,5,8,9],[10,9,6,7,0],[],[3,8,10]],[10]]]
[[8]]
[[],[[[8],[1,5,4,1],2]]]
[[[[4,5],0,8,[3,7,10,6,7]],[9,6,[1],0,5],[7,0,5]],[[]],[[3,10,[]],[0,9,8],0,[[9,4,4],5],[4]]]
[[[[10],1],[7,[7]]],[[4,10,2,4]],[[8,[0,10],[],1],[8,10,[2,8,2,4]],[8]],[3,10,[5,[0,0,7],5,10,5]],[5,5,6,0,[9,[0,2]]]]
[[],[],[[[9,10,1,9],[1],3],9,[5,[]],[[10,7,6],6,[1,3,3],[]]],[[6,[9,8,3,8,9],9,[]],[1,5,4,1,[7,8]],[[10]]],[8,5]]
[[],[0,10,0,0,1]]
[[3],[[5]],[0,9],[[]]]
[[1,9,3,[5,5,[]],4],[[[5],1],9,0,10,6]]
[[[8,10,1,3,[0,5,2,8,6]],2,4]]
[[3],[[10,[4,10,6,8,9],[10]]],[9,0,[],[[10,3,5],1]],[[[6],[4,1,7,10],[5,5,3,8,3],8,4],[[9],[10,8,6,1,7],[6,6]],8,[6,0,[4,2,5,10,0],10]]]
[[[[6,7,9,3],[],0,5,[8,4,4,2,6]],3,[],[8,[]]],[[[1,9,7,9,2]],[9],[[1,6,4,0,0],[4,0,4,4],[3,4]],3,7],[[],7,[6,5,5,4,0]],[9,[[10,7,1,2,0],[5,0,10,4],[],3],9]]
[[[5,[6,1,0],[8,0]],[10,8]],[],[7],[[[3,4,3,5,5],5,9],[5,[8,9],7,[5,7,4,0],1]],[[[],[3,2,1,3,8],[9,0]],[[5,2,1],10,0,4],[[],[3,5]],[4,10,[1,0,8,3,1]],6]]
[[10],[10],[]]
[[],[[8,[3]],6,9,[[0,10,6],[6,1,3,0],[0,9],4,2],[[1],[1],[10],1]],[5,[10,10,[4,8]],10,[8,0,9,[4,2,0,6,8],9]]]
[[[[10,4,5,9,6]],0,[6,[10,9,2,3],10]],[[[10,10,9],6,[10,2,5]],[[8,2,6],7,[3,4,2]],4]]
[[[],6,8]]
[[0,5,[[4,4],10,[],[],6]],[[[2,8],[9,3,10]],10],[],[[[],4,4],4,[[10,0,2,6],10,7,[],[3]],[7,1],[4,[7,6,1,5,5],4,4,0]]]
[[8,[0,7,[8,1],[1,4,6,4,9],[10,6]],1,[]],[],[6],[2,[[10,2,1,10,7],[1,8,10],[7,0,9]],7]]
[[[[4],2]]]
[[4,0],[1,[[1]],[]],[[10,[1]]],[0,0,[0,[6,5,7,8],[1,10]],7,[9,[3,9],[9,6]]]]
[[[8,7,[9,10,4,2,1],4,7],3]]
[[9,[9],8],[8,[1],[1],[9,[3,3,1,2,3],9,10,[4,8]],7],[[8,0,[3,1,9,1,5],2,6],10,5,3,[[8,7,5,10]]],[]]
[[[7,[]],[[10,8],[9,7,3,8]]],[[8,[],[2,0,3,6],10,[1,0,1,6]]],[0,5,[[],6,[8],1],10],[2,4]]
[[10],[7,7]]
[[],[8,8,[9,0,[],[9,6]],7,5],[]]
[[],[1],[[8,[],2],[],1,[1,9,[],3],[]],[[[8,8,10,10,1],[],[0],7],7,[[1],[4,2,10],8,[8,1],[10,8]],6,9],[1,[],9,[[7,5],1],1]]
[[[8,[5,2],[9,9,4,4],2,0],[[5,0,10],[8,6,5,1],[1,4,1,5,1]]],[[]],[[],5,6]]
[[[]],[[],[[],[]],4,[]]]
[[[],3,8,2,10]]
[[[[3,0,0],2,[9,7,2],1],9],[[],[[8,8,0,7],9,[],9],5],[]]
[[[[10,6],[8,9,2,6],[0,1,5,5,0]],1,[],5]]
[[0,[6,10,5],7,7,0],[7],[4,[5],1,[[1,0]],10],[[10,4,7,5],[]],[3,[7,[],[10,2,2,2,0],[],[0]],9]]
[[],[3,[9,[10,10,3,6,10],7,8,9],6,[]],[[10,[8],1,0],7],[],[[[1,5,6,4,5],3,1,3],[4,0,[1,1],[]],[],[[],10,8,6,5]]]
[[[5,[3,0,9,9],[]],4,5]]
[[[0,[1,10,0,4]],1,[[0,10,3,9],4,8],[[5,7,1,8,0],[9,1,10,7,2]]],[6,3]]
[[[10,10,[3,10,7]]],[6,5,[[10,1,10]],1,1],[10,[9]],[[5,7,0,[],[6,0,10,10]],1,6],[9,8,[]]]
[[8,6,6],[4,[[],6,3,1,4],[[1,2,9,4],8,2],1],[],[9],[[3,0,0,4]]]
[[[4],10,0,[],[9,[6,8]]],[[4,5,[0,3,3],6],1,[[3,2,7,1,10]],[[3],3,[]],[]],[[[3,10,5,2],[7],9,0,9],5,10]]
[[[6,[10],9],6,[1],[[9,5,10,9],4,5,[]],1],[]]
[[8,0,9,[]],[[[4,1,2,7],[9,9,8,7,3]],10,1,5,[9,3,4,4,4]],[4,[[0,6,8,6,10],2,[5,10,6,7,9],2],[[9],7,1,8],0],[[[5,8,9,3],6,10,0,6]],[[5],[[7,4],[],6],5,1,[0,[9],0,[8,7]]]]
[[2,3,[]],[[6,4,[],[10,6,8,5,8],6],[1,5,[9,0,1,8,10],[5,8,8],5],[[],[4,6,0],[3,4,5,4,4],8],[[7,6]]],[]]
[[[2],[[9,5,3,6]],[[],[5,9],[3],[10,9,4,1,7]],[4]],[[],[[],8,[2,8],3,[2,7,5,2,6]]],[],[2,[[1],[],4,[3,2,2,1,1],2],[[3,7,6,10,1],10],[[],[0],4,[4,0]]]]
[[[[]],[[5,10,1,9,4]]],[3,[4,7,[4,7,5,8,10],[],[1]],4]]
[[[[9,9,0],2],4],[[],[7,3,[10,4,5,3,5]]],[[],[6,[10],1,[]],10,1],[[]],[5]]
[[[10,[]],1,[3,[0,9]]]]
[[[[9]],[[8,5,2,1,4],[]],[]],[],[[[1],6,10],7,1,[[],[8,0]],10]]
[[[1,[5,2,1,6],[5,2,9,7,5],7],4,6],[1,5,5,[1]],[[10,[8,0,4,0,4],8],7,[4,10,4]],[]]
[[[[10,8,0,6]],10,[7],[1,10],3],[10,[8],[3,[4,4,6],[]]],[[10,3,7],[[2,3,6],7,4,[]],[3],[[2]]]]
[[9,9],[10,10,[[6,5,3,5,1],[10,7],10,[3,6,2]],2],[9],[[[9,10,4,9,2],[]],[[10,6,7],8,[7,3,6,9],[2,8,1,9,6]],[[5,4],9,5,[6,0,2,7],[]],2],[[],[0,[9,1,0],6]]]
[[],[8,[6,4,[10,8,0,8]]]]
[[1,[3,1,8]],[[],5,[[]],[5,[3,6,9],[7,5,8]]],[[1,8,1]]]
[[[[10,3,7,0,5],10],9,[[]]]]
[[],[[],[],[[],[9,9],8],[6,[3,4,5],[]]],[6,[[3,3,4,9,10],[4,4,3,5,1],7,[0,9,7],[2,2,0]]],[0,[[0,2,10,1],[],[3,10,4,4,9],[],4]],[[0,1],[8],5]]
[[],[[2,[],1,4]]]
[[[],[[6,6,0],10],[[2,4,8,10],0,[6,8]],3,10],[4,7]]
[[5,10,10,[[10]]],[1],[7]]
[[2],[1,0,[[5,5,7,4],1]]]
[[1,9]]
[[[],[8,[4,9,4,6,1],0,[1,3,4,3,0]],7,[[8],7]],[[[6,4,1,0,10]],3,[8,[1,6]],[[9,9,10]]],[10,[10]]]
[[3,10],[9,8,2]]
[[6,7]]
[[2,[10,0,[9,4,4],[5,2,5,10],4],[[4,3,3,8,6],3],[9,[6,7,4],[1,6,5,7,10],[10,1,1,9,10]],[1,10,[1,9,9,5],[8]]],[10,[4,[],[4,2]],10,9],[[[9,10,3],5,[0,7,2]],[4,4,2],4]]
[[1,10,8,[[10,0],4,9,[4,1]],[[8],[2,1,7,7]]]]
[[[[2,3,9,7],[5],[7],10,[10,1,5,2,9]],[8,[1,0,3,5],4],[5,8,[2]],10,[10,6,[5,1,3],8]],[[3]],[1],[8],[4,[9],[],3]]
[[1],[],[[3,[0,3],[],[7,7,2,1,7],[4,3,2]],[7,[5,2],4],0]]
[[[[1,4,4,5,10],[6,8,6,3,2]],[0],10,[[8,1,8],0,[9,7,0,9,6]]],[3,[6,1,[]],9,[[7,8,6,1,10],[2,1,3,3,7],[8,7,0],2],4],[5],[]]
[[[3,[7,3,10],[6]]]]
[[],[1],[9,2,[[],1,[9,6,5],9],[0,2,[8,7,4,2,8],10,[]]],[1,[2]]]
[[3],[7,7,2,[7,[10,0],[2,9,1],[7,8],[]]],[[1,6,[],[10,6,1],6],0,[1,[9,10,9,5,7],[0,6,6,6]],2],[]]
[[5]]
[[],[1,[[6,8,7,1,6],[5,0,1],[]],3,[[1,1,2,2],[2,2],[0,0,8,4,3],10,4],[5,[6,6,6,8,10]]],[]]
[[1],[[1],5,10,[[1,0,6]],0],[8,[],7,3,[]],[2,6,4]]
[[3],[2,[[6,1],[3]]],[3,3],[10],[[4,3,3],[[3,10],5,10,[]],[[],8]]]
[[0,2],[[9,[6,9,5],1]]]
[[[[6,8,0,3,5],10,[2,5,4,4,2]],1,10,[[2]]],[[6,2,[2,3],[9,3,4]],5,[0,[10],7,9,6],[]],[8,2,[8]],[[5,[10,10,9],[6,4,3,8],[1]],6,4,5]]
[[[8,1,[],[],[5]],6,7,9,1],[5,10],[]]
[[[9,[9,1,10,9,8]],9,6,0,[[0,4,6],[1],7,3,[4]]],[1,[[2,7,7],[8,4],[7,9,3,3]],[3,4],7,4],[4,7,[],[],4]]
[[[],[7],0,5],[2],[4,6,4,6,6],[8,[[],7],[6],[[],2,[],1,[2,2,2,4,1]]]]
[[[[4],7,[4],[0,8,1]],[[3,6],[8,8,7]],10]]
[[7,6,[5,8,[]]]]
[[1],[[[10],[0],[8,8,7,4,5]],6,[[9,0],[10,7,3],4,[2,4,5],[5,7,10]],[[1,5,10,10],[],[3,3,9]]],[[[0,1,9,5],[6,8,1,2],8,[6,10,8],9],[],[[6,9,7],1,1,6],[[]]],[6,[[6,5,3,4,6],[8,6],2,[5,6,2,10,8],[9,8,1,6,5]],[],10],[[],0,10,2,[1,[8,8]]]]
[[7,10]]
[[],[[[8,4,0]],[4,8,[5],1],[[1],[7],5,5,[3]],4],[5,[1,[9,2,8],[1,2,3,3,8]],2,8,[1,6,1]],[[[6]],0,5,0],[7,8,[4,6]]]
[[8,[[6,1,3],7],4,7,[[10,6],[4,7,10,6,8],[3,4,10,4,5],[0],4]],[[0],[2,[3],[]],1]]

42
2022/13/part1.js Normal file
View File

@ -0,0 +1,42 @@
import * as R from "remeda";
import { readFile } from "../05/part1.js";
const readInput = (...args) =>
R.pipe(
readFile(...args),
(lines) => lines.split("\n\n"),
R.compact, // remove last line
R.map((block) => block.split("\n").map((line) => eval(line)))
);
export const puzzleInput = readInput(import.meta.url, "input");
export const sample = readInput(import.meta.url, "sample");
export function isLessThan(x, y) {
if ([x, y].every(R.isNumber)) return x < y ? -1 : x == y ? 0 : 1;
if ([x, y].every(R.isArray)) {
for (const [a, b] of R.zip(x, y)) {
const res = isLessThan(a, b);
if (res !== 0) return res;
}
if (x.length === y.length) return 0;
return x.length < y.length ? -1 : 1;
}
return isLessThan(...[x, y].map((z) => (R.isNumber(z) ? [z] : z)));
}
const passthru = (x) => (arg) => {
x(arg);
return arg;
};
export default R.createPipe(
R.map(([x, y]) => isLessThan(x, y)),
(results) => results.map((value, index) => ({ value, index: index + 1 })),
R.filter(({ value }) => value !== 1),
R.map(R.prop("index")),
(results) => results.reduce((a, b) => a + b)
);

14
2022/13/part2.js Normal file
View File

@ -0,0 +1,14 @@
import * as R from "remeda";
import { isLessThan } from "./part1";
const dividers = [[[2]], [[6]]];
export default R.createPipe(
R.flatten,
R.concat(dividers),
(packets) => packets.sort(isLessThan),
(packets) =>
packets.map((p, i) => ({ i: i + 1, divider: dividers.includes(p) })),
R.filter(({ divider }) => divider),
R.map(R.prop("i")),
(v) => v.reduce((a, b) => a * b)
);

124
2022/13/puzzle.md Normal file
View File

@ -0,0 +1,124 @@
## \--- Day 13: Distress Signal ---
You climb the hill and again try contacting the Elves. However, you instead receive a signal you weren't expecting: a _distress signal_.
Your handheld device must still not be working properly; the packets from the distress signal got decoded _out of order_. You'll need to re-order the list of received packets (your puzzle input) to decode the message.
Your list consists of pairs of packets; pairs are separated by a blank line. You need to identify _how many pairs of packets are in the right order_.
For example:
```
[1,1,3,1,1]
[1,1,5,1,1]
[[1],[2,3,4]]
[[1],4]
[9]
[[8,7,6]]
[[4,4],4,4]
[[4,4],4,4,4]
[7,7,7,7]
[7,7,7]
[]
[3]
[[[]]]
[[]]
[1,[2,[3,[4,[5,6,7]]]],8,9]
[1,[2,[3,[4,[5,6,0]]]],8,9]
```
Packet data consists of lists and integers. Each list starts with `[`, ends with `]`, and contains zero or more comma-separated values (either integers or other lists). Each packet is always a list and appears on its own line.
When comparing two values, the first value is called _left_ and the second value is called _right_. Then:
- If _both values are integers_, the _lower integer_ should come first. If the left integer is lower than the right integer, the inputs are in the right order. If the left integer is higher than the right integer, the inputs are not in the right order. Otherwise, the inputs are the same integer; continue checking the next part of the input.
- If _both values are lists_, compare the first value of each list, then the second value, and so on. If the left list runs out of items first, the inputs are in the right order. If the right list runs out of items first, the inputs are not in the right order. If the lists are the same length and no comparison makes a decision about the order, continue checking the next part of the input.
- If _exactly one value is an integer_, convert the integer to a list which contains that integer as its only value, then retry the comparison. For example, if comparing `[0,0,0]` and `2`, convert the right value to `[2]` (a list containing `2`); the result is then found by instead comparing `[0,0,0]` and `[2]`.
Using these rules, you can determine which of the pairs in the example are in the right order:
```
== Pair 1 ==
- Compare [1,1,3,1,1] vs [1,1,5,1,1]
- Compare 1 vs 1
- Compare 1 vs 1
- Compare 3 vs 5
- Left side is smaller, so inputs are in the right order
== Pair 2 ==
- Compare [[1],[2,3,4]] vs [[1],4]
- Compare [1] vs [1]
- Compare 1 vs 1
- Compare [2,3,4] vs 4
- Mixed types; convert right to [4] and retry comparison
- Compare [2,3,4] vs [4]
- Compare 2 vs 4
- Left side is smaller, so inputs are in the right order
== Pair 3 ==
- Compare [9] vs [[8,7,6]]
- Compare 9 vs [8,7,6]
- Mixed types; convert left to [9] and retry comparison
- Compare [9] vs [8,7,6]
- Compare 9 vs 8
- Right side is smaller, so inputs are not in the right order
== Pair 4 ==
- Compare [[4,4],4,4] vs [[4,4],4,4,4]
- Compare [4,4] vs [4,4]
- Compare 4 vs 4
- Compare 4 vs 4
- Compare 4 vs 4
- Compare 4 vs 4
- Left side ran out of items, so inputs are in the right order
== Pair 5 ==
- Compare [7,7,7,7] vs [7,7,7]
- Compare 7 vs 7
- Compare 7 vs 7
- Compare 7 vs 7
- Right side ran out of items, so inputs are not in the right order
== Pair 6 ==
- Compare [] vs [3]
- Left side ran out of items, so inputs are in the right order
== Pair 7 ==
- Compare [[[]]] vs [[]]
- Compare [[]] vs []
- Right side ran out of items, so inputs are not in the right order
== Pair 8 ==
- Compare [1,[2,[3,[4,[5,6,7]]]],8,9] vs [1,[2,[3,[4,[5,6,0]]]],8,9]
- Compare 1 vs 1
- Compare [2,[3,[4,[5,6,7]]]] vs [2,[3,[4,[5,6,0]]]]
- Compare 2 vs 2
- Compare [3,[4,[5,6,7]]] vs [3,[4,[5,6,0]]]
- Compare 3 vs 3
- Compare [4,[5,6,7]] vs [4,[5,6,0]]
- Compare 4 vs 4
- Compare [5,6,7] vs [5,6,0]
- Compare 5 vs 5
- Compare 6 vs 6
- Compare 7 vs 0
- Right side is smaller, so inputs are not in the right order
```
What are the indices of the pairs that are already _in the right order_? (The first pair has index 1, the second pair has index 2, and so on.) In the above example, the pairs in the right order are 1, 2, 4, and 6; the sum of these indices is `*13*`.
Determine which pairs of packets are already in the right order. _What is the sum of the indices of those pairs?_
To begin, [get your puzzle input](13/input).
Answer:
You can also [Shareon [Twitter](https://twitter.com/intent/tweet?text=%22Distress+Signal%22+%2D+Day+13+%2D+Advent+of+Code+2022&url=https%3A%2F%2Fadventofcode%2Ecom%2F2022%2Fday%2F13&related=ericwastl&hashtags=AdventOfCode) [Mastodon](<javascript:void(0);>)] this puzzle.

23
2022/13/sample Normal file
View File

@ -0,0 +1,23 @@
[1,1,3,1,1]
[1,1,5,1,1]
[[1],[2,3,4]]
[[1],4]
[9]
[[8,7,6]]
[[4,4],4,4]
[[4,4],4,4,4]
[7,7,7,7]
[7,7,7]
[]
[3]
[[[]]]
[[]]
[1,[2,[3,[4,[5,6,7]]]],8,9]
[1,[2,[3,[4,[5,6,0]]]],8,9]

36
2022/13/test.js Normal file
View File

@ -0,0 +1,36 @@
import { test, expect, describe } from "vitest";
import { expectSolution } from "../01/main.js";
import part1, { sample, puzzleInput, isLessThan } from "./part1.js";
import part2 from "./part2.js";
describe("part 1", () => {
test("readInput", () => {
expect(sample[0][0]).toEqual([1, 1, 3, 1, 1]);
});
test("lessThan", () => {
expect(isLessThan(1, 2)).toBe(-1);
expect(isLessThan(2, 1)).toBe(1);
expect(isLessThan(2, 2)).toBe(0);
expect(isLessThan(2, [1])).toBe(1);
expect(isLessThan([1], [2])).toBe(-1);
});
test("sample", () => {
expect(part1(sample)).toEqual(13);
});
test("solution", () => {
const r = part1(puzzleInput);
expect(r).toBeGreaterThan(435);
expect(r).toBeLessThan(10980);
expectSolution(r).toEqual(5806);
});
});
describe("part 2", () => {
test("sample", () => {
expect(part2(sample)).toEqual(140);
});
test("solution", () => {
expectSolution(part2(puzzleInput)).toEqual(23600);
});
});

148
2022/14/input Normal file
View File

@ -0,0 +1,148 @@
481,122 -> 481,125 -> 476,125 -> 476,129 -> 491,129 -> 491,125 -> 485,125 -> 485,122
475,119 -> 475,113 -> 475,119 -> 477,119 -> 477,113 -> 477,119 -> 479,119 -> 479,114 -> 479,119 -> 481,119 -> 481,115 -> 481,119 -> 483,119 -> 483,113 -> 483,119
489,148 -> 493,148
471,152 -> 475,152
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
492,60 -> 492,63 -> 486,63 -> 486,71 -> 502,71 -> 502,63 -> 496,63 -> 496,60
504,158 -> 504,162 -> 503,162 -> 503,170 -> 511,170 -> 511,162 -> 507,162 -> 507,158
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
486,146 -> 490,146
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
475,119 -> 475,113 -> 475,119 -> 477,119 -> 477,113 -> 477,119 -> 479,119 -> 479,114 -> 479,119 -> 481,119 -> 481,115 -> 481,119 -> 483,119 -> 483,113 -> 483,119
504,158 -> 504,162 -> 503,162 -> 503,170 -> 511,170 -> 511,162 -> 507,162 -> 507,158
518,31 -> 518,35 -> 517,35 -> 517,38 -> 529,38 -> 529,35 -> 522,35 -> 522,31
490,100 -> 495,100
481,122 -> 481,125 -> 476,125 -> 476,129 -> 491,129 -> 491,125 -> 485,125 -> 485,122
500,141 -> 505,141
499,84 -> 499,80 -> 499,84 -> 501,84 -> 501,77 -> 501,84 -> 503,84 -> 503,75 -> 503,84 -> 505,84 -> 505,83 -> 505,84
475,119 -> 475,113 -> 475,119 -> 477,119 -> 477,113 -> 477,119 -> 479,119 -> 479,114 -> 479,119 -> 481,119 -> 481,115 -> 481,119 -> 483,119 -> 483,113 -> 483,119
518,31 -> 518,35 -> 517,35 -> 517,38 -> 529,38 -> 529,35 -> 522,35 -> 522,31
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
495,57 -> 499,57
489,133 -> 489,134 -> 494,134
488,106 -> 493,106
519,57 -> 523,57
481,122 -> 481,125 -> 476,125 -> 476,129 -> 491,129 -> 491,125 -> 485,125 -> 485,122
493,141 -> 498,141
504,54 -> 508,54
494,97 -> 494,92 -> 494,97 -> 496,97 -> 496,91 -> 496,97 -> 498,97 -> 498,88 -> 498,97 -> 500,97 -> 500,94 -> 500,97
474,150 -> 478,150
494,97 -> 494,92 -> 494,97 -> 496,97 -> 496,91 -> 496,97 -> 498,97 -> 498,88 -> 498,97 -> 500,97 -> 500,94 -> 500,97
498,54 -> 502,54
489,139 -> 494,139
518,31 -> 518,35 -> 517,35 -> 517,38 -> 529,38 -> 529,35 -> 522,35 -> 522,31
510,41 -> 510,42 -> 521,42 -> 521,41
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
480,150 -> 484,150
494,97 -> 494,92 -> 494,97 -> 496,97 -> 496,91 -> 496,97 -> 498,97 -> 498,88 -> 498,97 -> 500,97 -> 500,94 -> 500,97
518,31 -> 518,35 -> 517,35 -> 517,38 -> 529,38 -> 529,35 -> 522,35 -> 522,31
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
494,97 -> 494,92 -> 494,97 -> 496,97 -> 496,91 -> 496,97 -> 498,97 -> 498,88 -> 498,97 -> 500,97 -> 500,94 -> 500,97
504,158 -> 504,162 -> 503,162 -> 503,170 -> 511,170 -> 511,162 -> 507,162 -> 507,158
501,51 -> 505,51
504,158 -> 504,162 -> 503,162 -> 503,170 -> 511,170 -> 511,162 -> 507,162 -> 507,158
498,104 -> 503,104
477,148 -> 481,148
510,48 -> 514,48
475,119 -> 475,113 -> 475,119 -> 477,119 -> 477,113 -> 477,119 -> 479,119 -> 479,114 -> 479,119 -> 481,119 -> 481,115 -> 481,119 -> 483,119 -> 483,113 -> 483,119
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
475,119 -> 475,113 -> 475,119 -> 477,119 -> 477,113 -> 477,119 -> 479,119 -> 479,114 -> 479,119 -> 481,119 -> 481,115 -> 481,119 -> 483,119 -> 483,113 -> 483,119
483,152 -> 487,152
492,60 -> 492,63 -> 486,63 -> 486,71 -> 502,71 -> 502,63 -> 496,63 -> 496,60
475,119 -> 475,113 -> 475,119 -> 477,119 -> 477,113 -> 477,119 -> 479,119 -> 479,114 -> 479,119 -> 481,119 -> 481,115 -> 481,119 -> 483,119 -> 483,113 -> 483,119
494,97 -> 494,92 -> 494,97 -> 496,97 -> 496,91 -> 496,97 -> 498,97 -> 498,88 -> 498,97 -> 500,97 -> 500,94 -> 500,97
492,60 -> 492,63 -> 486,63 -> 486,71 -> 502,71 -> 502,63 -> 496,63 -> 496,60
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
516,54 -> 520,54
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
475,119 -> 475,113 -> 475,119 -> 477,119 -> 477,113 -> 477,119 -> 479,119 -> 479,114 -> 479,119 -> 481,119 -> 481,115 -> 481,119 -> 483,119 -> 483,113 -> 483,119
494,102 -> 499,102
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
504,158 -> 504,162 -> 503,162 -> 503,170 -> 511,170 -> 511,162 -> 507,162 -> 507,158
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
518,31 -> 518,35 -> 517,35 -> 517,38 -> 529,38 -> 529,35 -> 522,35 -> 522,31
494,97 -> 494,92 -> 494,97 -> 496,97 -> 496,91 -> 496,97 -> 498,97 -> 498,88 -> 498,97 -> 500,97 -> 500,94 -> 500,97
513,51 -> 517,51
492,60 -> 492,63 -> 486,63 -> 486,71 -> 502,71 -> 502,63 -> 496,63 -> 496,60
481,122 -> 481,125 -> 476,125 -> 476,129 -> 491,129 -> 491,125 -> 485,125 -> 485,122
499,84 -> 499,80 -> 499,84 -> 501,84 -> 501,77 -> 501,84 -> 503,84 -> 503,75 -> 503,84 -> 505,84 -> 505,83 -> 505,84
518,31 -> 518,35 -> 517,35 -> 517,38 -> 529,38 -> 529,35 -> 522,35 -> 522,31
494,97 -> 494,92 -> 494,97 -> 496,97 -> 496,91 -> 496,97 -> 498,97 -> 498,88 -> 498,97 -> 500,97 -> 500,94 -> 500,97
489,133 -> 489,134 -> 494,134
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
507,57 -> 511,57
492,60 -> 492,63 -> 486,63 -> 486,71 -> 502,71 -> 502,63 -> 496,63 -> 496,60
504,158 -> 504,162 -> 503,162 -> 503,170 -> 511,170 -> 511,162 -> 507,162 -> 507,158
499,84 -> 499,80 -> 499,84 -> 501,84 -> 501,77 -> 501,84 -> 503,84 -> 503,75 -> 503,84 -> 505,84 -> 505,83 -> 505,84
475,119 -> 475,113 -> 475,119 -> 477,119 -> 477,113 -> 477,119 -> 479,119 -> 479,114 -> 479,119 -> 481,119 -> 481,115 -> 481,119 -> 483,119 -> 483,113 -> 483,119
477,152 -> 481,152
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
494,97 -> 494,92 -> 494,97 -> 496,97 -> 496,91 -> 496,97 -> 498,97 -> 498,88 -> 498,97 -> 500,97 -> 500,94 -> 500,97
480,146 -> 484,146
499,84 -> 499,80 -> 499,84 -> 501,84 -> 501,77 -> 501,84 -> 503,84 -> 503,75 -> 503,84 -> 505,84 -> 505,83 -> 505,84
510,54 -> 514,54
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
475,119 -> 475,113 -> 475,119 -> 477,119 -> 477,113 -> 477,119 -> 479,119 -> 479,114 -> 479,119 -> 481,119 -> 481,115 -> 481,119 -> 483,119 -> 483,113 -> 483,119
460,155 -> 474,155 -> 474,154
495,152 -> 499,152
492,60 -> 492,63 -> 486,63 -> 486,71 -> 502,71 -> 502,63 -> 496,63 -> 496,60
507,45 -> 511,45
499,27 -> 499,28 -> 519,28
495,106 -> 500,106
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
494,97 -> 494,92 -> 494,97 -> 496,97 -> 496,91 -> 496,97 -> 498,97 -> 498,88 -> 498,97 -> 500,97 -> 500,94 -> 500,97
510,41 -> 510,42 -> 521,42 -> 521,41
499,84 -> 499,80 -> 499,84 -> 501,84 -> 501,77 -> 501,84 -> 503,84 -> 503,75 -> 503,84 -> 505,84 -> 505,83 -> 505,84
492,60 -> 492,63 -> 486,63 -> 486,71 -> 502,71 -> 502,63 -> 496,63 -> 496,60
481,122 -> 481,125 -> 476,125 -> 476,129 -> 491,129 -> 491,125 -> 485,125 -> 485,122
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
504,48 -> 508,48
499,84 -> 499,80 -> 499,84 -> 501,84 -> 501,77 -> 501,84 -> 503,84 -> 503,75 -> 503,84 -> 505,84 -> 505,83 -> 505,84
492,150 -> 496,150
502,106 -> 507,106
486,150 -> 490,150
489,152 -> 493,152
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
481,122 -> 481,125 -> 476,125 -> 476,129 -> 491,129 -> 491,125 -> 485,125 -> 485,122
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
499,84 -> 499,80 -> 499,84 -> 501,84 -> 501,77 -> 501,84 -> 503,84 -> 503,75 -> 503,84 -> 505,84 -> 505,83 -> 505,84
492,137 -> 497,137
507,51 -> 511,51
504,158 -> 504,162 -> 503,162 -> 503,170 -> 511,170 -> 511,162 -> 507,162 -> 507,158
484,104 -> 489,104
494,97 -> 494,92 -> 494,97 -> 496,97 -> 496,91 -> 496,97 -> 498,97 -> 498,88 -> 498,97 -> 500,97 -> 500,94 -> 500,97
518,31 -> 518,35 -> 517,35 -> 517,38 -> 529,38 -> 529,35 -> 522,35 -> 522,31
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
460,155 -> 474,155 -> 474,154
487,102 -> 492,102
491,104 -> 496,104
481,122 -> 481,125 -> 476,125 -> 476,129 -> 491,129 -> 491,125 -> 485,125 -> 485,122
510,41 -> 510,42 -> 521,42 -> 521,41
475,119 -> 475,113 -> 475,119 -> 477,119 -> 477,113 -> 477,119 -> 479,119 -> 479,114 -> 479,119 -> 481,119 -> 481,115 -> 481,119 -> 483,119 -> 483,113 -> 483,119
483,148 -> 487,148
501,57 -> 505,57
496,139 -> 501,139
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
475,119 -> 475,113 -> 475,119 -> 477,119 -> 477,113 -> 477,119 -> 479,119 -> 479,114 -> 479,119 -> 481,119 -> 481,115 -> 481,119 -> 483,119 -> 483,113 -> 483,119
475,119 -> 475,113 -> 475,119 -> 477,119 -> 477,113 -> 477,119 -> 479,119 -> 479,114 -> 479,119 -> 481,119 -> 481,115 -> 481,119 -> 483,119 -> 483,113 -> 483,119
481,106 -> 486,106
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
475,119 -> 475,113 -> 475,119 -> 477,119 -> 477,113 -> 477,119 -> 479,119 -> 479,114 -> 479,119 -> 481,119 -> 481,115 -> 481,119 -> 483,119 -> 483,113 -> 483,119
475,119 -> 475,113 -> 475,119 -> 477,119 -> 477,113 -> 477,119 -> 479,119 -> 479,114 -> 479,119 -> 481,119 -> 481,115 -> 481,119 -> 483,119 -> 483,113 -> 483,119
499,84 -> 499,80 -> 499,84 -> 501,84 -> 501,77 -> 501,84 -> 503,84 -> 503,75 -> 503,84 -> 505,84 -> 505,83 -> 505,84
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
499,84 -> 499,80 -> 499,84 -> 501,84 -> 501,77 -> 501,84 -> 503,84 -> 503,75 -> 503,84 -> 505,84 -> 505,83 -> 505,84
490,23 -> 490,13 -> 490,23 -> 492,23 -> 492,17 -> 492,23 -> 494,23 -> 494,18 -> 494,23 -> 496,23 -> 496,22 -> 496,23 -> 498,23 -> 498,21 -> 498,23 -> 500,23 -> 500,18 -> 500,23 -> 502,23 -> 502,15 -> 502,23 -> 504,23 -> 504,22 -> 504,23 -> 506,23 -> 506,18 -> 506,23 -> 508,23 -> 508,19 -> 508,23
494,97 -> 494,92 -> 494,97 -> 496,97 -> 496,91 -> 496,97 -> 498,97 -> 498,88 -> 498,97 -> 500,97 -> 500,94 -> 500,97
486,141 -> 491,141
499,84 -> 499,80 -> 499,84 -> 501,84 -> 501,77 -> 501,84 -> 503,84 -> 503,75 -> 503,84 -> 505,84 -> 505,83 -> 505,84
499,27 -> 499,28 -> 519,28
499,84 -> 499,80 -> 499,84 -> 501,84 -> 501,77 -> 501,84 -> 503,84 -> 503,75 -> 503,84 -> 505,84 -> 505,83 -> 505,84
513,57 -> 517,57
483,144 -> 487,144

83
2022/14/part1.js Normal file
View File

@ -0,0 +1,83 @@
import * as R from "remeda";
import Victor from "@a-robu/victor";
import { readFile } from "../05/part1.js";
export const V = (...args) => new Victor(...args);
const parseLine = (line) => line.match(/[\d,]+/g).map((x) => eval(`[${x}]`));
const readInput = (...args) =>
R.pipe(
readFile(...args),
(lines) => lines.split("\n"),
R.compact, // remove last line
R.map(parseLine)
);
export const puzzleInput = readInput(import.meta.url, "input");
export const sample = readInput(import.meta.url, "sample");
export function genCave(rocks) {
const cave = {};
for (const rock of rocks) {
const points = rock.map(Victor.fromArray);
let from = points.shift();
while (points.length) {
/** @type Victor */
const to = points.shift();
const direction = to.clone().subtract(from).normalize();
R.times(to.clone().subtract(from).length() + 1, () => {
if (!cave[from.y]) cave[from.y] = {};
cave[from.y][from.x] = "#";
from.add(direction);
});
from = to;
}
}
return cave;
}
function pourSand(cave) {
cave = R.clone(cave);
let sand = 0;
/** @type Victor */
let current;
const maxDepth = R.pipe(
cave,
R.keys,
R.map((x) => parseInt(x)),
R.maxBy(R.identity)
);
console.log({ maxDepth });
while (true) {
if (!current) current = V(500, 0);
if (current.y > maxDepth) return sand;
const next = [
[0, 1],
[-1, 1],
[1, 1],
]
.map((args) => V(...args))
.map((v) => v.add(current))
.find((v) => !(cave[v.y] && cave[v.y][v.x]));
if (next) {
current = next;
} else {
if (!cave[current.y]) cave[current.y] = {};
cave[current.y][current.x] = "o";
sand++;
current = null;
}
}
}
export default R.createPipe(genCave, pourSand);

53
2022/14/part2.js Normal file
View File

@ -0,0 +1,53 @@
import * as R from "remeda";
import { genCave, V } from "./part1.js";
function pourSand(cave) {
cave = R.clone(cave);
let sand = 0;
/** @type Victor */
let current;
const maxDepth =
R.pipe(
cave,
R.keys,
R.map((x) => parseInt(x)),
R.maxBy(R.identity)
) + 1;
while (true) {
if (!current) current = V(500, 0);
if (current.y === maxDepth) {
if (!cave[current.y]) cave[current.y] = {};
cave[current.y][current.x] = "o";
sand++;
current = null;
continue;
}
const next = [
[0, 1],
[-1, 1],
[1, 1],
]
.map((args) => V(...args))
.map((v) => v.add(current))
.find((v) => !(cave[v.y] && cave[v.y][v.x]));
if (next) {
current = next;
} else {
if (current.y === 0) return 1 + sand;
if (!cave[current.y]) cave[current.y] = {};
cave[current.y][current.x] = "o";
sand++;
current = null;
}
}
}
export default R.createPipe(genCave, pourSand);

152
2022/14/puzzle.md Normal file
View File

@ -0,0 +1,152 @@
## \--- Day 14: Regolith Reservoir ---
The distress signal leads you to a giant waterfall! Actually, hang on - the signal seems like it's coming from the waterfall itself, and that doesn't make any sense. However, you do notice a little path that leads _behind_ the waterfall.
Correction: the distress signal leads you behind a giant waterfall! There seems to be a large cave system here, and the signal definitely leads further inside.
As you begin to make your way deeper underground, you feel the ground rumble for a moment. Sand begins pouring into the cave! If you don't quickly figure out where the sand is going, you could quickly become trapped!
Fortunately, your [familiarity](/2018/day/17) with analyzing the path of falling material will come in handy here. You scan a two-dimensional vertical slice of the cave above you (your puzzle input) and discover that it is mostly _air_ with structures made of _rock_.
Your scan traces the path of each solid rock structure and reports the `x,y` coordinates that form the shape of the path, where `x` represents distance to the right and `y` represents distance down. Each path appears as a single line of text in your scan. After the first point of each path, each point indicates the end of a straight horizontal or vertical line to be drawn from the previous point. For example:
```
498,4 -> 498,6 -> 496,6
503,4 -> 502,4 -> 502,9 -> 494,9
```
This scan means that there are two paths of rock; the first path consists of two straight lines, and the second path consists of three straight lines. (Specifically, the first path consists of a line of rock from `498,4` through `498,6` and another line of rock from `498,6` through `496,6`.)
The sand is pouring into the cave from point `500,0`.
Drawing rock as `#`, air as `.`, and the source of the sand as `+`, this becomes:
```
4 5 5
9 0 0
4 0 3
0 ......+...
1 ..........
2 ..........
3 ..........
4 ....#...##
5 ....#...#.
6 ..###...#.
7 ........#.
8 ........#.
9 #########.
```
Sand is produced _one unit at a time_, and the next unit of sand is not produced until the previous unit of sand _comes to rest_. A unit of sand is large enough to fill one tile of air in your scan.
A unit of sand always falls _down one step_ if possible. If the tile immediately below is blocked (by rock or sand), the unit of sand attempts to instead move diagonally _one step down and to the left_. If that tile is blocked, the unit of sand attempts to instead move diagonally _one step down and to the right_. Sand keeps moving as long as it is able to do so, at each step trying to move down, then down-left, then down-right. If all three possible destinations are blocked, the unit of sand _comes to rest_ and no longer moves, at which point the next unit of sand is created back at the source.
So, drawing sand that has come to rest as `o`, the first unit of sand simply falls straight down and then stops:
```
......+...
..........
..........
..........
....#...##
....#...#.
..###...#.
........#.
......o.#.
#########.
```
The second unit of sand then falls straight down, lands on the first one, and then comes to rest to its left:
```
......+...
..........
..........
..........
....#...##
....#...#.
..###...#.
........#.
.....oo.#.
#########.
```
After a total of five units of sand have come to rest, they form this pattern:
```
......+...
..........
..........
..........
....#...##
....#...#.
..###...#.
......o.#.
....oooo#.
#########.
```
After a total of 22 units of sand:
```
......+...
..........
......o...
.....ooo..
....#ooo##
....#ooo#.
..###ooo#.
....oooo#.
...ooooo#.
#########.
```
Finally, only two more units of sand can possibly come to rest:
```
......+...
..........
......o...
.....ooo..
....#ooo##
...o#ooo#.
..###ooo#.
....oooo#.
.o.ooooo#.
#########.
```
Once all `*24*` units of sand shown above have come to rest, all further sand flows out the bottom, falling into the endless void. Just for fun, the path any new sand takes before falling forever is shown here with `~`:
```
.......+...
.......~...
......~o...
.....~ooo..
....~#ooo##
...~o#ooo#.
..~###ooo#.
..~..oooo#.
.~o.ooooo#.
~#########.
~..........
~..........
~..........
```
Using your scan, simulate the falling sand. _How many units of sand come to rest before sand starts flowing into the abyss below?_
To begin, [get your puzzle input](14/input).
Answer:
You can also [Shareon [Twitter](https://twitter.com/intent/tweet?text=%22Regolith+Reservoir%22+%2D+Day+14+%2D+Advent+of+Code+2022&url=https%3A%2F%2Fadventofcode%2Ecom%2F2022%2Fday%2F14&related=ericwastl&hashtags=AdventOfCode) [Mastodon](<javascript:void(0);>)] this puzzle.

2
2022/14/sample Normal file
View File

@ -0,0 +1,2 @@
498,4 -> 498,6 -> 496,6
503,4 -> 502,4 -> 502,9 -> 494,9

43
2022/14/test.js Normal file
View File

@ -0,0 +1,43 @@
import { test, expect, describe } from "vitest";
import { expectSolution } from "../01/main.js";
import part1, { genCave, sample, puzzleInput } from "./part1.js";
import part2 from "./part2.js";
describe("part 1", () => {
test("readInput", () => {
expect(sample).toEqual([
[
[498, 4],
[498, 6],
[496, 6],
],
[
[503, 4],
[502, 4],
[502, 9],
[494, 9],
],
]);
});
test("genCave", () => {
expect(genCave(sample)).toMatchObject({
4: { 498: "#" },
});
});
test("sample", () => {
expect(part1(sample)).toEqual(24);
});
test("solution", () => {
expectSolution(part1(puzzleInput)).toEqual(832);
});
});
describe.only("part 2", () => {
test("sample", () => {
expect(part2(sample)).toEqual(93);
});
test("solution", () => {
expectSolution(part2(puzzleInput)).toEqual(27601);
});
});

View File

@ -6,9 +6,11 @@ import * as R from "remeda";
import { readFile } from "../05/part1.js";
const readInput = (...args) =>
readFile(...args)
.split("\n")
.filter((x) => x);
R.pipe(
readFile(...args),
(lines) => lines.split("\n"),
R.compact, // remove last line
);
export const puzzleInput = readInput(import.meta.url, "input");
export const sample = readInput(import.meta.url, "sample");

3
_templates/package.json Normal file
View File

@ -0,0 +1,3 @@
{
"type": "commonjs"
}

View File

@ -1,4 +1,5 @@
{
"type": "module",
"name": "2022",
"version": "1.0.0",
"description": "",
@ -16,6 +17,10 @@
"memoizerific": "^1.11.3",
"prettier": "^2.8.0",
"remeda": "^1.3.0",
"vitest": "^0.25.3"
"vite": "^4.0.1",
"vitest": "0.25.7"
},
"devDependencies": {
"@vitest/ui": "^0.25.8"
}
}