|
@@ -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()))
|