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);