Advertisement
baratiistok3

f_hw_1

Apr 5th, 2020
3,000
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 8.10 KB | None | 0 0
  1. // Learn more about F# at http://fsharp.org
  2.  
  3. open System
  4. open System.Collections.Generic
  5. // 1)
  6. let IsEven a =
  7.     a%2=0
  8.  
  9.  
  10.  
  11. // 2)
  12. let FindEvenNumbers a =
  13.     let evenOnlyList = List.filter(IsEven) a
  14.     evenOnlyList
  15.  
  16.  
  17. // 3)
  18. let first100EvenNumberSum =
  19.     let nums = FindEvenNumbers [1..200]
  20.     List.sum nums
  21.  
  22. // 4)
  23. let IsOdd a =
  24.     a%2=1
  25.  
  26. let FindOddNumbers a =
  27.     let oddOnlyList = List.filter(IsOdd) a
  28.     oddOnlyList
  29.  
  30. let differenceOfSquares a =
  31.     let odds = FindOddNumbers a
  32.     let evens = FindEvenNumbers a
  33.     let oddSqure = List.map(fun x -> x*x) odds
  34.     let evenSquare = List.map(fun x -> x*x) evens
  35.     let diff = List.sum(oddSqure) - List.sum(evenSquare)
  36.     printfn "%d" diff
  37.  
  38.  // 5)
  39. let everyOtherChar a:List<char>=
  40.     let list = Seq.toList a
  41.     let ret = new List<char>()
  42.     for i in [0..2..list.Length] do
  43.         ret.Add(list.[i])
  44.     ret
  45.    
  46.  
  47. // 6)
  48. let delItem (a : List<int>) (b:int) =
  49.     a.Remove(b)
  50.     ()
  51.  
  52. let FindAllPrimesUpTo n=
  53.     let nums = [2..n]
  54.     let numbers = new List<int>()
  55.     List.iter ( fun x -> numbers.Add(x)) nums
  56.     let primes = new List<int>()
  57.     while numbers.Count > 0 do
  58.         let prime = numbers.[0]
  59.         primes.Add prime
  60.         numbers.Remove(prime)
  61.         let nums = [prime..prime..n]
  62.         List.iter(fun x-> delItem numbers x) nums
  63.     List.ofSeq(primes);
  64.  
  65.  
  66. // 7)
  67. let SumPrimeDifferencesUpTo n =
  68.     let primes = FindAllPrimesUpTo 1000
  69.     let h = primes.[..primes.Length-2]
  70.     let t = primes.Tail
  71.     let pairs = List.zip h t
  72.     let ret = List.sumBy(fun x -> snd x - fst x) pairs
  73.     ret
  74.  
  75. // 8)
  76. let FindNthPrime n=
  77.     let max = 10000
  78.     let nums = [2..max]
  79.     let numbers = new List<int>()
  80.     List.iter ( fun x -> numbers.Add(x)) nums
  81.     let mutable prime = 0;
  82.     for i in [1..n] do
  83.         let p = numbers.[0]
  84.         let _ = numbers.Remove(p)
  85.         let nums = [p..p..max]
  86.         List.iter(fun x-> delItem numbers x) nums
  87.         prime <- p        
  88.     prime
  89.  
  90. // 9)
  91. type Gender =
  92.     | Male
  93.     | Female
  94. type Person =
  95.     {
  96.         FirstName: string
  97.         LastName: string
  98.         Age: int
  99.         Gender: Gender
  100.     }
  101.  
  102. let p1 = {FirstName="Fname1";LastName = "Lastname1"; Age = 10; Gender=Male}
  103. let p2 = {FirstName="Fname2";LastName = "Lastname2"; Age = 20; Gender=Female}
  104. let p3 = {FirstName="Fname3";LastName = "Lastname3"; Age = 30; Gender=Male}
  105. let p4 = {FirstName="Fname4";LastName = "Lastname4"; Age = 50; Gender=Male}
  106. let p5 = {FirstName="Fname5";LastName = "Lastname5"; Age = 40; Gender=Male}
  107. let p6 = {FirstName="Fname6";LastName = "Lastname6"; Age = 30; Gender=Male}
  108.  
  109. let people = [p1;p2;p3;p4;p5;p6]
  110.  
  111.  
  112. let SumOfAllPeoplesAge p=
  113.     List.sumBy(fun x -> x.Age) p
  114.    
  115. // 10)
  116. let FindPeopleAbove p n=
  117.     List.filter(fun x -> x.Age > n) p
  118.  
  119. // 11)
  120. let FindAverageAge p =
  121.     List.averageBy(fun x->float x.Age) people
  122.  
  123. // 12)
  124. let NameInterchange p =
  125.     List.map  (fun x -> {x with
  126.         LastName = x.FirstName
  127.         FirstName = x.LastName}) p;;
  128.  
  129. // 13)
  130. let ChangeName(p,oldName, newName)=
  131.     match oldName with
  132.     | last when last=p.LastName -> {p with LastName = newName}
  133.     | _ -> p
  134.  
  135. let nl = [("Lastname1", "Lastname1mod"); ("Lastname3", "Lmod3")]
  136. let rec ApplyMarrige(namelist:(string * string) list ,people:Person list) =
  137.     if namelist.Length = 0 then
  138.         people
  139.     else
  140.         let n = List.head namelist
  141.         let f = fun p -> (ChangeName(p, fst(n), snd(n)))
  142.         let p = List.map(f) people
  143.         ApplyMarrige(List.tail(namelist), p)
  144.  
  145. // 14)
  146. let ChangeNameFemaleOnly(p,oldName, newName)=
  147.     match oldName with
  148.     | last when last=p.LastName && p.Gender = Female-> {p with LastName = newName}
  149.     | _ -> p
  150.  
  151. let rec ApplyMarrigeFemaleOnly(namelist:(string * string) list ,people:Person list) =
  152.     if namelist.Length = 0 then
  153.         people
  154.     else
  155.         let n = List.head namelist
  156.         let f = fun p -> (ChangeNameFemaleOnly(p, fst(n), snd(n)))
  157.         let p = List.map(f) people
  158.         ApplyMarrige(List.tail(namelist), p)
  159.  
  160. // 15)
  161.  
  162. type Employee =
  163.     | Developer of Person
  164.     | TeamLeader of Person * Person list
  165.     | Manager of Person * Person list list
  166.  
  167. let emp1 = Developer(p1);
  168. let emp2 = Developer(p2);
  169. let tl1 = TeamLeader(p3, [p1; p2])
  170. let tl2 = TeamLeader(p6, [p5;p4;p3])
  171. let man1 = Manager(p1, [[p1];[p2;p3;p4]])
  172.  
  173. let empList = [emp1; emp2; tl1;tl2; man1]
  174.  
  175. let FindPersonWithLargestTeam  (empList: Employee list)=
  176.     let f = function
  177.         |TeamLeader (t, l)  -> Some (t, l.Length)
  178.         |_ -> None
  179.     let teamLeaderswithCount = List.choose(f) empList
  180.     let tmax = List.maxBy(fun x-> snd(x)) teamLeaderswithCount
  181.     fst(tmax)
  182.    
  183. // 16)
  184. let FindLeadersWithOlderTeamMembers (empList: Employee list)=
  185.     let oldest (p: Person list)=
  186.         let max = List.maxBy(fun x-> x.Age) p
  187.         max.Age
  188.     let f = function
  189.         |TeamLeader (t, l)  -> Some (t, l)
  190.         |_ -> None
  191.     let teamLeaders = List.choose(f) empList
  192.     let ret = List.filter(fun x -> (fst(x).Age < oldest(snd(x)))) teamLeaders
  193.     ret
  194.        
  195. // 17)
  196. let FindLeadersWithOlderTeamMembersThan (age:int) (empList: Employee list)=
  197.     let oldest (p: Person list)=
  198.         let max = List.maxBy(fun x-> x.Age) p
  199.         max.Age
  200.     let f = function
  201.         |TeamLeader (t, l)  -> Some (t, l)
  202.         |_ -> None
  203.     let teamLeaders = List.choose(f) empList
  204.     let ret = List.filter(fun x -> (age < oldest(snd(x)))) teamLeaders
  205.     ret
  206.  
  207. // 18)
  208.  
  209.  
  210.  // 19)
  211.  //Non tail recursion can cause stack overflow.
  212.  //Tail recursion is easily optimized by the complier.
  213.  
  214.  
  215. //extra credit 1)
  216.  
  217. type Expr =
  218.     | Var of string
  219.     | Number of float
  220.     | Sum of Expr * Expr
  221.     | Diff of Expr * Expr
  222.     | Mult of Expr * Expr
  223.     | Div of Expr * Expr
  224.  
  225. let x = Var("x")
  226. let y = Var("y")
  227. let n = Number(2.1)
  228. let d1 = Diff(n, x)
  229. let d2 = Diff(d1, y)
  230. let m3 = Mult(d2, n)
  231.  
  232. // 1.1)
  233. let rec Eval2 (env:Map<string, float>, e:Expr) =
  234.     match e with
  235.     | Sum (Number x, Number y) -> Number(x+y)
  236.     | Div (Number x, Number y) -> Number(x/y)
  237.     | Diff (Number x, Number y) -> Number(x-y)
  238.     | Mult (Number x, Number y) -> Number(x*y)
  239.     | Sum (x, Number y) -> Sum(Eval2(env, x), Number y)
  240.     | Div (x, Number y) -> Div(Eval2(env, x), Number y)
  241.     | Diff (x, Number y) -> Diff(Eval2(env, x), Number y)
  242.     | Mult (x, Number y) -> Mult(Eval2(env, x), Number y)
  243.     | Sum (x, y) -> Sum(Eval2(env, x), Eval2(env, y))
  244.     | Div (x, y) -> Div(Eval2(env, x), Eval2(env, y))
  245.     | Diff (x, y) -> Diff(Eval2(env, x), Eval2(env, y))
  246.     | Mult (x, y) -> Mult(Eval2(env, x), Eval2(env, y))
  247.     | Var x -> Number(env.[x])
  248.     | _ -> e
  249.  
  250. let rec Eval (env:Map<string, float>, e:Expr) =
  251.     let d = Eval2(env, e)
  252.     match e with
  253.     | Number x -> x
  254.     | _ -> Eval(env, e)
  255.  
  256. // 1.2)
  257. let rec Subst (s:(string * float) list, e:Expr) =
  258.     let m = Map.ofList(s);
  259.     match e with
  260.     | Var x -> Number(m.[x])
  261.     | Sum(x, y) -> Sum(Subst(s, x), Subst(s, y))
  262.     | Diff(x, y) -> Diff(Subst(s, x), Subst(s, y))
  263.     | Mult(x, y) -> Mult(Subst(s, x), Subst(s, y))
  264.     | Div(x, y) -> Div(Subst(s, x), Subst(s, y))
  265.     | _ -> e
  266. // 1.3)
  267. let rec PrettyPrint e =
  268.     match e with
  269.     | Number x -> x.ToString()
  270.     | Var x -> x
  271.     | Sum(x, y) -> PrettyPrint(x)+"+"+PrettyPrint(y)
  272.     | Diff(x, y) -> PrettyPrint(x)+"-"+PrettyPrint(y)
  273.     | Mult(x, Number y) -> "("+PrettyPrint(x)+")"+"*"+ y.ToString()
  274.     | Mult(x, Var y) -> "("+PrettyPrint(x)+")"+"*"+ y
  275.     | Mult(Number x, y) -> x.ToString()+"*("+PrettyPrint(y)+")"
  276.     | Mult(Var x, y) -> x+"*("+PrettyPrint(y)+")"
  277.     | Mult(x, y) -> "("+PrettyPrint(x)+")"+"*"+"("+PrettyPrint(y)+")"
  278.     | Div(x, Number y) -> "("+PrettyPrint(x)+")"+"/"+y.ToString();
  279.     | Div(x, Var y) -> "("+PrettyPrint(x)+")"+"/"+y;
  280.     | Div(Number x, y) -> x.ToString()+"/("+PrettyPrint(y)+")"
  281.     | Div(Var x, y) -> x+"/("+PrettyPrint(y)+")"
  282.     | Div(x, y) -> "("+PrettyPrint(x)+")"+"/"+"("+PrettyPrint(y)+")"
  283.     | _-> ""
  284.    
  285. let env =
  286.    [ "x", 1.2;
  287.       "y", 3.6; ]
  288.    |> Map.ofList;;
  289.  
  290. // extra credit 2)
  291.  
  292.    
  293. [<EntryPoint>]
  294. let main argv =
  295.    
  296.     0 // return an integer exit code
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement