dayResults :: FilePath -> Map ModuleName [AnswerStr] -> DayPrefix -> [ExecResult] -> IO ()
dayResults answersPath mod2answers dayP results = do
    printf "%-21s | %s %s\n"
        (intercalate ", " $ results <&> output)
        (intercalate " | " $ results <&> \ExecResult{msReal, bytesAllocated, bytesPeak, bytesMaxInUse} ->
            printf "%5dms %6s %6s %6s"
                msReal
                (maybe "?" size2humanSize bytesAllocated)
                (maybe "?" size2humanSize bytesPeak)
                (maybe "?" size2humanSize bytesMaxInUse))
        (case M.lookup (dayPrefixToModuleName dayP) mod2answers of
            Nothing -> " <-- couldn't find entry " ++ show dayP ++ " in " ++ show answersPath
            Just expected ->
                if expected /= (results <&> output)
                    then " <-- expected: " ++ intercalate ", " expected
                    else "")
dayResults :: FilePath -> Map ModuleName [AnswerStr] -> DayPrefix -> [ExecResult] -> IO ()
dayResults answersPath mod2answers dayP results = do
    printf "%-21s | %s %s\n"
        (intercalate ", " $ results <&> output)
        (intercalate " | " $ results <&> \ExecResult{msReal, bytesAllocated, bytesPeak, bytesMaxInUse} ->
            printf "%5dms %6s %6s %6s"
                msReal
                (maybe "?" size2humanSize bytesAllocated)
                (maybe "?" size2humanSize bytesPeak)
                (maybe "?" size2humanSize bytesMaxInUse))
        (case M.lookup (dayPrefixToModuleName dayP) mod2answers of
            Nothing -> " <-- couldn't find entry " ++ show dayP ++ " in " ++ show answersPath
            Just expected ->
                if expected /= (results <&> output)
                    then " <-- expected: " ++ intercalate ", " expected
                    else "")
dayResults answersPath mod2answers dayP results = do
    printf "%-21s | %s %s\n"
        (intercalate ", " $ results <&> output)
        (intercalate " | " $ results <&> \ExecResult{msReal, bytesAllocated, bytesPeak, bytesMaxInUse} ->
            printf "%5dms %6s %6s %6s"
                msReal
                (maybe "?" size2humanSize bytesAllocated)
                (maybe "?" size2humanSize bytesPeak)
                (maybe "?" size2humanSize bytesMaxInUse))
        (case M.lookup (dayPrefixToModuleName dayP) mod2answers of
            Nothing -> " <-- couldn't find entry " ++ show dayP ++ " in " ++ show answersPath
            Just expected ->
                if expected /= (results <&> output)
                    then " <-- expected: " ++ intercalate ", " expected
                    else "")