package main
import (
"bufio"
"log"
"os"
"sort"
)
type Seat struct {
row int
col int
}
func main() {
if err := realMain(); err != nil {
log.Println(err)
}
}
func realMain() error {
data, err := parseInput()
if err != nil {
return err
}
tickets := parseTickets(data)
var max int
ids := make([]int, len(tickets))
for i, tck := range tickets {
ids[i] = tck.row*8 + tck.col
if ids[i] > max {
max = ids[i]
}
}
log.Println(max)
sort.Ints(ids)
for i, seat := range ids {
if seat != i+99 {
log.Println("MISSING:", seat-1)
break
}
}
return nil
}
func parseTickets(data []string) []Seat {
tickets := make([]Seat, len(data))
for tn, d := range data {
// calculate row
min, max := 0, 127
for i := 0; i < 7; i++ {
switch d[i] {
case 'B':
min += (max-min)/2 + 1
case 'F':
max -= (max-min)/2 + 1
}
// log.Println(min, max)
}
tickets[tn].row = min
// calculate col
min, max = 0, 7
for i := 7; i < 10; i++ {
switch d[i] {
case 'R':
min += (max-min)/2 + 1
case 'L':
max -= (max-min)/2 + 1
}
// log.Println(min, max)
}
tickets[tn].col = min
}
return tickets
}
func parseInput() ([]string, error) {
fd, err := os.Open("input.txt")
if err != nil {
return nil, err
}
defer fd.Close()
var ret []string
buf := bufio.NewScanner(fd)
for buf.Scan() {
ret = append(ret, buf.Text())
}
return ret, nil
}