11module
2+ import Std
3+
4+ def fizzBuzz (n : Nat) : Nat :=
5+ (0 ...n).iter
6+ |>.filter (fun i => i % 11 == 0 || i % 13 == 0 )
7+ |>.map (fun i => i.repr.chars.filter (· == '7' ) |>.length)
8+ |>.fold (init := 0 ) (· + ·)
9+
10+ example : fizzBuzz 50 = 0 := by native_decide
11+ example : fizzBuzz 78 = 2 := by native_decide
12+ example : fizzBuzz 79 = 3 := by native_decide
13+ example : fizzBuzz 100 = 3 := by native_decide
14+ example : fizzBuzz 200 = 6 := by native_decide
15+ example : fizzBuzz 4000 = 192 := by native_decide
16+ example : fizzBuzz 10000 = 639 := by native_decide
17+ example : fizzBuzz 100000 = 8026 := by native_decide
18+
19+ def count7s (n : Nat) : Nat :=
20+ let last := if n % 10 = 7 then 1 else 0
21+ if n < 10 then last else count7s (n / 10 ) + last
22+
23+ theorem count7s_eq {n : Nat} : count7s n = ((Nat.toDigits 10 n).filter (· == '7' )).length := by
24+ fun_induction count7s with
25+ | case1 n l h =>
26+ subst l
27+ simp only [Nat.mod_eq_of_lt h, dite_eq_ite, ↓Char.isValue, Nat.toDigits_of_lt_base h,
28+ List.filter_cons, beq_iff_eq, Nat.digitChar_eq_seven, List.filter_nil]
29+ split <;> simp
30+ | case2 n l h ih =>
31+ subst l
32+ simp only [ih, ↓Char.isValue, dite_eq_ite]
33+ conv => rhs; rw [← Nat.div_add_mod (m := n) (n := 10 )]
34+ rw [← Nat.toDigits_append_toDigits (by decide) (by simp; omega) (Nat.mod_lt _ (by decide))]
35+ simp [Nat.toDigits_of_lt_base (Nat.mod_lt _ (y := 10 ) (by decide)), List.filter_cons,
36+ apply_ite List.length]
37+
38+ theorem fizzBuzz_eq {n : Nat} :
39+ fizzBuzz n = (((0 ...n).toList.filter (fun i => i % 11 == 0 || i % 13 == 0 )).map count7s).sum := by
40+ simp only [fizzBuzz, ne_eq, ↓Char.isValue, ← Std.Iter.foldl_toList, Std.Iter.toList_map,
41+ Std.Iter.toList_filter, Std.Rco.toList_iter, List.sum_eq_foldl]
42+ congr
43+ ext n
44+ simp [count7s_eq, ← Std.Iter.length_toList_eq_length]
245
3- def fizz_buzz : Unit :=
4- ()
546
647/-!
748## Prompt
@@ -53,4 +94,4 @@ def check(candidate):
5394 assert candidate(100000) == 8026
5495
5596```
56- -/
97+ -/
0 commit comments