Kodutöö 3
Listikomprehensioon
Konspekt
Lisalugemine (vabatahtlik):
lõik Idris2 tutorialis:
Praktikumi ja kodutöö ülesanded
1. Vabade muutujate leidmine
Leia termidest vabad muutujad!
- {$ \text{FV}(\lambda{}f.\ (\lambda{}g.\ g\ x)\ (\lambda{}x.\ f\ x))$}
- {$ \text{FV}((\lambda{}x.\ (\lambda{}g.\ g\ x))\ x)$}
- {$ \text{FV}(\lambda{}g.\ (\lambda{}f.\ f\ x)\ (\lambda{}x.\ g\ x))$}
- {$ \text{FV}((\lambda{}y.\ y)\ (\lambda{}f\ x.\ y\ x)\ (\lambda{}x.\ g\ x))$}
- {$ \text{FV}(z\ \lambda{}h\ x.\ (\lambda{}f.\ h\ f)\ x)$}
2. Substitutsioon
Leia substitutsiooni tulemus!
- {$ (\lambda{}f.\ f\ y(\lambda{} x. x))[y \to \lambda{}x\ y.\ f\ x] $}
- {$ (\lambda{}x.\ f\ (x\ x))(\lambda{}x.\ f\ (x\ x))[f\to \lambda{}x\ y.\ y] $}
- {$ (\lambda{}x\ g\ y. x\ g\ y)[g\to x\ g\ y] $}
3. Väikesed, seitsmega jaguvad arvud
Kasutades listikomprehensiooni, leia kõik naturaalarvud mis on väiksemad kui 1000 ja jaguvad seitsmega. Mitu neid on?
mod7 : List Int mod7 = ?rhs_mod7
Näide:
Main> length mod7 143
4. tähtede loendamine sõnes
Kasutades listikomprehensiooni, kirjuta funktsioon mis loendab etteantud sõnes esimese parameetrina antud tähe leidumiste arvu. Vihje: funktsioon unpack
teisendab sõne tähtede listiks.
count : Char -> String -> Nat count c s = ?rhs_count
näiteks:
Main> count 's' "Mississippi" 4
5. listide lamendamine
Kasutades listikomprehensiooni, kirjuta funktsioon mis teisendab listide listid listideks hoides alles kõik elemendid samas järjekorras.
concat' : List (List a) -> List a concat' xss = ?rhs_concat
näiteks:
Main> concat' [ [1,2,3], [4,5], [6], [] ] [1, 2, 3, 4, 5, 6]
6. arvu faktorid
Kasutades listikomprehensiooni, kirjuta funktsioon mis leiab parameetrina antud arvu n
täisarvulised faktorid s.t. arvud, millega n
-i jagades ei teki jääki.
factors : Int -> List Int factors n = ?rhs_factors
näiteks:
Main> factors 15 [1, 3, 5, 15] Main> factors 18 [1, 2, 3, 6, 9, 18]
7. väikeste algarvude leidmine
Algarvud on täisarvud, mille faktoriteks on üks ja arv ise.
isPrime : Int -> Bool isPrime n = factors n == [1,n]
Kasutades listikomprehensiooni, kirjuta funktsioon mis leiab parameetrina antud arvust n
kõik väiksemad algarvud.
primes : Int -> List Int primes n = ?rhs_primes
näiteks:
Main> primes 14 [2, 3, 5, 7, 11, 13]
8. Funktsioon zip'
Kirjuta lihtrekursiivne funktsioon, mis teisendab listide paarid paaride listiks.
zip' : List a -> List b -> List (a,b) zip' = ?rhs_zip
näiteks:
Main> zip' [] [1,2,3] [] Main> zip' [1,2,3] ['a', 'b', 'c', 'd'] [(1, 'a'), (2, 'b'), (3, 'c')]
9. järjestikuste elementide paarid
Kasutades funktsiooni zip'
, kirjuta funktsioon mis leiab parameetrina antud listist kõik järjestikuste elementide paarid.
pairs : List a -> List (a,a) pairs xs = ?rhs_pairs
näiteks:
Main> pairs [1..6] [(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
10. Funktsioon and'
Kirjuta lihtrekursiivne funktsioon, mis kontrollib kas kõik listis olevad väärused on tõesed.
and' : List Bool -> Bool and' = ?rhs_and
näiteks:
Main> and' [True, True, True] True Main> and' [True, True, False] False
11. sorteerituse kontrollimine
Kasutades listikomprehensiooni ja eelnevalt defineeritud abifunktsiooni and'
ning pairs
, et kontrollida, kas parameetrina antud list on sorteeritud -- elemendid mittekahanevas järjekorras .
sorted : List Int -> Bool sorted = ?rhs_sorted
näiteks:
Main> sorted [1..10] True Main> sorted [1,2,4,3] False Main> sorted [3,2,1] False
12. Pythagorase kolmikud
Positiivsete täisarvude kolmik {$(a,b,c)$} on Pythagorase kolmik, kui kehtib võrdus {$a^2+b^2=c^2$}.
Kasutades listikomprehensiooni, leia kõik Pythagorase kolmikud, mille komponendid on võrdsed või väiksemad kui etteantud parameeter.
pyths : Int -> List (Int,Int,Int) pyths n = ?rhs_pyths
näiteks:
Main> pyths 10 [(4, (3, 5)), (3, (4, 5)), (8, (6, 10)), (6, (8, 10))]
13. Täiuslikud arvud
Täisarv {$n$} on täiuslik kui kõik tema täisarvuliste faktorite (v.a. arv ise) summa on arv {$n$}. Näiteks 6 saab jagada kolmega, kahega ja ühega ning 3+2+1=6.
Kasutades listikomprehensiooni, leia kõik täiuslikud arvud, mis on võrdsed või väiksemad kui etteantud parameeter.
perfects : Int -> List Int perfects n = ?rhs_perfects
näiteks:
Main> perfects 30 [6, 28]
Tärnülesanded
Optimeeritud Pythagorase kolmikud
Optimeeri Pythagorase kolmikute ülesande lahendust selliselt, et arvutatakse vaid kolmikud {$(a,b,c)$} kus {$a<b$}. Pane tähele, et lisakontrolli lisamine pole optimieerimine -- see teeb lahenduse ju aeglasemaks. Mõelge, kuidas saaks piirata proovitavate kolmikute arvu.
näiteks:
Main> pythsOpt 10 [(3, (4, 5)), (6, (8, 10))]