Skip to content

Commit

Permalink
Day 11 part 1 (Golang)
Browse files Browse the repository at this point in the history
  • Loading branch information
dwalker109 committed Dec 11, 2020
1 parent fe433fc commit 81ebe09
Show file tree
Hide file tree
Showing 5 changed files with 271 additions and 0 deletions.
92 changes: 92 additions & 0 deletions day11/input.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
LLLLLLLLLL.LLLLL.LLLLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLL.LLLLL.LLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLL.L
LLLLLLLL.L.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLLL..LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL
LLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.L.LLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLL.
L.LLLLLLLLLLLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLLLLLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL
L..LL......LL.L..LL...L.........L.......LLL........L...L....L...LL.L....L.....LL....L..LL...L..
LL.LLLLLLLLLLLLLLLLLL.LLLL.L.LLLLLL.LLLLLL.L.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL
LLLLLLLLLL.LLLLL.LLLL.LLLLLLLLLLLLL.LLLLLLLL.LLLL.LL.LLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLL.L
LLLLLLLLLL.LLLLLLLLLL.LLLLLL.LL.LLL.LLLLLLLL.L.LLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLL.L
L.LLLLLLLL.LL.LL.LLLL..LLLLLLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL
...L.L.........LL..L.L.....L....L....L...L...L.LL...LLLLL....L...L......L..LLL..LL.....L..LL..L
LLLLLLLLLL.LLLLL.LLLL.LLLLLL..LLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLL.LLL.
LLLLLLLLLL.LL.LL.LLLL.LLLLLLLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LL.LLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLL.LLLLL.LLLL.LL.LLL..LLLLL.LLLLLLLL.LLLL.LL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
LLLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL
LLLLLLLLLLLLLLLLL.LLL.LLLLLL.LLLLLL.LLLLL.LL.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLL.LLL.L.LLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL
...L....LL....L.L....L.L.LL.L.LL.L..LL....LL.LL.........L..LL........L.LL..L....LL...L.......LL
LLLLLLLLLL.LLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL
L.LLLLLLLL.LLLLL.LLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LL.LLLLLL.LLLLL.LLLL.LLL
LLLLLLLLLL.LLLLL.LLLL.LLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLL.LLLLL..LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL
LL.LLLLLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLL.LLLL.LL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
..L.....L........LLL.......LL.LL....LL........L..L.L.LLLL.....L..LL....LL.L.L........LL.L.....L
LLLLLLLLLL.LLLLL.L.LL.LLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LL.LL.LLLLL.LL
LLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL..LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL
LLLLLLLLL..LLLLL.LLLLLLLLLLLLLLL.LL.LLLLLLLL.LLLLLLL..LLLLLL.LLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLL
LLLLLLLLLL.LLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLL.LLL.LLLL.LLLL.LLLLLLLLL.LLLLLLLLLL.LLL
LLLLLL.LLLLLLLLL.LL.L.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LL.LLLLL
L....L..LL..LL..LL......L..LL..LL.LL...L.....L.....L.L...L.LL.....L.......L..LL.........LLLL...
LLLLLLLLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLL.LL.LLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.L.LLLLLL
LLLLLLLLLL.LLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLL..LLLLLLLLLL.LLLLLL.LLLLLL.LLLLLLLL.L.LLLLL.L.LLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLLLLLLLL.LLLL.LLLLLL.LLLLLL.LLL.LLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.L.LLL.LLLLLLLL
L..L.L...LL.......L...............L..L....L.LLLL...L.L..L..LL.L...L...L...L.....L...L.....LLL..
LLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLL.LLLLL.LLLL.L.LLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL
LLLLLLLLLL.LLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLL.LL.LLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.L.LL.LLL
L.LLLLLLLLLLLLLLLLLLL.LL.LLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLL.LLLL.L.LLLLLLLLLLLLL.LLLLLLLL
LLLLLLLLLL.LLLLL..LLLLLLLL.L.LLLLLL.LLLLLLLL.LLLLLLLLLLLLL...LLLLLLLLL.LLLLLLLLL..LLLLLLLLLLLLL
LLLLLLLLLL.LLLLLLLLLL.LLLLLL.LLLLLL.LLLLLL.LLLLLLLLL.L.LLLLLLLLLLLLLLL.LL.LLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLL.LL.LL.LLLLLLLLLLL.LLLLLL.LLLL.LLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
..L.L....L.L......L..L.....L..L.LLLLL..L...............LLL.LLL.....L.L..L...L.LL.....L...L.....
.LLL.LLL.LLLLLLL.LLLL.LLLLLL.LL.LLL.LLLLLLLLLLLLLLLL.LL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
LLLLLLLLLL..LLLLLLLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLL.LL.LLLLLLLLLLLLLLLLL.L.LLLLL.LLLLLLLL
LLLLLLLLLL.LLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL
LLLLLLLLLL..LLLL.LLLL.LLLLLL.LLL.LL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL..LLLLLLL
LLLLLLLLLL.LLLLLLLLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLL..LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL
....LLL........L......L.LL.......LL.LL.LL.L.L..LL.L.....L.LLL.....L........LL......L..L.......L
LLLLLLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LL.LLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLL.L
LLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL
LLLLLLLLLL.LLLLL.LLLL.L.LLLL.LLL.LL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL..LLLLLLL
LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLL..LLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL
...............L.L...L...L....L..L..L......L.......L..L......LL.LL.LL.L.......L....L......L...L
LLLLL.LLLL.LLLLL.LLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL
LLLLLLLLLLLLLLLL.L.LL.LL.LLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLL.LLLL
LLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLLL.L.LLLLLLLLLLLLLLL.LLLLLLLL..LLLLLLLLL.LLLLLLLLLLLLLL
LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL
LLLLL.LLLLLLLLLL.LL.LLLLLLLLLLLLLLL.LLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
....LLL...LL.L....LL.L..L..L.........L.L...L.LLL..L...L..L..L.......L..L.LL.L..LL....LL.L..LLLL
LLLLLLLLLL.LLLLL.LLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LL.LL.LLLLLLLL
LLLLLLLLLL.LLLLLLLLLL.LLLLLL.LLL.LLLLLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.L.LLLLLL
LLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLL..LLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.LL.LLLLLLLLLLLLLL.LL.LLLLLL
LLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL.LLL.LLLLL.LLLLLLLLLLLLLLL.LLLLLLLL
LLLLLLLLLL.LLLLL.LLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLL.L.LLLLLLL.L.LLLLLLLLLLLLLLL.LLLLLLLL
.LLLLL.LLL.LLLLL.LLLL.LL.LLLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL
LLLL.LLLLLLLLLLL.LLLLLLLL.L..LLLLLLLLLLLLLLL.LLLL..LLLLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LL
LLLLLLLL.L.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLL.LL.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLL.LLLLLLLLLL.LLLLLLLL
LLLLLLLLLL.LLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LL.LLLLLLLLLLL
L......L...LL...L.L.L...LL.L...L......L......LL......LL.L.L....LL.LL.......LL...L..LLL...LL...L
LLLLLLLLLLLLLLLL.LLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLL.LLL..LLLLLLLLLLLLLL.LLL.LLLL
LLLLLLLLLL.LLLLL.LLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLL.LL.LLLL.LLLL.LLLLLLLLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL
LLLLLLLLLL.L.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL..LLLLLLLLLLL.LLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLL.LLLLLLLLLL.LLLLLL.LLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL
LLLLLLLLLL.LLLLLLLLLL.LLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLL.LLLLL.LLLL.LLLLLL.LLLLLLLLLLLLL..LL.LLLLL.LLLLLLL.LLLLLLLLL.L.LLLLLLL.LLLLL.LLLLLLLL
...L.L.L.....L........LLL.....LL.L.L.LL.....L...LL..L.LLL.....LL.L....L.L...LLL....L...LLLL...L
LLLLLLLLLL.LLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLL..LLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLL
LLLLLLLLLL.LLLLL.LLL..LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.L.LL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
LLLLLLLLL..LLLLL.LLLL..LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLL.LLLLLLLLLL.LLLLLL.LLLLLL.LLLLLLLLLLLLLLLL.LLLLLLL.LLL.LLLLLLLLLLLLLLLLLL.LL.LLLLLLL.
LLLLLLLLLL.LLLLL.LLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLL.LLLLL.LLLLLLLL
LLLLLLLLLL.LLLLL.LLLLLL.LLLLLLLLLLL...LLLLLLLLLLLLLL.L.L.LLL.LLLLLLLLLLLLL.LLLLL.LLLLLLLLLLLLLL
LLLLLLLLLL.LLLLL.LL.LLLLLLLL.LLLLL.LLLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL
.LLLLLLLL..LLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLL.LLLLLL.LLLLL.LLLLL.LL
LLLLLLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLL.LLLL..LLL.LLLLLLLLL.LLLLLLLLLLLLLL
LLLLLLLLLLLLLLLLLLL.L.LL.L.L.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL
10 changes: 10 additions & 0 deletions day11/input_test.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
L.LL.LL.LL
LLLLLLL.LL
L.L.L..L..
LLLL.LL.LL
L.LL.LL.LL
L.LLLLL.LL
..L.L.....
LLLLLLLLLL
L.LLLLLL.L
L.LLLLL.LL
135 changes: 135 additions & 0 deletions day11/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
package main

