imclerran

Untitled

Jan 14th, 2026
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. app [main!] { pf: platform "https://github.com/lukewilliamboswell/roc-platform-template-zig/releases/download/0.6/2BfGn4M9uWJNhDVeMghGeXNVDFijMfPsmmVeo6M4QjKX.tar.zst" }
  2.  
  3. import pf.Stdout
  4.  
  5. main! = |_args| {
  6.     input =
  7.         \\two1nine
  8.         \\eightwothree
  9.         \\abcone2threexyz
  10.         \\xtwone3four
  11.         \\4nineeightseven2
  12.         \\zoneight234
  13.         \\7pqrstsixteen
  14.  
  15.     part1(input)?->Stdout.line!()
  16.  
  17.     # answer1 = part1(input)?#->debug()->debug()->debug()
  18.     # Stdout.line!(answer1)
  19.  
  20.     # answer2 = part2(input)?#->debug()->debug()->debug()
  21.     # Stdout.line!(answer2)
  22.  
  23.     Ok({})
  24. }
  25.  
  26. ## Solve part 1
  27. part1 : Str -> Try(Str, _)
  28. part1 = |s| {
  29.     s.split_on("\n")
  30.     .map(extract_digits)
  31.     ->keep_oks(compute_calibration)
  32.     # ->debug() # (1)
  33.     ->sum()
  34.     # ->debug() # (2)
  35.     .to_str()
  36.     # ->debug() # (3)
  37.     ->Ok
  38.     # ->debug() # (4)
  39. }
  40.  
  41. extract_digits : Str -> List(U64)
  42. extract_digits = |s| {
  43.     s.to_utf8()
  44.         .keep_if(|c| c >= '0' and c <= '9')
  45.         .map(|c| (c - '0').to_u64())
  46. }
  47.  
  48. compute_calibration : List(U64) -> Try(U64, _)
  49. compute_calibration = |digits| Ok(List.first(digits)? * 10 + List.last(digits)?)
  50.  
  51. ## Solve part 2
  52. part2 : Str -> Try(Str, _)
  53. part2 = |s| {
  54.     s.split_on("\n")
  55.         .map(extract_text_digits)
  56.         ->keep_oks(compute_calibration)
  57.         ->debug()
  58.         ->sum()
  59.         .to_str()
  60.         ->Ok
  61. }
  62.  
  63. extract_text_digits : Str -> List(U64)
  64. extract_text_digits = |s| {
  65.     bytes = s.to_utf8()
  66.     0.U64.to(bytes.len())
  67.         .fold(
  68.             [],
  69.             |ds, i| {
  70.                 match bytes.drop_first(i) {
  71.                     ['o', 'n', 'e', ..] => ds.append(1)
  72.                     ['t', 'w', 'o', ..] => ds.append(2)
  73.                     ['t', 'h', 'r', 'e', 'e', ..] => ds.append(3)
  74.                     ['f', 'o', 'u', 'r', ..] => ds.append(4)
  75.                     ['f', 'i', 'v', 'e', ..] => ds.append(5)
  76.                     ['s', 'i', 'x', ..] => ds.append(6)
  77.                     ['s', 'e', 'v', 'e', 'n', ..] => ds.append(7)
  78.                     ['e', 'i', 'g', 'h', 't', ..] => ds.append(8)
  79.                     ['n', 'i', 'n', 'e', ..] => ds.append(9)
  80.                     ['z', 'e', 'r', 'o', ..] => ds.append(0)
  81.                     [d, ..] => if d >= '0' and d <= '9' ds.append((d - '0').to_u64()) else ds
  82.                     [] => ds
  83.                 }
  84.             },
  85.         )
  86. }
  87.  
  88. keep_oks : List(a), (a -> Try(b, e)) -> List(b)
  89. keep_oks = |vs, f| {
  90.     vs.fold(
  91.         [],
  92.         |acc, v| {
  93.             match f(v) {
  94.                 Ok(u) => acc.append(u)
  95.                 Err(_) => acc
  96.             }
  97.         },
  98.     )
  99. }
  100.  
  101. sum : List(Num) -> Num
  102. sum = |nums| nums.fold(0, |acc, n| acc + n)
  103.  
  104. debug : a -> a
  105. debug = |v| {
  106.     dbg v
  107.     v
  108. }
  109.  
  110. range_to : Num, Num -> List(Num)
  111. range_to = |var $current, end| {
  112.     var $list = []
  113.  
  114.     while $current <= end {
  115.         $list = $list.append($current)
  116.         $current = $current + 1
  117.     }
  118.  
  119.     $list
  120. }
Advertisement
Add Comment
Please, Sign In to add comment