part 1
This commit is contained in:
parent
0a55d68dfd
commit
c1a0528512
67
2022/05/part1.js
Normal file
67
2022/05/part1.js
Normal file
@ -0,0 +1,67 @@
|
||||
import * as R from "remeda";
|
||||
|
||||
import { readFile } from "../03/part1.js";
|
||||
|
||||
export const sample = readFile("2022", "05", "sample");
|
||||
export const puzzleInput = readFile("2022", "05", "input");
|
||||
|
||||
function parseHeaps(text) {
|
||||
const lines = text.split("\n").filter( R.identity );
|
||||
lines.reverse();
|
||||
|
||||
let [ header, ...crates ] = lines;
|
||||
|
||||
const stacks = [];
|
||||
|
||||
while(header.trimEnd()) {
|
||||
|
||||
header = header.replace( /^(\s+)\d/, (...args) => {
|
||||
crates = crates.map( c => c.slice(args[1].length) );
|
||||
|
||||
const stack = [];
|
||||
|
||||
crates = crates.map( l => l.replace(/./, (c) => {
|
||||
if( c !== ' ' ) stack.push(c);
|
||||
return '';
|
||||
}));
|
||||
|
||||
|
||||
stacks.push(stack);
|
||||
|
||||
return '';
|
||||
});
|
||||
}
|
||||
|
||||
return stacks;
|
||||
}
|
||||
|
||||
function parseCommands(text) {
|
||||
return text.split("\n").filter(R.identity).map(
|
||||
line => line.match(/\d+/g).map( x => parseInt(x) )
|
||||
)
|
||||
}
|
||||
|
||||
function moveStacks([stacks,commands]) {
|
||||
for( let [move, from, to] of commands ) {
|
||||
console.log({move,from,to});
|
||||
|
||||
while(move-- > 0) {
|
||||
stacks[to-1].push( stacks[from-1].pop() );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return stacks;
|
||||
}
|
||||
|
||||
const spy = x => { console.log(x); return x; }
|
||||
|
||||
export const solutionPart1 = R.createPipe(
|
||||
text => text.split("\n\n"),
|
||||
([heaps,commands]) => [ parseHeaps(heaps), parseCommands(commands) ],
|
||||
moveStacks,
|
||||
spy,
|
||||
R.map( x => x.pop() ),
|
||||
x => x.join('')
|
||||
)
|
||||
|
1
2022/05/part2.js
Normal file
1
2022/05/part2.js
Normal file
@ -0,0 +1 @@
|
||||
import * as R from "remeda";
|
9
2022/05/sample
Normal file
9
2022/05/sample
Normal file
@ -0,0 +1,9 @@
|
||||
[D]
|
||||
[N] [C]
|
||||
[Z] [M] [P]
|
||||
1 2 3
|
||||
|
||||
move 1 from 2 to 1
|
||||
move 3 from 1 to 3
|
||||
move 2 from 2 to 1
|
||||
move 1 from 1 to 2
|
20
2022/05/test.js
Normal file
20
2022/05/test.js
Normal file
@ -0,0 +1,20 @@
|
||||
import { test, expect, describe } from "vitest";
|
||||
|
||||
import { expectSolution } from "../01/main.js";
|
||||
import { solutionPart1, puzzleInput,sample } from "./part1.js";
|
||||
import { solutionPart2 } from "./part2.js";
|
||||
|
||||
describe("part 1", () => {
|
||||
test( "sample", () => {
|
||||
expect(solutionPart1(sample)).toEqual('CMZ');
|
||||
});
|
||||
test.only("solution", () => {
|
||||
expectSolution(solutionPart1(puzzleInput)).toEqual("VPCDMSLWJ");
|
||||
});
|
||||
});
|
||||
|
||||
describe("part 2", () => {
|
||||
test.todo("solution", () => {
|
||||
expectSolution(solutionPart2(puzzleInput)).toEqual("TODO");
|
||||
});
|
||||
});
|
Loading…
Reference in New Issue
Block a user