71 lines
1.2 KiB
Go
Executable File
71 lines
1.2 KiB
Go
Executable File
package main
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
h "git.bullercodeworks.com/brian/adventofcode/helpers"
|
|
)
|
|
|
|
func main() {
|
|
inp := h.StdinToStringSlice()
|
|
|
|
seats := make(map[int]Seat)
|
|
var topSeat int
|
|
for k := range inp {
|
|
row, col, seat := findSeatFromId(inp[k])
|
|
seats[seat] = Seat{
|
|
Row: row,
|
|
Col: col,
|
|
Seat: seat,
|
|
}
|
|
if seat > topSeat {
|
|
topSeat = seat
|
|
}
|
|
}
|
|
fmt.Println("# Part 1 - Top Seat:", topSeat)
|
|
for k := range seats {
|
|
_, tOk := seats[k-1]
|
|
if !tOk {
|
|
_, bOk := seats[k-2]
|
|
if bOk {
|
|
fmt.Println("# Part 2 - Missing Seat:", k-1)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
type Seat struct {
|
|
Row int
|
|
Col int
|
|
Seat int
|
|
}
|
|
|
|
func findSeatFromId(id string) (int, int, int) {
|
|
rowBeg := 0
|
|
rowEnd := 127
|
|
colBeg := 0
|
|
colEnd := 7
|
|
for k := range id {
|
|
switch id[k] {
|
|
case 'F', 'B':
|
|
rowBeg, rowEnd = findChunk(rowBeg, rowEnd, id[k] == 'F')
|
|
case 'R', 'L':
|
|
colBeg, colEnd = findChunk(colBeg, colEnd, id[k] == 'L')
|
|
}
|
|
}
|
|
|
|
return rowBeg, colBeg, (rowBeg * 8) + colBeg
|
|
}
|
|
|
|
func findChunk(beg, end int, front bool) (int, int) {
|
|
if beg == end {
|
|
return beg, beg
|
|
}
|
|
if front {
|
|
return beg, beg + (end-beg)/2
|
|
} else {
|
|
return beg + (end-beg)/2 + 1, end
|
|
}
|
|
}
|