module Aoc.Day3 (solve, halve, shared, charToInt) where

import Data.Char
import qualified Data.Set as Set
import Data.List.Split (chunksOf)

halve :: String -> [String]
halve xs = [front, back]
  where
    midpoint = length xs `div` 2

    front = take midpoint xs
    back  = drop midpoint xs

shared :: [String] -> String
shared xs = Set.toList $ foldr1 Set.intersection $ map Set.fromList xs

charToInt :: Char -> Int
charToInt c
  | 'a' <= c && c <= 'z' = ord c - ord 'a' + 1
  | 'A' <= c && c <= 'Z' = ord c - ord 'A' + 27
  | otherwise            = -1

solve :: Integer -> String -> String
solve 1 input = show $ sum $ map (toInteger . charToInt . head . shared . halve) $ lines input

solve 2 input = show $ sum $ map (toInteger . charToInt . head . shared) $ chunksOf 3 $ lines input

solve _ _ = "?"