package main import ( "fmt" "os" //"strconv" ) // go run 14.go "input" func main() { s := os.Args[1] ones := 0 squareSize := 128 grid := make([][]int, squareSize) for x := 0; x < squareSize; x++ { lineSeed := fmt.Sprint(s, "-", x) hash := MakeHash(lineSeed) ones += CountOnes(hash) grid[x] = BuildGrid(hash) } regionCount := 1 for y := 0; y < squareSize; y++ { for x := 0; x < squareSize; x++ { grid, regionCount = CountRegions(grid, x, y, regionCount) } } fmt.Println(ones) fmt.Println(regionCount-1) } func CountRegions (grid [][]int, x int, y int, regionCount int) ([][]int, int) { if x < 0 || x >= len(grid) || y < 0 || y >= len(grid) { return grid,regionCount } if grid[x][y] == -1 { return grid, regionCount } if grid[x][y] == 0 { grid[x][y] = regionCount grid,_ = CountRegions(grid, x+1, y, regionCount) grid,_ = CountRegions(grid, x-1, y, regionCount) grid,_ = CountRegions(grid, x, y+1, regionCount) grid,_ = CountRegions(grid, x, y-1, regionCount) regionCount++ } return grid, regionCount } func BuildGrid (s string) []int { y := make([]int, len(s)) for i := range s { if s[i] == 49 { y[i] = 0 } else { y[i] = -1 } } return y } func CountOnes (s string) int { count := 0 for x := range s { if s[x] == 49 { count++ } } return count } func MakeHash (s string) string { size := 256 appendList := []byte{17, 31, 73, 47, 23} s = s + string(appendList) list := make([]int, size) for i := 0; i < size; i++ { list[i] = i } pos := 0 skip := 0 for j := 0; j < 64; j++ { for x := range s { i := int(s[x]) // Reverse the section r := i/2 for y := 0; y < r; y++ { bottom := (pos+y) % size top := (pos+i-y-1) % size tmp := list[bottom] list[bottom] = list[top] list[top] = tmp } pos = (pos+i+skip) % size skip++ } } ret := "" for a:=0; a<16; a++ { r := list[a*16] for b:=1; b<16; b++ { xorpos := (a*16)+b r = r ^ list[xorpos] } ret = ret + fmt.Sprintf("%08b", r) //+ " " } return ret }