64 lines
1.4 KiB
JavaScript
64 lines
1.4 KiB
JavaScript
import * as R from "remeda";
|
|
import V from '@yanick/vyktor';
|
|
|
|
import {
|
|
spy,
|
|
mergeRanges
|
|
} from './part1.js';
|
|
|
|
const unbeaconAtLine = (max,targetLine,already) => entries => R.pipe(
|
|
entries,
|
|
R.map( ([x,y]) => [ x, x.manhattanDistance(y) ] ),
|
|
R.filter(
|
|
e => (
|
|
( e[0].y - e[1] <= targetLine) &&
|
|
( e[0].y + e[1] >= targetLine)
|
|
)
|
|
),
|
|
R.map(
|
|
e => {
|
|
const l = e[1] - Math.abs(targetLine - e[0].y);
|
|
|
|
return [
|
|
e[0].x - l,
|
|
e[0].x + l ]
|
|
}
|
|
),
|
|
//spy,
|
|
(ranges) => [
|
|
...ranges, ...already.filter( v => v.y === targetLine ).map(
|
|
v => [ v.x,v.x ]
|
|
)
|
|
],
|
|
(ranges) =>
|
|
ranges.sort( (a,b) => {
|
|
return (a[0] - b[0]) || (a[1]-b[1]);
|
|
} )
|
|
,
|
|
// spy,
|
|
R.map(
|
|
range => [ Math.max(0,range[0]), Math.min(max,range[1])]
|
|
),
|
|
mergeRanges,
|
|
// spy,
|
|
// R.sumBy( range => range[1] - range[0] + 1 - entriesInRange(targetLine,entries)(range) )
|
|
);
|
|
|
|
export const findBeacon = max => entries => {
|
|
|
|
const already = entries.flat()
|
|
|
|
for (let y = 0; y <= max; y++) {
|
|
const ranges = unbeaconAtLine(max,y,already)(entries)
|
|
if( ranges.length > 1 ) {
|
|
return y + 4000000 * (ranges[0][1] +1);
|
|
}
|
|
|
|
// return 'bob';
|
|
|
|
// return x * 4000000 + y;
|
|
}
|
|
}
|
|
|
|
export default findBeacon(4000000);
|