Skip to content

Commit d92f7fa

Browse files
committed
36
1 parent 9d7e564 commit d92f7fa

File tree

1 file changed

+44
-3
lines changed

1 file changed

+44
-3
lines changed

HumanEvalLean/HumanEval36.lean

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,48 @@
11
module
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

Comments
 (0)