diff --git a/contents/booklogs/2024.yaml b/contents/booklogs/2024.yaml index 3f4d71e..12cdc69 100644 --- a/contents/booklogs/2024.yaml +++ b/contents/booklogs/2024.yaml @@ -52,7 +52,7 @@ - date: 2024-08-01 bookTitle: A book readCount: 2 - pages: 1 ~ 20 + pages: i ~ xix, 1 ~ 20 notes: | read again. - date: 2024-09-01 @@ -73,7 +73,7 @@ pages: 81 ~ 99 - date: 2024-11-30 bookTitle: C book - pages: 1 ~ 12 + pages: i ~ viii, 1 ~ 12 - date: 2024-12-01 bookTitle: C book pages: 13 ~ 20 diff --git a/src/Booklog.fs b/src/Booklog.fs index 9177860..cafe772 100644 --- a/src/Booklog.fs +++ b/src/Booklog.fs @@ -146,12 +146,41 @@ module Misc = | true, int -> Some int | _ -> None - let readPages (pages: string) = - pages.Split([| '~' |]) + let private romanMap = Map [ ('i', 1); ('v', 5); ('x', 10) ] + + let private toInt x = + x + |> Char.ToLower + |> romanMap.TryFind |> function + | Some v -> v + | None -> 0 + + let private romanToArabic (roman: string) = + let roman = roman |> _.Trim() + + roman + |> Seq.map toInt + |> Seq.pairwise + |> Seq.fold (fun acc (v1, v2) -> if v1 < v2 then acc - v1 else acc + v1) 0 + |> (+) (Seq.last roman |> toInt) + + let private (|Roman|_|) (str: string) = + match romanToArabic str with + | 0 -> None + | i -> Some i + + let readPages (pages: string) = + pages + |> _.Split([| ',' |]) + |> Seq.map _.Split([| '~' |]) + |> Seq.map (function | [| Int s; Int e |] -> e - s + 1 | [| Int _ |] -> 1 - | _ -> 0 + | [| Roman s; Roman e |] -> e - s + 1 + | [| Roman _ |] -> 1 + | _ -> 0) + |> Seq.sum let private getMaxPagesRead (booklogs: Booklog list) = booklogs |> List.map (_.pages >> readPages) |> List.max