-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathHumanEval47.lean
More file actions
88 lines (63 loc) · 2.14 KB
/
HumanEval47.lean
File metadata and controls
88 lines (63 loc) · 2.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
module
/-! ## Implementation -/
public section
def median (xs : Array Int) (h : xs ≠ #[]) : Rat :=
let sorted := xs.mergeSort
have : 0 < sorted.size := by grind [Array.size_mergeSort]
if xs.size % 2 = 1 then
sorted[sorted.size / 2]
else
(sorted[sorted.size / 2 - 1] + sorted[sorted.size / 2] : Rat) / 2
/-! ## Tests -/
example : median #[3, 1, 2, 4, 5] (by decide) = 3 := by native_decide
example : median #[-10, 4, 6, 1000, 10, 20] (by decide) = 8 := by native_decide
example : median #[5] (by decide) = 5 := by native_decide
example : median #[6, 5] (by decide) = 11/2 := by native_decide
example : median #[8, 1, 3, 9, 9, 2, 7] (by decide) = 7 := by native_decide
/-! ## Verification -/
theorem median_eq_getElem_of_odd {xs : Array Int} {h} (h' : xs.size % 2 = 1) :
median xs h = xs.mergeSort[xs.size / 2]'(by grind [Array.size_mergeSort]) := by
grind [median, Array.size_mergeSort]
theorem two_mul_median_of_even {xs : Array Int} {h} (h' : xs.size % 2 = 0) :
2 * median xs h =
xs.mergeSort[xs.size / 2 - 1]'(by grind [Array.size_mergeSort]) +
xs.mergeSort[xs.size / 2]'(by grind [Array.size_mergeSort]) := by
grind [median, Array.size_mergeSort]
/-!
### MergeSort properties
The following two library lemmas show that `Array.mergeSort` correctly sorts an array.
-/
example {xs : Array Int} : xs.mergeSort.toList.Pairwise (· ≤ ·) := by
grind [Array.pairwise_mergeSort]
example {xs : Array Int} : xs.mergeSort.Perm xs := by
grind [Array.mergeSort_perm, Array.Perm]
/-!
## Prompt
```python3
def median(l: list):
"""Return median of elements in the list l.
>>> median([3, 1, 2, 4, 5])
3
>>> median([-10, 4, 6, 1000, 10, 20])
15.0
"""
```
## Canonical solution
```python3
l = sorted(l)
if len(l) % 2 == 1:
return l[len(l) // 2]
else:
return (l[len(l) // 2 - 1] + l[len(l) // 2]) / 2.0
```
## Tests
```python3
METADATA = {}
def check(candidate):
assert candidate([3, 1, 2, 4, 5]) == 3
assert candidate([-10, 4, 6, 1000, 10, 20]) == 8.0
assert candidate([5]) == 5
assert candidate([6, 5]) == 5.5
assert candidate([8, 1, 3, 9, 9, 2, 7]) == 7
```
-/