6 changed files with 634 additions and 0 deletions
@ -0,0 +1,97 @@ |
|||
LLL.LLL.LLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLL |
|||
LLLLLLL.LLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL..LLLLLLL..LLLLLLL.LLLL.LLLLLLLLLL |
|||
LLLLLLLLLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLL.L.LLLLLLLL.LLLLLL.LLLLLLLL |
|||
LLLLLLL.LLLLLL.LLLL.LLLLLLLLL.LLLLL.LLL.LLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL |
|||
LLLLLLL.LLL.LLLL.LLLLLLL.LLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLL |
|||
LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLL.LLLL |
|||
...L..L.L......LL.L.......L...L..LLL....L.LL.L..L.L.LL..L..L............LLL.L..L.L.L..LL.. |
|||
LLLLLLLLLLLLLLL..LLLLL.L.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL.L.LLLLLL.LLLLLLLL |
|||
.LLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LL.LLLLL |
|||
LLLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLL.LLLLLLLLLLL |
|||
LLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLL.LLL |
|||
......L.L.L...LLL.LL...........L.....L..L...LL......L..L.L.L.....LL.LL..L..LL.LL......LLLL |
|||
LLLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL |
|||
LLLLLLL.LLLLLLLL.LL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLL.LLLLLL.LLLLLLLL |
|||
LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.L.LLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLL..LLLLLLLLLLLLLL |
|||
LLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLL.L.LLLLLL.LLLLLL.LLLLLLLL |
|||
LLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLL |
|||
LLLLLLL.LLLLLLLL.LLLLLLLLLLLL.LLLLLLLLL.LLLLLLL..LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL |
|||
L....LL.LL.....LLL.......L.....L.L..L.LL.L...L.L..L.....L...L....LL.LLL...L..L.LL.L..L...L |
|||
LLLLLLL.LLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL |
|||
LLLLLLL.LLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LL.LLLL.LL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL |
|||
LLLLLLL.LLLLLLLL.LLLLLLL.LLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLL |
|||
LLLLLLL.LLLLLLLL.LLLLLLL.LLLL..LLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.L |
|||
LLLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLL.L.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL |
|||
LLLLLLL.LLLLLLLLLLLL.LLLLL.LL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLL.LLLL.LLLLLL.LLLLLLLL |
|||
LLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLL |
|||
LLLLLLL.LLLLLLLL.LLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLL.LLLL.LLL |
|||
L....L......L..L..L.........L...LL..L..L.....L....L.LLL.L..L.LL..L..L..LL...L.......L.L... |
|||
LLLLLLLLLLLLLLLL..LLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL |
|||
LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLL.LLLL.LL.LLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL |
|||
LLLLLLLLLLLLLLL..LLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL |
|||
LLLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLL.LLLL.LLLLLLL.LLLLLLLLL.LLL.LLLLLLLL.LLL.LLLLLL.LLLLLLLL |
|||
LLLLLLL.LLLLLLL..LLLLLLLLLLLL.LLLLLLLLLLLLL.LLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLL |
|||
L...LL..L..L..L.LL..L......L..L..LL.....LL...L...LL..L.L........LL.LL..LL.L......L..L..L.. |
|||
LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL..LLLLLL.LLLLLL...LLLLLLL |
|||
LLLLLLL.LLLLLLLL.LLLLLLL.LLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL |
|||
LLLLLLL.LLLLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLL.LLL.LLL.LLLLLLLLLLLLLLL.LLLLLLLL |
|||
LLLLLLL.LLLLLLLLLLLLLLLL.LLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLL |
|||
LLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLL.LLLLLLLL |
|||
LLLLLLL.LLLLLL.L.LLLLLLL.LLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLL |
|||
LLLLLLL..LLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLL |
|||
..............L.....L..L..L..L...L......L...LL...................LLLLL..L.LL...L.....L.L.. |
|||
LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLLL.LL.LLL.LLLLLLLL.LLLLLLLLLLLLLLL |
|||
LLLLLLL.LLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLL..LLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLL |
|||
LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLL |
|||
LLLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLLLL.LLLLLLLLLL.LLLL.LLLL.LLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL |
|||
L.....L..L...LL...L.L...L..L.....L..L...L....L...L...LL...L......LL..L..LL.L.L..L.L.L.L.L. |
|||
LLLLLLL.LLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL..LLLLLL.LLLLLLLL.L.LLLL.LLLLLLLL |
|||
LLLLLLL.LLLLLL.L.LLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL |
|||
LLLLLL.LLLLL.LLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLLL.LLLLLL.LLLLLLLL |
|||
LLLLLLLLLLLLLLLLLLLLLLL..LLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLL |
|||
LLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL |
|||
LLLLLLL.LLLLLLLL.LLLLLLL..LLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLL |
|||
LLL..L.L.....L.....LL.L..LL.L.L......L..L.L...L.L....L.....LL..LL.L......L...L....L...L... |
|||
L.LLLLLLLLLLL.LL.LLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL |
|||
LLLLLLL.LLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLL.LLLLLL.LLLLLLLL |
|||
LLLLLLL.LLLLLLLLL.LLLLLLL.LLL.LLLLLL.LLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLL |
|||
LLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLL.L.LLLLLLL.LLLLLL.LL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL |
|||
LLLLLLL.LLLLLL.LLLLLLLLL.LLLL.LLLLLLLLL.LLLLLLL..LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLL |
|||
.LL.....L.L.L...L.L.....L..L..LL....LLL.......L.L.......LL...LLL...L...L...LLL.L...LLLL..L |
|||
LLLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLL..LLLLLLLL |
|||
LLLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLLL.LLL.LLLLLLL.LLL.LLLLL.LLLLLLL.LLLLLLLL.LL.LLL.LLLLLLLL |
|||
LLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL |
|||
LLLLLLLLLLLLLLLL.LLL.LLL.LLLLLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.L.LLLLLL.L.LLLLLLLLLLLLL |
|||
LLLLLLL.LLLLLL.L.LLLLLLL.LLLL..LLLLLLLL.LLLLLLLLLLLL.LLLLLLLLLLLL.L.LLLLLL.LLLLLL.LLLLLLLL |
|||
LLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL |
|||
LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LL.LLLLLLLLLLLLLL.LLL.LLLL.LLLLL..LLLLLLLL |
|||
.L..LLL..L..LL...L.L..L......L.L.L..L.....L.....L..L....LLL....L.......L.LLL..LL....L..L.L |
|||
LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LL.LLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLL |
|||
LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLL.LLLLL.LL.LLLLLLLLLLLLLLL |
|||
LLLLLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLL.L.LLLLLLLL |
|||
LLLLLLL.LLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL |
|||
LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLL |
|||
LL...L.L.L..L.L..........L..L..LL.LL....L.L.L.L.LLL.......L.......L.L....L...L..LL........ |
|||
LLLLLLLLLLLL.LLL.LLLLLLLLLLLL.LLLLLLLLL.LLLL..LLLLLLLLLL....LLLLLLLLLLLLLL..LLLLLLLLLLLLLL |
|||
LLLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLL.LL.LLLLLLLLLLLLLLL.LLLLLLLL |
|||
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLL |
|||
LLLLLL.LLLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.L.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLL |
|||
LLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLL..LLLL.LLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLL.LLLLLLLL |
|||
LLLLL.L.LLLLLLLL.LLLLLLL.LLLL.LLLLLLLLLLLLLLLLL.LLLL.LLLLLLL.LLLLLLLLLLL.L.LLLLLL.LLLLLLLL |
|||
.LLL..L...L.L......LL.L..LL.LL.LLLLL...L...LLLL.L..L..LLL......L...LL.....L..LLLL.LL.LL..L |
|||
LLLLLLL.LLLLLLLLLLL.LLL..LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLL.LLLLLLLL.LLLLLL.LLLLLLLL |
|||
LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL.LLL.LL.LLLLLLLL |
|||
LLLLLLL.LLLLLLLL.LLLLLLL.LLLL.LLLLLLLLLLLLLLLLL.LLLLLLLLLLLLLLLLL.L.LLLLLL.LLLLLL.LLLLLLLL |
|||
LLLLLLL.LLLLLLLLLLLLLLLL.LLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLL.LLLL.LLL |
|||
L...L.......L..LLLL..L.LL...LL....L.....L.L..L...LLLLL.....LL.....L.L.LLL.L..L.LL.....L.L. |
|||
LLLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL.LLL.LLLL.LLLLLL.LLLLLLLL |
|||
LLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLL.LL.LLLLLLL.LLLLLLLLL.LLLLLLLLLLLLL..L.LLLLLLLLLLLLLLL |
|||
L.LLLLL.LLLLLLLL.LLLLLLLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLL |
|||
LLLLLLL.LLLLLL.L.LLLLLLLLLLLL.LLLLLLLLLLLLLLL.L.LLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL |
|||
LLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLL.LLL.LLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLL |
|||
LLLLLLL.LLLLLLLL.LLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLLL.LLLLLL.LLLLLLLL |
|||
LLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.LLLLLLLLLLLLL.LLL.LLLLLLL.LLLLLLLLLLLLLLL.LLLLLL.L |
|||
LLLLLLL.LLLLLLLL.LLLLLLL.LLLL..LLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLL.LLLLLLLL..LLLLL.LLLLLLLL |
|||
LLLLLLLLL.LLLLLLLLLLLLLLLLLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLL.LL.LLLLLLLL.LLLLLLLLLLLLLLL |
|||
LLLLLLLLLLLLLLLL.LLLLLLL.LLLL.LLLLLLLLL.LLLLLLLLLLLLLLLLL.LLLLLLL.LLLLLLLLLLLLLLL.LLLLLLL. |
|||
LLLLLLL.LLLLLLLL.LLLLLLL.LLLLLLLLLLLLLL.LLLLLLL.LLLLLL.LL.LLLLLLL.LLLLLLLL.LLLLLLLLLLLLLLL |
@ -0,0 +1,263 @@ |
|||
package main |
|||
|
|||
import ( |
|||
"fmt" |
|||
|
|||
h "git.bullercodeworks.com/brian/adventofcode/helpers" |
|||
) |
|||
|
|||
const ( |
|||
EMPTY = 'L' |
|||
FULL = '#' |
|||
FLOOR = '.' |
|||
|
|||
N = iota |
|||
NE |
|||
E |
|||
SE |
|||
S |
|||
SW |
|||
W |
|||
NW |
|||
) |
|||
|
|||
func main() { |
|||
fmt.Println("# Day 11") |
|||
inp := h.StdinToStringSlice() |
|||
pt := h.GetArgNumber(1) |
|||
if pt == "1" { |
|||
part1(inp) |
|||
} else { |
|||
part2(inp) |
|||
} |
|||
} |
|||
|
|||
func part1(inp []string) { |
|||
fmt.Println("## Part 1") |
|||
w := BuildWaitingRoom(inp) |
|||
var last string |
|||
for w.String() != last { |
|||
last = w.String() |
|||
w.Tick() |
|||
} |
|||
fmt.Println(w) |
|||
fmt.Printf("At stabilization there are %d occupied seats\n", w.OccupiedSeats()) |
|||
} |
|||
|
|||
func part2(inp []string) { |
|||
fmt.Println("## Part 2") |
|||
w := BuildWaitingRoom(inp) |
|||
var last string |
|||
for w.String() != last { |
|||
last = w.String() |
|||
w.VisibleTick() |
|||
} |
|||
fmt.Println(w) |
|||
fmt.Printf("At stabilization there are %d occupied seats\n", w.OccupiedSeats()) |
|||
} |
|||
|
|||
type WaitingRoom struct { |
|||
Layout map[h.Coordinate]byte |
|||
NorthMost int |
|||
SouthMost int |
|||
EastMost int |
|||
WestMost int |
|||
} |
|||
|
|||
func BuildWaitingRoom(inp []string) *WaitingRoom { |
|||
ret := WaitingRoom{ |
|||
Layout: make(map[h.Coordinate]byte), |
|||
NorthMost: h.MAX_INT, |
|||
SouthMost: h.MIN_INT, |
|||
EastMost: h.MIN_INT, |
|||
WestMost: h.MAX_INT, |
|||
} |
|||
|
|||
for y := range inp { |
|||
for x := range inp[y] { |
|||
ret.Layout[h.Coordinate{X: x, Y: y}] = inp[y][x] |
|||
if x < ret.WestMost { |
|||
ret.WestMost = x |
|||
} |
|||
if x > ret.EastMost { |
|||
ret.EastMost = x |
|||
} |
|||
} |
|||
if y < ret.NorthMost { |
|||
ret.NorthMost = y |
|||
} |
|||
if y > ret.SouthMost { |
|||
ret.SouthMost = y |
|||
} |
|||
} |
|||
return &ret |
|||
} |
|||
|
|||
func (w *WaitingRoom) OccupiedSeats() int { |
|||
var ret int |
|||
for k := range w.Layout { |
|||
if !w.CoordEmpty(k) { |
|||
ret++ |
|||
} |
|||
} |
|||
return ret |
|||
} |
|||
|
|||
func (w *WaitingRoom) CoordEmpty(c h.Coordinate) bool { |
|||
return w.Layout[c] != FULL |
|||
} |
|||
|
|||
func (w *WaitingRoom) ShouldFill(c h.Coordinate) bool { |
|||
if w.Layout[c] == FULL || w.Layout[c] == FLOOR { |
|||
return false |
|||
} |
|||
return w.CoordEmpty(c.North()) && w.CoordEmpty(c.NE()) && w.CoordEmpty(c.East()) && w.CoordEmpty(c.SE()) && w.CoordEmpty(c.South()) && w.CoordEmpty(c.SW()) && w.CoordEmpty(c.West()) && w.CoordEmpty(c.NW()) |
|||
} |
|||
|
|||
func (w *WaitingRoom) ShouldEmpty(c h.Coordinate) bool { |
|||
if w.Layout[c] == EMPTY || w.Layout[c] == FLOOR { |
|||
return false |
|||
} |
|||
var fullSeats int |
|||
for _, v := range []h.Coordinate{c.North(), c.NE(), c.East(), c.SE(), c.South(), c.SW(), c.West(), c.NW()} { |
|||
if !w.CoordEmpty(v) { |
|||
fullSeats++ |
|||
if fullSeats >= 4 { |
|||
return true |
|||
} |
|||
} |
|||
} |
|||
return false |
|||
} |
|||
|
|||
func (w *WaitingRoom) Tick() { |
|||
wrk := make(map[h.Coordinate]byte) |
|||
for k := range w.Layout { |
|||
wrk[k] = w.Layout[k] |
|||
switch w.Layout[k] { |
|||
case EMPTY: |
|||
if w.ShouldFill(k) { |
|||
wrk[k] = FULL |
|||
} |
|||
|
|||
case FULL: |
|||
if w.ShouldEmpty(k) { |
|||
wrk[k] = EMPTY |
|||
} |
|||
} |
|||
} |
|||
for k := range wrk { |
|||
w.Layout[k] = wrk[k] |
|||
} |
|||
} |
|||
|
|||
func (w *WaitingRoom) IsFloor(c h.Coordinate) bool { |
|||
return w.Layout[c] == FLOOR |
|||
} |
|||
|
|||
func (w *WaitingRoom) GetCoordInDir(c h.Coordinate, dir int) h.Coordinate { |
|||
switch dir { |
|||
case N: |
|||
return c.North() |
|||
case NE: |
|||
return c.NE() |
|||
case E: |
|||
return c.East() |
|||
case SE: |
|||
return c.SE() |
|||
case S: |
|||
return c.South() |
|||
case SW: |
|||
return c.SW() |
|||
case W: |
|||
return c.West() |
|||
case NW: |
|||
return c.NW() |
|||
} |
|||
return c |
|||
} |
|||
|
|||
func (w *WaitingRoom) DirectionEmpty(c h.Coordinate, dir int) bool { |
|||
c = w.GetCoordInDir(c, dir) |
|||
for w.IsFloor(c) { |
|||
c = w.GetCoordInDir(c, dir) |
|||
} |
|||
return w.CoordEmpty(c) |
|||
} |
|||
|
|||
func (w *WaitingRoom) VisibleShouldFill(c h.Coordinate) bool { |
|||
if w.Layout[c] == FULL || w.Layout[c] == FLOOR { |
|||
return false |
|||
} |
|||
return w.DirectionEmpty(c, N) && w.DirectionEmpty(c, NE) && w.DirectionEmpty(c, E) && w.DirectionEmpty(c, SE) && w.DirectionEmpty(c, S) && w.DirectionEmpty(c, SW) && w.DirectionEmpty(c, W) && w.DirectionEmpty(c, NW) |
|||
} |
|||
|
|||
func (w *WaitingRoom) VisibleShouldEmpty(c h.Coordinate) bool { |
|||
if w.Layout[c] == EMPTY || w.Layout[c] == FLOOR { |
|||
return false |
|||
} |
|||
var fullSeats int |
|||
for _, v := range []int{N, NE, E, SE, S, SW, W, NW} { |
|||
if !w.DirectionEmpty(c, v) { |
|||
fullSeats++ |
|||
if fullSeats >= 5 { |
|||
return true |
|||
} |
|||
} |
|||
} |
|||
return false |
|||
} |
|||
|
|||
func (w *WaitingRoom) VisibleTick() { |
|||
wrk := make(map[h.Coordinate]byte) |
|||
for k := range w.Layout { |
|||
wrk[k] = w.Layout[k] |
|||
switch w.Layout[k] { |
|||
case EMPTY: |
|||
if w.VisibleShouldFill(k) { |
|||
wrk[k] = FULL |
|||
} |
|||
|
|||
case FULL: |
|||
if w.VisibleShouldEmpty(k) { |
|||
wrk[k] = EMPTY |
|||
} |
|||
} |
|||
} |
|||
for k := range wrk { |
|||
w.Layout[k] = wrk[k] |
|||
} |
|||
} |
|||
|
|||
func (w WaitingRoom) String() string { |
|||
var ret string |
|||
for y := w.NorthMost; y <= w.SouthMost; y++ { |
|||
for x := w.WestMost; x <= w.EastMost; x++ { |
|||
ret = ret + string(w.Layout[h.Coordinate{X: x, Y: y}]) |
|||
} |
|||
ret = ret + "\n" |
|||
} |
|||
return ret |
|||
} |
|||
|
|||
func DirToStr(dir int) string { |
|||
switch dir { |
|||
case N: |
|||
return "N" |
|||
case NE: |
|||
return "NE" |
|||
case E: |
|||
return "E" |
|||
case SE: |
|||
return "SE" |
|||
case S: |
|||
return "S" |
|||
case SW: |
|||
return "SW" |
|||
case W: |
|||
return "W" |
|||
case NW: |
|||
return "NW" |
|||
} |
|||
return "-" |
|||
} |
@ -0,0 +1,243 @@ |
|||
Advent of Code |
|||
|
|||
--- Day 11: Seating System --- |
|||
|
|||
Your plane lands with plenty of time to spare. The final leg of your journey is a ferry that goes directly to the tropical island where you can finally start your vacation. As you reach the waiting area to board the ferry, you realize you're so |
|||
early, nobody else has even arrived yet! |
|||
|
|||
By modeling the process people use to choose (or abandon) their seat in the waiting area, you're pretty sure you can predict the best place to sit. You make a quick map of the seat layout (your puzzle input). |
|||
|
|||
The seat layout fits neatly on a grid. Each position is either floor (.), an empty seat (L), or an occupied seat (#). For example, the initial seat layout might look like this: |
|||
|
|||
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 |
|||
|
|||
Now, you just need to model the people who will be arriving shortly. Fortunately, people are entirely predictable and always follow a simple set of rules. All decisions are based on the number of occupied seats adjacent to a given seat (one of |
|||
the eight positions immediately up, down, left, right, or diagonal from the seat). The following rules are applied to every seat simultaneously: |
|||
|
|||
• If a seat is empty (L) and there are no occupied seats adjacent to it, the seat becomes occupied. |
|||
• If a seat is occupied (#) and four or more seats adjacent to it are also occupied, the seat becomes empty. |
|||
• Otherwise, the seat's state does not change. |
|||
|
|||
Floor (.) never changes; seats don't move, and nobody sits on the floor. |
|||
|
|||
After one round of these rules, every seat in the example layout becomes occupied: |
|||
|
|||
#.##.##.## |
|||
#######.## |
|||
#.#.#..#.. |
|||
####.##.## |
|||
#.##.##.## |
|||
#.#####.## |
|||
..#.#..... |
|||
########## |
|||
#.######.# |
|||
#.#####.## |
|||
|
|||
After a second round, the seats with four or more occupied adjacent seats become empty again: |
|||
|
|||
#.LL.L#.## |
|||
#LLLLLL.L# |
|||
L.L.L..L.. |
|||
#LLL.LL.L# |
|||
#.LL.LL.LL |
|||
#.LLLL#.## |
|||
..L.L..... |
|||
#LLLLLLLL# |
|||
#.LLLLLL.L |
|||
#.#LLLL.## |
|||
|
|||
This process continues for three more rounds: |
|||
|
|||
#.##.L#.## |
|||
#L###LL.L# |
|||
L.#.#..#.. |
|||
#L##.##.L# |
|||
#.##.LL.LL |
|||
#.###L#.## |
|||
..#.#..... |
|||
#L######L# |
|||
#.LL###L.L |
|||
#.#L###.## |
|||
|
|||
#.#L.L#.## |
|||
#LLL#LL.L# |
|||
L.L.L..#.. |
|||
#LLL.##.L# |
|||
#.LL.LL.LL |
|||
#.LL#L#.## |
|||
..L.L..... |
|||
#L#LLLL#L# |
|||
#.LLLLLL.L |
|||
#.#L#L#.## |
|||
|
|||
#.#L.L#.## |
|||
#LLL#LL.L# |
|||
L.#.L..#.. |
|||
#L##.##.L# |
|||
#.#L.LL.LL |
|||
#.#L#L#.## |
|||
..L.L..... |
|||
#L#L##L#L# |
|||
#.LLLLLL.L |
|||
#.#L#L#.## |
|||
|
|||
At this point, something interesting happens: the chaos stabilizes and further applications of these rules cause no seats to change state! Once people stop moving around, you count 37 occupied seats. |
|||
|
|||
Simulate your seating area by applying the seating rules repeatedly until no seats change state. How many seats end up occupied? |
|||
|
|||
Your puzzle answer was 2265. |
|||
|
|||
--- Part Two --- |
|||
|
|||
As soon as people start to arrive, you realize your mistake. People don't just care about adjacent seats - they care about the first seat they can see in each of those eight directions! |
|||
|
|||
Now, instead of considering just the eight immediately adjacent seats, consider the first seat in each of those eight directions. For example, the empty seat below would see eight occupied seats: |
|||
|
|||
.......#. |
|||
...#..... |
|||
.#....... |
|||
......... |
|||
..#L....# |
|||
....#.... |
|||
......... |
|||
#........ |
|||
...#..... |
|||
|
|||
The leftmost empty seat below would only see one empty seat, but cannot see any of the occupied ones: |
|||
|
|||
............. |
|||
.L.L.#.#.#.#. |
|||
............. |
|||
|
|||
The empty seat below would see no occupied seats: |
|||
|
|||
.##.##. |
|||
#.#.#.# |
|||
##...## |
|||
...L... |
|||
##...## |
|||
#.#.#.# |
|||
.##.##. |
|||
|
|||
Also, people seem to be more tolerant than you expected: it now takes five or more visible occupied seats for an occupied seat to become empty (rather than four or more from the previous rules). The other rules still apply: empty seats that see |
|||
no occupied seats become occupied, seats matching no rule don't change, and floor never changes. |
|||
|
|||
Given the same starting layout as above, these new rules cause the seating area to shift around as follows: |
|||
|
|||
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 |
|||
|
|||
#.##.##.## |
|||
#######.## |
|||
#.#.#..#.. |
|||
####.##.## |
|||
#.##.##.## |
|||
#.#####.## |
|||
..#.#..... |
|||
########## |
|||
#.######.# |
|||
#.#####.## |
|||
|
|||
#.LL.LL.L# |
|||
#LLLLLL.LL |
|||
L.L.L..L.. |
|||
LLLL.LL.LL |
|||
L.LL.LL.LL |
|||
L.LLLLL.LL |
|||
..L.L..... |
|||
LLLLLLLLL# |
|||
#.LLLLLL.L |
|||
#.LLLLL.L# |
|||
|
|||
#.L#.##.L# |
|||
#L#####.LL |
|||
L.#.#..#.. |
|||
##L#.##.## |
|||
#.##.#L.## |
|||
#.#####.#L |
|||
..#.#..... |
|||
LLL####LL# |
|||
#.L#####.L |
|||
#.L####.L# |
|||
|
|||
#.L#.L#.L# |
|||
#LLLLLL.LL |
|||
L.L.L..#.. |
|||
##LL.LL.L# |
|||
L.LL.LL.L# |
|||
#.LLLLL.LL |
|||
..L.L..... |
|||
LLLLLLLLL# |
|||
#.LLLLL#.L |
|||
#.L#LL#.L# |
|||
|
|||
#.L#.L#.L# |
|||
#LLLLLL.LL |
|||
L.L.L..#.. |
|||
##L#.#L.L# |
|||
L.L#.#L.L# |
|||
#.L####.LL |
|||
..#.#..... |
|||
LLL###LLL# |
|||
#.LLLLL#.L |
|||
#.L#LL#.L# |
|||
|
|||
#.L#.L#.L# |
|||
#LLLLLL.LL |
|||
L.L.L..#.. |
|||
##L#.#L.L# |
|||
L.L#.LL.L# |
|||
#.LLLL#.LL |
|||
..#.L..... |
|||
LLL###LLL# |
|||
#.LLLLL#.L |
|||
#.L#LL#.L# |
|||
|
|||
Again, at this point, people stop shifting around and the seating area reaches equilibrium. Once this occurs, you count 26 occupied seats. |
|||
|
|||
Given the new visibility method and the rule change for occupied seats becoming empty, once equilibrium is reached, how many seats end up occupied? |
|||
|
|||
Your puzzle answer was 2045. |
|||
|
|||
Both parts of this puzzle are complete! They provide two gold stars: ** |
|||
|
|||
At this point, you should return to your Advent calendar and try another puzzle. |
|||
|
|||
If you still want to see it, you can get your puzzle input. |
|||
|
|||
References |
|||
|
|||
Visible links |
|||
. https://adventofcode.com/ |
|||
. https://adventofcode.com/2020/about |
|||
. https://adventofcode.com/2020/events |
|||
. https://adventofcode.com/2020/settings |
|||
. https://adventofcode.com/2020/auth/logout |
|||
. Advent of Code Supporter |
|||
https://adventofcode.com/2020/support |
|||
. https://adventofcode.com/2020 |
|||
. https://adventofcode.com/2020 |
|||
. https://adventofcode.com/2020/support |
|||
. https://adventofcode.com/2020/sponsors |
|||
. https://adventofcode.com/2020/leaderboard |
|||
. https://adventofcode.com/2020/stats |
|||
. https://adventofcode.com/2020/sponsors |
|||
. https://adventofcode.com/2020 |
|||
. https://adventofcode.com/2020/day/11/input |
@ -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 |
Loading…
Reference in new issue