+module Main(main) where
+
import Data.List (last, intersperse, sortBy, intercalate, isInfixOf)
import Data.List.Split (splitOn)
import Data.Char (isLetter, ord, chr)
import qualified Data.Map.Lazy as Map
-import Data.Tuple (swap)
data Room = Room { name :: String
, sector :: Int
part2 :: [Room] -> IO ()
part2 rooms = do
- print $ filter (\sn -> isInfixOf "north" (snd sn)) sectorNames
+ print $ fst $ head $ filter (\sn -> isInfixOf "north" (snd sn)) sectorNames
where
validChecksum room = (checksum room) == makeChecksum (name room)
validRooms = filter (validChecksum) rooms
parseLine :: String -> Room
parseLine line = Room {name=name, sector=sector, checksum=checksum}
where components = splitOn "-" line
- -- name = concat $ intersperse "-" $ reverse $ tail $ reverse components
name = intercalate "-" $ reverse $ tail $ reverse components
sector = read $ head $ splitOn "[" $ last components
checksum = filter (isLetter) $ last components
countedLetters :: String -> [(Char, Int)]
countedLetters name = sortBy sortCLetter $ unsortedCountedLetters name
- where unsortedCountedLetters name = Map.toList $ Map.fromListWith (+) [(c, 1) | c <- filter (isLetter) name]
+ where unsortedCountedLetters name =
+ Map.toList $ Map.fromListWith (+) [(c, 1) | c <- filter (isLetter) name]
sortCLetter :: (Char, Int) -> (Char, Int) -> Ordering
sortCLetter (l1, n1) (l2, n2)