packagemainimport("bufio""fmt""os""strings""time""unicode/utf8")funcmain(){start:=time.Now()reader:=getInput("day11")grid:=[][]rune{}count:=1// get input and format it to [][]runeforline:=rangereader{iflen(grid)==0{grid=append(grid,[]rune{})for_,r:=rangestrings.Repeat(".",utf8.RuneCountInString(line)+2){grid[0]=append(grid[0],r)}}grid=append(grid,[]rune{})line="."+line+"."for_,r:=rangeline{grid[count]=append(grid[count],r)}count++}grid=append(grid,[]rune{})for_,r:=rangestrings.Repeat(".",len(grid[0])){grid[count]=append(grid[count],r)}gofunc(){resultPartOne:=partOne(copySliceSlice(grid))fmt.Printf("Puzzle 1 result: %d\n",resultPartOne)}()resultPartTwo:=partTwo(grid)fmt.Printf("Puzzle 2 result: %d\n",resultPartTwo)elapsed:=time.Since(start)fmt.Println("Run took:",elapsed)}funcpartOne(grid[][]rune)int{deepCopy:=copySliceSlice(grid)changeCoutner:=-1forchangeCoutner!=0{changeCoutner=0fory:=0;y<len(grid);y++{forx:=0;x<len(grid[y]);x++{ifgrid[y][x]=='#'{ifcheckAdjacent(deepCopy,y,x)>=4{changeCoutner++grid[y][x]='L'}}elseifgrid[y][x]=='L'{ifcheckAdjacent(deepCopy,y,x)==0{changeCoutner++grid[y][x]='#'}}}}ifchangeCoutner>0{deepCopy=copySliceSlice(grid)}}returngetOccupiedSeats(grid)}funccheckAdjacent(grid[][]rune,y,xint)int{positionsToCheck:=[][]int{{0,1},{0,-1},{1,0},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}}hitCount:=0for_,pos:=rangepositionsToCheck{ifgrid[y+pos[0]][x+pos[1]]=='#'{hitCount++}}returnhitCount}funcpartTwo(grid[][]rune)int{deepCopy:=copySliceSlice(grid)changeCoutner:=-1forchangeCoutner!=0{changeCoutner=0fory:=0;y<len(grid);y++{forx:=0;x<len(grid[y]);x++{ifgrid[y][x]=='#'{ifcheckAdjacentPartTwo(deepCopy,y,x)>=5{changeCoutner++grid[y][x]='L'}}elseifgrid[y][x]=='L'{ifcheckAdjacentPartTwo(deepCopy,y,x)==0{changeCoutner++grid[y][x]='#'}}}}ifchangeCoutner>0{deepCopy=copySliceSlice(grid)}}returngetOccupiedSeats(grid)}funccheckAdjacentPartTwo(grid[][]rune,y,xint)int{positionsToCheck:=[][]int{{0,1},{0,-1},{1,0},{-1,0},{1,1},{1,-1},{-1,1},{-1,-1}}hitCount:=0rows:=len(grid)colums:=len(grid[0])for_,pos:=rangepositionsToCheck{yToCheck:=y+pos[0]xToCheck:=x+pos[1]for(yToCheck>=0&&yToCheck<rows)&&(xToCheck>=0&&xToCheck<colums){ifgrid[yToCheck][xToCheck]=='#'{hitCount++ifhitCount==5{returnhitCount}break}elseifgrid[yToCheck][xToCheck]=='L'{break}yToCheck+=pos[0]xToCheck+=pos[1]}}returnhitCount}funccopySliceSlice(grid[][]rune)[][]rune{copyOfgrid:=make([][]rune,len(grid))fori:=0;i<len(grid);i++{sliceCopy:=make([]rune,len(grid[i]))copy(sliceCopy,grid[i])copyOfgrid[i]=sliceCopy}returncopyOfgrid}funcgetOccupiedSeats(grid[][]rune)int{counter:=0for_,row:=rangegrid{for_,r:=rangerow{ifr=='#'{counter++}}}returncounter}funcgetInput(pathstring)<-chanstring{c:=make(chanstring)gofunc(){file,err:=os.Open(path)iferr!=nil{panic("error in reading file: "+err.Error())}// scan filescanner:=bufio.NewScanner(file)forscanner.Scan(){c<-scanner.Text()}close(c)}()returnc}
Unfortunately I still have a runtime in total of round about 120ms.
Do you have any suggestions for a performance enhancement?
Best regards
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.
Hi guys!
I tried the problem with go.
Unfortunately I still have a runtime in total of round about 120ms.
Do you have any suggestions for a performance enhancement?
Best regards