import (
"crypto/sha256"
"fmt"
"github.com/dwalker109/aoc-2020/util"
"regexp"
"strings"
)

func main() {
p1 := part1("./input.txt")

fmt.Println("Part 1:", p1)
}

func part1(p string) int {
i := make(chan string, 128)
go util.StreamInput(i, p)
grid := parseInput(i)
c := fillSeats(grid)
return c
}

func fillSeats(grid seatgrid) (c int) {
orig := cloneGridVals(grid)
for {
orig = cloneGridVals(grid)
for row := 0; row <= grid.lastY(); row++ {
for seat := 0; seat <= grid.lastX(); seat++ {
if orig.shouldToggleOccupancy(row, seat) {
grid.toggle(row, seat)
}
}
}
if orig.sum() == grid.sum() {
break
}
}

return grid.occupied()
}

func cloneGridVals(source seatgrid) seatgrid {
clone := make(seatgrid, len(source))
for i, row := range source {
rowclone := make([]string, len(row))
copy(rowclone, row)
clone[i] = rowclone
}
return clone
}

type seatgrid [][]string

func (sg seatgrid) shouldToggleOccupancy(y, x int) bool {
curr := sg[y][x]

sx := util.MaxInt(x-1, 0)
ex := util.MinInt(x+1, sg.lastX())
sy := util.MaxInt(y-1, 0)
ey := util.MinInt(y+1, sg.lastY())

var sb strings.Builder
for j := sy; j <= ey; j++ {
for i := sx; i <= ex; i++ {
if i == x && j == y {
sb.WriteString("+")
} else {
sb.WriteString(sg[j][i])
}
}
}

check := sb.String()
matches := regexp.MustCompile("#").FindAllStringIndex(check, -1)

if curr == "L" && len(matches) == 0 {
return true
}

if curr == "#" && len(matches) >= 4 {
return true
}

return false
}

