/ 2025 / 2 / p2.tri
p2.tri
 1  import "trilogy:debug" use dbg
 2  import "trilogy:io" use readline
 3  import "trilogy:core" use to_string, to_array
 4  import "trilogy:parsec" use apply, parse, sep_by, integer, char
 5  import "trilogy:array" use length, take, chunks
 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 arr =
16    it::range 1 (length arr // 2)
17    |> it::any (fn n.
18      it::all ((==) (take n arr))
19        <| it::from
20        <| chunks n arr
21    )
22  
23  proc main!() {
24    let ranges = parse (sep_by (char ',') range) readline!()
25    let mut total = 0
26    for low:high in ranges {
27      total += it::range low high
28        |> it::filter (is_invalid << to_array << to_string)
29        |> it::sum
30    }
31    dbg!(total)
32  }