package main import ( "bufio" "io" "log" "math" "os" "strings" ) type Seat string func half(chain string, size int, lower rune, upper rune) int { rowPart := chain[0:int(math.Log2(float64(size)))] half := size / 2 row := 0 for _, c := range rowPart { switch c { case lower: case upper: row += half default: panic("wrong letter") } half /= 2 } return row } func (s Seat) Row() int { return half(string(s[0:7]), 128, 'F', 'B') } func (s Seat) Col() int { return half(string(s[7:10]), 8, 'L', 'R') } func (s Seat) ID() int { return (s.Row() * 8) + s.Col() } func main() { highestSeatID := 0 f, err := os.Open("input") if err != nil { panic(err) } r := bufio.NewReader(f) for { line, err := r.ReadString('\n') if err == io.EOF { break } if err != nil { panic(err) } line = strings.TrimSpace(line) seat := Seat(line) id := seat.ID() if id > highestSeatID { highestSeatID = id } } log.Printf("Highest seat ID is %d", highestSeatID) }