diff --git a/main.go b/main.go index f9a3bd9..7d4b38b 100644 --- a/main.go +++ b/main.go @@ -101,4 +101,5 @@ func main() { // Day 24 fmt.Println(twentyfour.PartOne()) + fmt.Println(twentyfour.PartTwo()) } diff --git a/twentyfour/day_twentyfour.go b/twentyfour/day_twentyfour.go index 6ac042a..f89eeff 100644 --- a/twentyfour/day_twentyfour.go +++ b/twentyfour/day_twentyfour.go @@ -83,6 +83,79 @@ func (l *lobby) countTiles() (black, white int) { return black, white } +func (l *lobby) dailyFlip(days int) { + for i := 0; i < days; i++ { + fmt.Println("Day", i+1) + newGrid := map[string]bool{} + + xMin, yMin, zMin, xMax, yMax, zMax := 0, 0, 0, 0, 0, 0 + for index := range l.tiles { + var x, y, z int + fmt.Sscanf(index, "%d,%d,%d", &x, &y, &z) + if x < xMin { + xMin = x + } + if x > xMax { + xMax = x + } + + if y < yMin { + yMin = y + } + + if y > yMax { + yMax = y + } + + if z < zMin { + zMin = z + } + + if z > zMax { + zMax = z + } + } + + for x := xMin - 1; x <= xMax+1; x++ { + for y := yMin - 1; y <= yMax+1; y++ { + for z := zMin - 1; z <= zMax+1; z++ { + blackNeighbours := 0 + if l.tiles[fmt.Sprintf("%d,%d,%d", x+1, y, z-1)] { + blackNeighbours++ + } + if l.tiles[fmt.Sprintf("%d,%d,%d", x+1, y-1, z)] { + blackNeighbours++ + } + if l.tiles[fmt.Sprintf("%d,%d,%d", x, y-1, z+1)] { + blackNeighbours++ + } + if l.tiles[fmt.Sprintf("%d,%d,%d", x-1, y, z+1)] { + blackNeighbours++ + } + if l.tiles[fmt.Sprintf("%d,%d,%d", x-1, y+1, z)] { + blackNeighbours++ + } + if l.tiles[fmt.Sprintf("%d,%d,%d", x, y+1, z-1)] { + blackNeighbours++ + } + + index := fmt.Sprintf("%d,%d,%d", x, y, z) + if l.tiles[index] { + if blackNeighbours > 0 && blackNeighbours < 3 { + newGrid[index] = true + } + } else { + if blackNeighbours == 2 { + newGrid[index] = true + } + } + } + } + } + l.tiles = newGrid + } +} + // PartOne How many tiles are left black func PartOne() string { l := lobby{} @@ -93,3 +166,15 @@ func PartOne() string { return fmt.Sprintf("There are %d black tiles", black) } + +// PartTwo How many tiles are black after 100 days +func PartTwo() string { + l := lobby{} + l.load("twentyfour/input.txt") + + l.layout() + l.dailyFlip(100) + black, _ := l.countTiles() + + return fmt.Sprintf("There are %d black tiles", black) +} diff --git a/twentyfour/day_twentyfour_test.go b/twentyfour/day_twentyfour_test.go index 5d5e21f..11ae6ee 100644 --- a/twentyfour/day_twentyfour_test.go +++ b/twentyfour/day_twentyfour_test.go @@ -23,7 +23,7 @@ func Test_layout_tiles(t *testing.T) { l.layout() black, white := l.countTiles() - if black + white != 15 { + if black+white != 15 { t.Logf("Expected 15 tiles, got %d", black+white) t.Fail() } @@ -38,3 +38,72 @@ func Test_layout_tiles(t *testing.T) { t.Fail() } } + +func Test_daily_flip(t *testing.T) { + l := lobby{} + l.load("sample.txt") + + l.layout() + black, white := l.countTiles() + if black+white != 15 { + t.Logf("Expected 15 tiles, got %d", black+white) + t.Fail() + } + + if black != 10 { + t.Logf("Expected 10 black tiles, got %d", black) + t.Fail() + } + + l.dailyFlip(1) + black, _ = l.countTiles() + if black != 15 { + t.Logf("Expected 15 black tiles, got %d", black) + t.FailNow() + } + + l.dailyFlip(1) + black, _ = l.countTiles() + if black != 12 { + t.Logf("Expected 12 black tiles, got %d", black) + t.FailNow() + } + + l.dailyFlip(1) + black, _ = l.countTiles() + if black != 25 { + t.Logf("Expected 25 black tiles, got %d", black) + t.FailNow() + } + + l.dailyFlip(1) + black, _ = l.countTiles() + if black != 14 { + t.Logf("Expected 14 black tiles, got %d", black) + t.FailNow() + } +} + +func Test_flip(t *testing.T) { + l := lobby{} + l.load("sample.txt") + + l.layout() + black, white := l.countTiles() + if black+white != 15 { + t.Logf("Expected 15 tiles, got %d", black+white) + t.Fail() + } + + if black != 10 { + t.Logf("Expected 10 black tiles, got %d", black) + t.Fail() + } + + l.dailyFlip(100) + black, _ = l.countTiles() + if black != 2208 { + t.Logf("Expected 2208 black tiles, got %d", black) + t.FailNow() + } +}