I enjoyed doing this one. It somehow felt satisfying. Maybe it's because for this one I was able to realize it's a series of steps and I could develop and test each one of them step-by-step, so I felt confident I was moving into the right direction.
const{readFile}=require('./reader');const{Coordinate,buildCoordinates,getGridDimension,plotCoordinates,calculateManhattanDistance}=require('./06-common');constplotLocations=(coordinates,grid)=>{constn=grid.length;for(leti=0;i<n;i++){for(letj=0;j<n;j++){if(!grid[i][j]){constlocation=newCoordinate(i,j);grid[i][j]=location;letsmallestDistance;letclosestCoordinates;for(letcoordinateofcoordinates){constdistance=calculateManhattanDistance(location,coordinate);if(!closestCoordinates||distance<smallestDistance){smallestDistance=distance;closestCoordinates=[coordinate];}elseif(distance===smallestDistance){closestCoordinates.push(coordinate);}}if(closestCoordinates.length===1){location.closestCoordinate=closestCoordinates[0];}}}}};constgetFiniteCoordinateIds=(coordinates,grid)=>{constn=grid.length;constinfiniteCoordinateIds=newSet();// Top and bottom edgesfor(leti=0;i<n;i+=n-1){for(letj=0;j<n;j++){constclosestCoordinate=grid[i][j].closestCoordinate;if(closestCoordinate){infiniteCoordinateIds.add(closestCoordinate.id);}}}// Left and right edgesfor(letj=0;j<n;j+=n-1){for(leti=0;i<n;i++){constclosestCoordinate=grid[i][j].closestCoordinate;if(closestCoordinate){infiniteCoordinateIds.add(closestCoordinate.id);}}}constfiniteCoordinateIds=coordinates.filter(coordinate=>!infiniteCoordinateIds.has(coordinate.id)).map(coordinate=>coordinate.id);returnnewSet(finiteCoordinateIds);};constcalculateCoordinateRegions=(finiteCoordinates,grid)=>{constn=grid.length;constfrequencyMap=newMap();for(leti=0;i<n;i++){for(letj=0;j<n;j++){constclosestCoordinate=grid[i][j].closestCoordinate;if(closestCoordinate&&finiteCoordinates.has(closestCoordinate.id)){const{id}=closestCoordinate;constfrequency=frequencyMap.get(id)||1;frequencyMap.set(id,frequency+1);}}}returnfrequencyMap;};(async()=>{constlines=awaitreadFile('06-input.txt');constcoordinates=buildCoordinates(lines);constgrid=plotCoordinates(coordinates);plotLocations(coordinates,grid);constfiniteCoordinateIds=getFiniteCoordinateIds(coordinates,grid);constcoordinateRegions=calculateCoordinateRegions(finiteCoordinateIds,grid);constlargestRegion=Math.max(...coordinateRegions.values());console.log(`The largest region is ${largestRegion}`);})();
06b.js
const{readFile}=require('./reader');const{Coordinate,buildCoordinates,getGridDimension,plotCoordinates,calculateManhattanDistance}=require('./06-common');constMAX_TOTAL_DISTANCE=10000;constplotLocations=(coordinates,grid)=>{constn=grid.length;for(leti=0;i<n;i++){for(letj=0;j<n;j++){letlocation=grid[i][j];if(!grid[i][j]){location=newCoordinate(i,j);grid[i][j]=location;}consttotalDistance=coordinates.reduce((sum,coordinate)=>{returnsum+calculateManhattanDistance(location,coordinate);},0);location.inSafeRegion=totalDistance<MAX_TOTAL_DISTANCE;}}};constgetSafeRegionSize=grid=>{constn=grid.length;letsafeRegionSize=0;for(leti=0;i<n;i++){for(letj=0;j<n;j++){constlocation=grid[i][j];safeRegionSize+=+location.inSafeRegion;}}returnsafeRegionSize;};(async()=>{constlines=awaitreadFile('06-input.txt');constcoordinates=buildCoordinates(lines);constgrid=plotCoordinates(coordinates);plotLocations(coordinates,grid);constsafeRegionSize=getSafeRegionSize(grid);console.log(`The safe region size is ${safeRegionSize}`);})();
For further actions, you may consider blocking this person and/or reporting abuse
We're a place where coders share, stay up-to-date and grow their careers.
Javascript solution
I enjoyed doing this one. It somehow felt satisfying. Maybe it's because for this one I was able to realize it's a series of steps and I could develop and test each one of them step-by-step, so I felt confident I was moving into the right direction.
reader.js
06-common.js
06a.js
06b.js