importFsfrom"fs"importPathfrom"path"constinput=Fs.readFileSync(Path.join(__dirname,"input.txt")).toString().split("\n")interfaceRange{start:numberend:number}interfaceLineProperties{id:stringrows:Rangecolumns:Range}typeID=stringinterfacePixel{ids:ID[]hasOverlap:boolean}typeCoordinates=stringletoverlaps=0constcanvas=newMap<Coordinates,Pixel>()constidsWithOverlappingStatus:Map<string,boolean>=newMap()functionparseLine(line:string):LineProperties{const[_="",id="",columnStart="",rowStart="",width="",height="",]=line.match(/#(\d+) @ (\d+),(\d+): (\d+)x(\d+)/)||[]return{id,columns:{start:parseInt(columnStart,10),end:parseInt(columnStart,10)+parseInt(width,10),},rows:{start:parseInt(rowStart,10),end:parseInt(rowStart,10)+parseInt(height,10),},}}input.forEach(line=>{constlineProperties:LineProperties=parseLine(line)idsWithOverlappingStatus.set(lineProperties.id,false)for(letrow=lineProperties.rows.start;row<lineProperties.rows.end;row++){for(letcolumn=lineProperties.columns.start;column<lineProperties.columns.end;column++){constcoordinnates=`${row}x${column}`letpixel:Pixel={ids:[lineProperties.id],hasOverlap:false}// not overlapping yetif(canvas.has(coordinnates)===false){canvas.set(coordinnates,pixel)continue}pixel=canvas.get(coordinnates)||pixelpixel.ids=[...pixel.ids,lineProperties.id]canvas.set(coordinnates,pixel)// drop it, it has already been countedif(pixel.hasOverlap){continue}overlaps++pixel.ids.forEach(id=>idsWithOverlappingStatus.set(id,true))canvas.set(coordinnates,{...pixel,hasOverlap:true,})}}})// part 1console.log(overlaps)// part 2for(const[id,overlapping]ofidsWithOverlappingStatus){if(overlapping===false){console.log(id)break}}
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.
Here goes my
Typescript
solution: