Browse Source

Add day four

Getty Ritter 4 years ago
parent
commit
d77093c4a3
1 changed files with 36 additions and 0 deletions
  1. 36 0
      04/main.pony

+ 36 - 0
04/main.pony

@@ -0,0 +1,36 @@
+use "collections"
+use "format"
+use "itertools"
+
+primitive Password
+  fun is_valid_pt1(pass: U64): Bool =>
+    let digits: String box = Format.int[U64](pass)
+    var pairwise = Array[(U8, U8)]()
+    Iter[U8](digits.values()).zip[U8](Iter[U8](digits.values()).skip(1)).collect(pairwise)
+    let two_adjacent = Iter[(U8, U8)](pairwise.values()).any({(tup) => (let l, let r) = tup; l == r})
+    let increasing = Iter[(U8, U8)](pairwise.values()).all({(tup) => (let l, let r) = tup; l <= r})
+    (digits.size() == 6) and two_adjacent and increasing
+
+  fun is_valid_pt2(pass: U64, env: Env): Bool =>
+    let digits: String box = Format.int[U64](pass)
+    let increasing = Iter[U8](digits.values()).zip[U8](Iter[U8](digits.values()).skip(1)).all({(tup) => (let l, let r) = tup; l <= r})
+    var last: U8 = 0
+    var this_run: U8 = 0
+    var runs = Array[U8]()
+    for d in digits.values() do
+      if d == last then
+        this_run = this_run + 1
+      else
+        runs.push(this_run)
+        this_run = 0
+      end
+      last = d
+    end
+    runs.push(this_run)
+    let only_one_double = Iter[U8](runs.values()).filter({(n) => n == 1}).count() >= 1
+    (digits.size() == 6) and increasing and only_one_double
+
+actor Main
+  new create(env: Env) =>
+    let valids = Iter[U64](Range[U64](240298, 784956)).filter({(n) => Password.is_valid_pt2(n, env)})
+    env.out.print("Valid passwords: " + Format.int[USize](valids.count()))