@@ -3,13 +3,22 @@ import Fad.Chapter1
33
44namespace Assignment03
55
6- def compress (s : String) : List (Nat × Nat) := sorry
7-
8- /-
9- #eval compress "1333332222211" -- returns [(1, 1), (3, 5), (2, 5), (1, 2)]
10- -/
11-
12- def uncompress : List (Nat × Nat) → String := sorry
6+ def compress (s : String) : List (Nat × Nat) :=
7+ help (s.toList.map (·.toNat - '0' .toNat)) []
8+ where
9+ help : List Nat → List (Nat × Nat) → List (Nat × Nat)
10+ | [] , acc => acc.reverse
11+ | x :: xs, [] => help xs [(x, 1 )]
12+ | x :: xs, p :: acc =>
13+ if x = p.1
14+ then help xs ((p.1 , p.2 + 1 ) :: acc)
15+ else help xs ((x, 1 ) :: p :: acc)
16+
17+ -- #eval compress "1333332222211" -- returns [(1, 1), (3, 5), (2, 5), (1, 2)]
18+
19+ def uncompress : List (Nat × Nat) → String :=
20+ let h (xs : List Nat) := xs.foldr (λ a r => s! "{ a}{ r} " ) ""
21+ List.foldr (λ p r => h (List.replicate p.2 p.1 ) ++ r) ""
1322
1423/-
1524#eval uncompress [(1, 1), (3, 5), (2, 5), (1, 2)] -- returns "1333332222211"
@@ -28,12 +37,6 @@ def SymList.reverse : SymList a → SymList a
2837
2938#eval List.toSL [1 ,2 ,3 ] |>.reverse |>.fromSL
3039
31- /- qual a complexidade de SymList.reverse? -/
32-
33- def answer₁ := "O(???)"
34-
35- /- tente completar a prova -/
36-
3740example : ∀ sl : SymList a,
3841 List.reverse sl.fromSL = sl.reverse.fromSL := sorry
3942
@@ -44,25 +47,19 @@ da frente e as funções no elemento de trás, poderíamos definir as
4447funções no elemento de trás em termos de reverse e das funções
4548correspondentes no elemento da frente.
4649
47- Defina `init` como uma expressão usando outras funções sobre SymList
48- sem recorrer as sublistas?
50+ Defina `init` como uma expressão usando `tailSL` e `SymList.reverse`?
4951-/
5052
51- def SymList.init (q : SymList a) : SymList a := sorry
53+ def SymList.init (q : SymList a) : SymList a :=
54+ q.reverse.tailSL.reverse
5255
5356-- #eval [ 1,2,3 ] .toSL |>.init |>.fromSL -- returns [ 1,2 ]
5457
55-
56- /- qual a complexidade de SymList.init? -/
57-
58- def answer₂ := "O(???)"
59-
6058def List.init {α : Type } : List α → List α
6159 | [] => []
6260 | [_] => []
6361 | x :: xs => x :: init xs
6462
65-
6663/- agora tente completar a prova seguinte -/
6764
6865example : ∀ sl : SymList a,
0 commit comments