generated from caiangums/aoc-template
-
Notifications
You must be signed in to change notification settings - Fork 0
/
distance-connections.js
61 lines (48 loc) 路 1.6 KB
/
distance-connections.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
export const DistanceConnections = ({ startTile }) => {
const distanceFromStartMap = new Map()
const getNextTile = ({ tile, prevTile }) =>
tile.getTileConnections().find((t) => t.name() !== prevTile.name())
const setDistanceFromTiles = ({ tile, prevTile }) => {
const prevTileValue = distanceFromStartMap.get(prevTile.name())
distanceFromStartMap.set(tile.name(), prevTileValue + 1)
}
const fillDistance = ({ tile, prevTile, tileList }) => {
if (tile && !distanceFromStartMap.has(tile.name())) {
setDistanceFromTiles({ tile, prevTile })
const nextTile = getNextTile({
tile,
prevTile,
})
tileList.push(nextTile)
}
return { nextPrevTile: tile }
}
const evaluateDistance = () => {
let actualTile = startTile
distanceFromStartMap.set(actualTile.name(), 0)
const prevTiles = { left: actualTile, right: actualTile }
const tileList = actualTile.getTileConnections()
while (tileList.length > 0) {
const rightTile = tileList.pop()
const leftTile = tileList.pop()
const { nextPrevTile: nextLeftPrevTile } = fillDistance({
tile: leftTile,
prevTile: prevTiles.left,
tileList,
})
prevTiles.left = nextLeftPrevTile
const { nextPrevTile: nextRightPrevTile } = fillDistance({
tile: rightTile,
prevTile: prevTiles.right,
tileList,
})
prevTiles.right = nextRightPrevTile
}
}
const getFarthestDistance = () =>
[...distanceFromStartMap.values()].sort((a, b) => a - b).pop()
return {
evaluateDistance,
getFarthestDistance,
}
}