module Day5 (BoardingPass(BoardingPass), seatId) where data BoardingPass = BoardingPass { row :: Int, column :: Int } deriving (Show) binaryStringToInt b = binaryStringToInt' (reverse b) 0 0 where binaryStringToInt' [] _ acc = acc binaryStringToInt' ('1':bs) m acc = binaryStringToInt' bs (m+1) (acc + 2^m) binaryStringToInt' ('0':bs) m acc = binaryStringToInt' bs (m+1) acc charToBinaryDigit 'F' = '0' charToBinaryDigit 'L' = '0' charToBinaryDigit 'B' = '1' charToBinaryDigit 'R' = '1' stringToInt = binaryStringToInt . map charToBinaryDigit readBoardingPass str = let (str', rest) = splitAt 10 str (rowS, colS) = splitAt 7 str' in (BoardingPass (stringToInt rowS) (stringToInt colS), rest) instance Read BoardingPass where readsPrec _ str = [readBoardingPass str] seatId (BoardingPass row column) = row * 8 + column