func (sg *seatgrid) toggle(y, x int) {
curr := (*sg)[y][x]
if curr == "L" {
(*sg)[y][x] = string('#')
}
if curr == "#" {
(*sg)[y][x] = string('L')
}

}

func (sg seatgrid) lastY() int {
return len(sg) - 1
}

func (sg seatgrid) lastX() int {
return len(sg[0]) - 1
}

func (sg seatgrid) sum() [32]byte {
var sb strings.Builder
for _, r := range sg {
sb.WriteString(strings.Join(r, "-"))
}
return sha256.Sum256([]byte(sb.String()))
}

func (sg seatgrid) occupied() (o int) {
for _, row := range sg {
check := strings.Join(row, "")
matches := regexp.MustCompile("#").FindAllStringIndex(check, -1)
o += len(matches)
}
return
}

func parseInput(i <-chan string) seatgrid {
grid := make(seatgrid, 0)
for l := range i {
row := make([]string, len(l), len(l))
for i, s := range strings.Split(l, "") {
row[i] = s
}
grid = append(grid, row)
}
return grid
}
19 changes: 19 additions & 0 deletions day11/main_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package main

import "testing"

func Test_part1(t *testing.T) {
exp := 37
got := part1("./input_test.txt")
if exp != got {
t.Errorf("Part 1: expected %d, got %d", exp, got)
}
}

//func Test_part2(t *testing.T) {
// exp := 8
// got := part2("./input_test.txt")
// if exp != got {
// t.Errorf("Part 2: expected %d, got %d", exp, got)
// }
//}
15 changes: 15 additions & 0 deletions util/math.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package util

func MaxInt(a, b int) int {
if a > b {
return a
}
return b
}

func MinInt(a, b int) int {
if a < b {
return a
}
return b
}

0 comments on commit 81ebe09

Please sign in to comment.