/ 2025 / 2 / p1.tri
p1.tri
 1  import "trilogy:debug" use dbg
 2  import "trilogy:io" use readline
 3  import "trilogy:core" use to_string
 4  import "trilogy:parsec" use apply, parse, sep_by, integer, char
 5  import "trilogy:string" use length, take, skip
 6  import "trilogy:iterator" as it
 7  
 8  proc range!() {
 9    let low = apply integer
10    apply <| char '-'
11    let high = apply integer
12    return low:high
13  }
14  
15  func is_invalid str =
16    length str % 2 == 0
17    && take (length str // 2) str == skip (length str // 2) str
18  
19  proc main!() {
20    let ranges = parse (sep_by (char ',') range) readline!()
21    let mut total = 0
22    for low:high in ranges {
23      total += it::range low high
24        |> it::filter (is_invalid << to_string)
25        |> it::sum
26    }
27    dbg!(total)
28  }