67 lines
1006 B
Go
67 lines
1006 B
Go
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)
|
|
}
|