Add solution day 10
This commit is contained in:
parent
1a5797e987
commit
cb1d1fe978
8
day_10/example.txt
Normal file
8
day_10/example.txt
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
89010123
|
||||||
|
78121874
|
||||||
|
87430965
|
||||||
|
96549874
|
||||||
|
45678903
|
||||||
|
32019012
|
||||||
|
01329801
|
||||||
|
10456732
|
54
day_10/input.txt
Normal file
54
day_10/input.txt
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
543067650323210321032110356789890110710189878760134567
|
||||||
|
612148941212306782345091235410765227893258759651021298
|
||||||
|
701238932301456798106787549323454336794567549842330807
|
||||||
|
898547215450589867287654678892961245987654456732498910
|
||||||
|
987656306769678956398013234781870301256003301201567821
|
||||||
|
234543215878760145478920105690210982340112210341056932
|
||||||
|
109650124981232230569834124567345673451234985452347845
|
||||||
|
018744323890341021656765033438454589298545676701037796
|
||||||
|
199803210787650110765017842129823672107655677812378987
|
||||||
|
785012345654789541874326956010510563201234389983405676
|
||||||
|
174321498723498632903455467173421454102348210234514430
|
||||||
|
065430239014323721212762398982567876218959650149623521
|
||||||
|
145540128765017890101871081071018967327968743898734678
|
||||||
|
236692134984178768718981012567894458456876212798604329
|
||||||
|
987783005673269659654108923458763349663212108789015012
|
||||||
|
896654012562154546743267830309854218767103419276126787
|
||||||
|
765780123473043432890154321212903109878756578125435698
|
||||||
|
434099874984012301740125654567812893469017647030165556
|
||||||
|
323101065765101787434436763058906732154178736543256765
|
||||||
|
013298187890678696325569892143215440043289128954343894
|
||||||
|
010367296541549045016678765014300351234567037760012983
|
||||||
|
329458305032132134787867410967891267653438546891898012
|
||||||
|
458789414145010120196986323898763298344129655432743210
|
||||||
|
567076523236678743285898456777654101201098766653658901
|
||||||
|
456167654107549658374567689985403100312434985567877014
|
||||||
|
343228943298938569843210576876312238920125676656986323
|
||||||
|
651014543498127478755765435410278947437876985543235434
|
||||||
|
743223672567078369876890324320127656506987234350145632
|
||||||
|
894102981089569232125981210451256543215432122341076541
|
||||||
|
765091234676352101034674323401237894101341001456789830
|
||||||
|
014780365445443032126501012532345743103210112565898321
|
||||||
|
123689876034321145098432107645236743254101101876543210
|
||||||
|
094545763125210056788943258896107858969010332987674301
|
||||||
|
785430432106782169877652349787567967678321245696784561
|
||||||
|
876021569045893458965601654343478914565414326781093870
|
||||||
|
987109878010432167014298710234323901258905015492012901
|
||||||
|
789219894324569052123109620123217892109876012323458692
|
||||||
|
654308765543678743013234538994106543010870965410069783
|
||||||
|
789877787632189852101110145885287676521961871012178654
|
||||||
|
034565896601087601211001406776896789437652676523468743
|
||||||
|
121053795542194512389132312345445676548943989430549012
|
||||||
|
262342187634765433498545434531230107401232104321678298
|
||||||
|
876533014123892324567696526540043298340981010780890187
|
||||||
|
983414523016101019876587017832134781256672125690743296
|
||||||
|
032101654327892100345678789901295690764543434321652345
|
||||||
|
123089789236743981234589654800387789835678987787601336
|
||||||
|
854176590187656876104310343211456876544549016098543223
|
||||||
|
965765410194545675465231230898565963233432145123210112
|
||||||
|
876894321243232980370110141767653210112321039654101101
|
||||||
|
146765232100101061289879852632154100203410128789210322
|
||||||
|
036787103761267876518768763543069911012543454376325412
|
||||||
|
123498654854356987405650654985678892327632567215436701
|
||||||
|
210567569983543292314321569876301765438761078904589898
|
||||||
|
325456478754330101223433478765432654349652987615678765
|
76
day_10/solve_1.ts
Normal file
76
day_10/solve_1.ts
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
export type HeightMap = number[][];
|
||||||
|
|
||||||
|
export async function readMap(path: string): Promise<HeightMap> {
|
||||||
|
const text = await Deno.readTextFile(path);
|
||||||
|
return text.split("\n").map((row) =>
|
||||||
|
row.trim().split("").map((cell) => {
|
||||||
|
const ret = parseInt(cell);
|
||||||
|
if (isNaN(ret)) {
|
||||||
|
return -5;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function displayMap(map: HeightMap) {
|
||||||
|
console.log(map.map((row) => row.map(x=> x < 0 ? "." : x).join("")).join("\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
export type Pos = [number, number];
|
||||||
|
|
||||||
|
export function getCell(map: HeightMap, [x, y]: Pos): number {
|
||||||
|
return map[y][x];
|
||||||
|
}
|
||||||
|
|
||||||
|
export const TOP_HEIGHT = 9;
|
||||||
|
|
||||||
|
export function countReachableTop(pos: Pos, map: HeightMap): number {
|
||||||
|
const stack: {
|
||||||
|
pos: Pos;
|
||||||
|
height: number;
|
||||||
|
}[] = [];
|
||||||
|
const visited = new Set<string>();
|
||||||
|
stack.push({ pos, height: getCell(map, pos) });
|
||||||
|
let count = 0;
|
||||||
|
while (stack.length > 0) {
|
||||||
|
const { pos, height } = stack.pop()!;
|
||||||
|
const [x, y] = pos;
|
||||||
|
if (getCell(map, pos) === TOP_HEIGHT) {
|
||||||
|
if (visited.has(pos.toString())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
visited.add(pos.toString());
|
||||||
|
count++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (const [dx, dy] of [[1, 0], [-1, 0], [0, 1], [0, -1]]) {
|
||||||
|
const [nx, ny] = [x + dx, y + dy];
|
||||||
|
if (nx < 0 || nx >= map[0].length || ny < 0 || ny >= map.length) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const nheight = getCell(map, [nx, ny]);
|
||||||
|
if (nheight == height + 1) {
|
||||||
|
stack.push({ pos: [nx, ny], height: nheight });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (import.meta.main) {
|
||||||
|
const map = await readMap("input.txt");
|
||||||
|
displayMap(map);
|
||||||
|
const data = map.map((row, y) => {
|
||||||
|
return row.map((cell, x) => {
|
||||||
|
if (cell === 0) {
|
||||||
|
const count = countReachableTop([x, y], map);
|
||||||
|
console.log("count reachable top from", [x, y]);
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
return -5;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
displayMap(data);
|
||||||
|
console.log(data.flat().reduce((a, b) => a + (b < 0 ? 0 : b ), 0));
|
||||||
|
}
|
51
day_10/solve_2.ts
Normal file
51
day_10/solve_2.ts
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
import { Pos, HeightMap, getCell, TOP_HEIGHT, readMap, displayMap } from "./solve_1.ts";
|
||||||
|
|
||||||
|
function countReachableTop(pos: Pos, map: HeightMap): number {
|
||||||
|
const stack: {
|
||||||
|
pos: Pos;
|
||||||
|
height: number;
|
||||||
|
}[] = [];
|
||||||
|
// const visited = new Set<string>();
|
||||||
|
stack.push({ pos, height: getCell(map, pos) });
|
||||||
|
let count = 0;
|
||||||
|
while (stack.length > 0) {
|
||||||
|
const { pos, height } = stack.pop()!;
|
||||||
|
const [x, y] = pos;
|
||||||
|
if (getCell(map, pos) === TOP_HEIGHT) {
|
||||||
|
// if (visited.has(pos.toString())) {
|
||||||
|
// continue;
|
||||||
|
// }
|
||||||
|
// visited.add(pos.toString());
|
||||||
|
count++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
for (const [dx, dy] of [[1, 0], [-1, 0], [0, 1], [0, -1]]) {
|
||||||
|
const [nx, ny] = [x + dx, y + dy];
|
||||||
|
if (nx < 0 || nx >= map[0].length || ny < 0 || ny >= map.length) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const nheight = getCell(map, [nx, ny]);
|
||||||
|
if (nheight == height + 1) {
|
||||||
|
stack.push({ pos: [nx, ny], height: nheight });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (import.meta.main) {
|
||||||
|
const map = await readMap("input.txt");
|
||||||
|
displayMap(map);
|
||||||
|
const data = map.map((row, y) => {
|
||||||
|
return row.map((cell, x) => {
|
||||||
|
if (cell === 0) {
|
||||||
|
const count = countReachableTop([x, y], map);
|
||||||
|
console.log("count reachable top from", [x, y]);
|
||||||
|
return count;
|
||||||
|
}
|
||||||
|
return -5;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
displayMap(data);
|
||||||
|
console.log(data.flat().reduce((a, b) => a + (b < 0 ? 0 : b ), 0));
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user