#! /usr/bin/env -S"ANSWER=42" nix-shell #! nix-shell -p ghcid #! nix-shell -p "haskellPackages.ghcWithPackages (p: with p; [])" #! nix-shell -i "ghcid -c 'ghci -Wall' -T main" {-# LANGUAGE OverloadedStrings #-} -- import Debug.Trace (trace) import Data.List (sort) binaryPartitionWalker :: String -> Int -> Int -> (String, Int, Int) binaryPartitionWalker ('F':s) begin end = binaryPartitionWalker s begin (((end - begin) `div` 2) + begin) binaryPartitionWalker ('B':s) begin end = binaryPartitionWalker s (((end - begin) `div` 2) + begin + 1) end binaryPartitionWalker ('L':s) begin end = binaryPartitionWalker ('F':s) begin end binaryPartitionWalker ('R':s) begin end = binaryPartitionWalker ('B':s) begin end binaryPartitionWalker "" b e = ("",b,e) binaryPartitionWalker _ _ _ = undefined seatID :: String -> Int seatID str = row * 8 + seat where (rowStr, seatStr) = splitAt 7 str (_,row,_) = binaryPartitionWalker rowStr 0 127 (_,seat,_) = binaryPartitionWalker seatStr 0 7 solvePart1 :: [String] -> Int solvePart1 = maximum . (map seatID) solvePart2 :: [String] -> Int solvePart2 = fst . head . (filter (\(x,y) -> x /= y)) . (zip [13..]) . sort . (map seatID) main :: IO () main = do putStrLn "Day 5 - Part 1" print $ seatID "FBFBBFFRLR" print $ seatID "BFFFBBFRRR" print $ seatID "FFFBBBFRRR" print $ seatID "BBFFBBFRLL" input <- lines <$> readFile "day5/input" putStrLn $ "Solution of part 1" print $ solvePart1 input putStrLn $ "Solution of part 2" print $ solvePart2 input