66
77public section
88
9+ /-! ## Implementation -/
10+
911def frequencies (xs : List Nat) : TreeMap Nat Nat (fun a b => compare b a) :=
1012 xs.foldl (init := ∅) (fun freq (x : Nat) => freq.alter x (fun v? => some (v?.getD 0 + 1 )))
1113
@@ -17,7 +19,35 @@ def search (xs : List Nat) : Int :=
1719 |>.first?
1820 kv.getD (-1 )
1921
20- -- missing api
22+ /-! ## Tests -/
23+
24+ example : search [5 , 5 , 5 , 5 , 1 ] = 1 := by native_decide
25+ example : search [4 , 1 , 4 , 1 , 4 , 4 ] = 4 := by native_decide
26+ example : search [3 , 3 ] = -1 := by native_decide
27+ example : search [8 , 8 , 8 , 8 , 8 , 8 , 8 , 8 ] = 8 := by native_decide
28+ example : search [2 , 3 , 3 , 2 , 2 ] = 2 := by native_decide
29+ example : search [2 , 7 , 8 , 8 , 4 , 8 , 7 , 3 , 9 , 6 , 5 , 10 , 4 , 3 , 6 , 7 , 1 , 7 , 4 , 10 , 8 , 1 ] = 1 := by native_decide
30+ example : search [3 , 2 , 8 , 2 ] = 2 := by native_decide
31+ example : search [6 , 7 , 1 , 8 , 8 , 10 , 5 , 8 , 5 , 3 , 10 ] = 1 := by native_decide
32+ example : search [8 , 8 , 3 , 6 , 5 , 6 , 4 ] = -1 := by native_decide
33+ example : search [6 , 9 , 6 , 7 , 1 , 4 , 7 , 1 , 8 , 8 , 9 , 8 , 10 , 10 , 8 , 4 , 10 , 4 , 10 , 1 , 2 , 9 , 5 , 7 , 9 ] = 1 := by native_decide
34+ example : search [1 , 9 , 10 , 1 , 3 ] = 1 := by native_decide
35+ example : search [6 , 9 , 7 , 5 , 8 , 7 , 5 , 3 , 7 , 5 , 10 , 10 , 3 , 6 , 10 , 2 , 8 , 6 , 5 , 4 , 9 , 5 , 3 , 10 ] = 5 := by native_decide
36+ example : search [1 ] = 1 := by native_decide
37+ example : search [8 , 8 , 10 , 6 , 4 , 3 , 5 , 8 , 2 , 4 , 2 , 8 , 4 , 6 , 10 , 4 , 2 , 1 , 10 , 2 , 1 , 1 , 5 ] = 4 := by native_decide
38+ example : search [2 , 10 , 4 , 8 , 2 , 10 , 5 , 1 , 2 , 9 , 5 , 5 , 6 , 3 , 8 , 6 , 4 , 10 ] = 2 := by native_decide
39+ example : search [1 , 6 , 10 , 1 , 6 , 9 , 10 , 8 , 6 , 8 , 7 , 3 ] = 1 := by native_decide
40+ example : search [9 , 2 , 4 , 1 , 5 , 1 , 5 , 2 , 5 , 7 , 7 , 7 , 3 , 10 , 1 , 5 , 4 , 2 , 8 , 4 , 1 , 9 , 10 , 7 , 10 , 2 , 8 , 10 , 9 , 4 ] = 4 := by native_decide
41+ example : search [2 , 6 , 4 , 2 , 8 , 7 , 5 , 6 , 4 , 10 , 4 , 6 , 3 , 7 , 8 , 8 , 3 , 1 , 4 , 2 , 2 , 10 , 7 ] = 4 := by native_decide
42+ example : search [9 , 8 , 6 , 10 , 2 , 6 , 10 , 2 , 7 , 8 , 10 , 3 , 8 , 2 , 6 , 2 , 3 , 1 ] = 2 := by native_decide
43+ example : search [5 , 5 , 3 , 9 , 5 , 6 , 3 , 2 , 8 , 5 , 6 , 10 , 10 , 6 , 8 , 4 , 10 , 7 , 7 , 10 , 8 ] = -1 := by native_decide
44+ example : search [10 ] = -1 := by native_decide
45+ example : search [9 , 7 , 7 , 2 , 4 , 7 , 2 , 10 , 9 , 7 , 5 , 7 , 2 ] = 2 := by native_decide
46+ example : search [5 , 4 , 10 , 2 , 1 , 1 , 10 , 3 , 6 , 1 , 8 ] = 1 := by native_decide
47+ example : search [7 , 9 , 9 , 9 , 3 , 4 , 1 , 5 , 9 , 1 , 2 , 1 , 1 , 10 , 7 , 5 , 6 , 7 , 6 , 7 , 7 , 6 ] = 1 := by native_decide
48+ example : search [3 , 10 , 10 , 9 , 2 ] = -1 := by native_decide
49+
50+ /-! ## Missing API -/
2151
2252@ [simp, grind =]
2353theorem Std.Iter.first?_toList {α β : Type w} [Iterator α Id β] [IteratorLoop α Id Id]
@@ -61,7 +91,7 @@ theorem Option.getD_map_eq_elim {o : Option α} {f : α → β} {fallback : β}
6191 (o.map f).getD fallback = o.elim fallback f := by
6292 cases o <;> simp
6393
64- -- verification
94+ /-! ## Verification -/
6595
6696theorem getElem?_frequencies {k : Nat} :
6797 (frequencies xs)[k]? = (some (xs.count k)).filter (0 < ·) := by
@@ -78,7 +108,11 @@ theorem mem_frequencies :
78108 simp
79109
80110theorem search_eq_getD_find? :
81- search xs = (frequencies xs |>.toList.find? (fun x => 0 < x.1 ∧ x.1 ≤ xs.count x.1 ) |>.map (↑·.fst) |>.getD (-1 : Int)) := by
111+ search xs =
112+ (frequencies xs
113+ |>.toList.find? (fun x => 0 < x.1 ∧ x.1 ≤ xs.count x.1 )
114+ |>.map (↑·.fst)
115+ |>.getD (-1 : Int)) := by
82116 simp only [search, ← Iter.first?_toList, Iter.toList_map, Iter.toList_filter,
83117 TreeMap.toList_iter, List.head?_map]
84118 grind [List.find?_eq_find?, getElem?_frequencies]
0 commit comments