I'm gonna omit reader.js which is the same as the other solutions and jump to the point:
18-common.js
constMAP={OPEN_GROUND:'.',TREES:'|',LUMBERYARD:'#'};consttick=originalMap=>{constn=originalMap.length;constnextMap=Array.from({length:n},row=>Array.from({length:n}));for(leti=0;i<n;i++){for(letj=0;j<n;j++){constoriginalAcre=originalMap[i][j];constadjacents=getAdjacents(originalMap,i,j,n);// For an open ground acreif(originalAcre===MAP.OPEN_GROUND){constadjacentTrees=adjacents.filter(acre=>acre===MAP.TREES).length;nextMap[i][j]=adjacentTrees>=3?MAP.TREES:MAP.OPEN_GROUND;}// For a trees acreelseif(originalAcre===MAP.TREES){constadjacentLumberyards=adjacents.filter(acre=>acre===MAP.LUMBERYARD).length;nextMap[i][j]=adjacentLumberyards>=3?MAP.LUMBERYARD:MAP.TREES;}// For a lumberyard acreelseif(originalAcre===MAP.LUMBERYARD){constadjacentLumberyards=adjacents.filter(acre=>acre===MAP.LUMBERYARD).length;constadjacentTrees=adjacents.filter(acre=>acre===MAP.TREES).length;nextMap[i][j]=adjacentLumberyards>=1&&adjacentTrees>=1?MAP.LUMBERYARD:MAP.OPEN_GROUND;}}}returnnextMap;};constgetAdjacents=(originalMap,i,j,n)=>{constpositions=[[i-1,j-1],[i-1,j],[i-1,j+1],[i,j-1],[i,j+1],[i+1,j-1],[i+1,j],[i+1,j+1]];returnpositions.filter(([i,j])=>i>=0&&j>=0&&i<n&&j<n).map(([i,j])=>originalMap[i][j]).filter(acre=>acre!==undefined);};constserialize=map=>map.map(row=>row.join('')).join('');constprintSolution=solution=>{constserializedMap=(Array.isArray(solution)?serialize(solution):solution).split('');consttrees=count(serializedMap,MAP.TREES);constlumberyards=count(serializedMap,MAP.LUMBERYARD);console.log(`The total resource value of the lumber collection area is ${trees*lumberyards}`);};constcount=(map,type)=>{returnmap.reduce((total,acre)=>total+(acre===type?1:0),0);};module.exports={MAP,tick,serialize,printSolution};
const{readFile}=require('./reader');const{MAP,tick,serialize,printSolution}=require('./18-common');(async()=>{letoutskirts=(awaitreadFile('18-input.txt')).map(row=>row.split(''));constpreviousStates=newMap();letelapsedMinutes=0;letserialized;lethasDetectedLoop=false;do{elapsedMinutes++;outskirts=tick(outskirts);serialized=serialize(outskirts);if(previousStates.has(serialized)){hasDetectedLoop=true;}else{previousStates.set(serialized,elapsedMinutes);}}while(!hasDetectedLoop);console.log(`Loop detected at minute ${elapsedMinutes}!`);constfirstRepetitionMinutes=previousStates.get(serialized);constloopDurationMinutes=elapsedMinutes-firstRepetitionMinutes;constequivalentMinute=((1000000000-firstRepetitionMinutes)%loopDurationMinutes)+firstRepetitionMinutes;console.log(`The minute 1000000000 is equivalent to the minute ${equivalentMinute}`);constsolution=[...previousStates.entries()].find(([state,minute])=>minute===equivalentMinute)[0];printSolution(solution);})();
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'm gonna omit reader.js which is the same as the other solutions and jump to the point:
18-common.js
18a.js
18b.js