Advertisement
Guest User

IA4

a guest
Oct 24th, 2017
385
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 5.62 KB | None | 0 0
  1. (**************************************************************************
  2.  *                                                                        *
  3.  *  File:        Program.fs                                               *
  4.  *  Copyright:   (c) 2016-2017, Florin Leon                               *
  5.  *  E-mail:      florin.leon@tuiasi.ro                                    *
  6.  *  Website:     http://florinleon.byethost24.com/lab_ia.htm              *
  7.  *  Description: Records. Function Composition                            *
  8.  *               (Artificial Intelligence lab 4)                          *
  9.  *                                                                        *
  10.  **************************************************************************)
  11.  
  12. module Program1 =
  13.  
  14.     let lastButTwo1 list =
  15.         list |> List.rev
  16.             |> List.tail
  17.             |> List.tail
  18.             |> List.head
  19.        // cu |>
  20.  
  21.     let lastButTwo2 =
  22.         List.rev >> List.tail
  23.             >> List.tail
  24.             >> List.head
  25.         // cu >>
  26.  
  27.     let mainP1() =
  28.         let list =  [ 1..10 ]
  29.         printfn "Antepenultimul element: %A" (lastButTwo1 list)
  30.         printfn "Antepenultimul element: %A" (lastButTwo2 list)
  31.  
  32. // ==========================================================
  33.  
  34. module Program2 =
  35.  
  36.     let discountedSum list =
  37.         if List.length list < 3 then
  38.             List.sum list
  39.         else
  40.             list |> List.sort
  41.                 |> List.rev
  42.                 |> List.mapi (fun i x -> if i=1 then 0.9*x elif i=2 then 0.8*x else x)
  43.                 |> List.sum
  44.       // daca lista are mai putin de 3 elemente, se face suma simpla
  45.       // altfel: se sorteaza descrescator lista
  46.       // se face o transformare a listei, in care al doilea element este inmultit cu 0.9, al treilea cu 0.8, iar celelalte raman neschimbate
  47.       // se sumeaza elementele
  48.  
  49.     let mainP2() =
  50.         let list = [ 20.0; 10.0; 30.0 ]
  51.         printfn "Preturile articolelor fara reduceri: %A" list
  52.         printfn "Suma fara reduceri: %.2f" (List.sum list)
  53.         printfn "Suma finala: %.2f\n" (discountedSum list)
  54.  
  55.         let list = [ 10.0; 20.0 ]
  56.         printfn "Preturile articolelor fara reduceri: %A" list
  57.         printfn "Suma fara reduceri: %.2f" (List.sum list)
  58.         printfn "Suma finala: %.2f\n" (discountedSum list)
  59.  
  60. // ==========================================================
  61.  
  62. module Program3 =
  63.  
  64.     open System
  65.     open System.IO
  66.  
  67.     let list =
  68.         let lineToTuple (line : string) =
  69.             let toks = line.Split(", ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
  70.             (toks.[0], toks.[1], toks.[2])
  71.         File.ReadAllLines "kinship.csv"
  72.         |> List.ofSeq
  73.         |> List.map lineToTuple
  74.  
  75.     let findParents1() =
  76.         let mothers = List.filter (fun (a, _, _) -> a = "mother") list
  77.         let fathers = List.filter (fun (a, _, _) -> a = "father") list
  78.         [
  79.             for (_, m, c1) in mothers do
  80.                 for (_, f, c2) in fathers do
  81.                     if c1 = c2 then
  82.                         yield (m, f, c1)
  83.         ]
  84.  
  85.     let getParent child parentType =
  86.         let (pT, p, c) = list |> List.find (fun (pT,p,c) -> pT=parentType && c=child)
  87.         p
  88.  
  89.     let findParents2() =
  90.         list |> List.filter (fun (a, _, _) -> a="mother" || a="father")
  91.             |> List.map (fun (_,_,c) -> c)
  92.             |> Seq.distinct
  93.             |> List.ofSeq
  94.             |> List.map (fun child -> ((getParent child "mother"), (getParent child "father"), child))
  95.         // se filtreaza lista, ramanand numai elementele cu relatiile "mother" sau "father"
  96.         // se transforma aceasta lista intr-o lista de copii
  97.         // se elimina duplicatele: Seq.distinct |> List.ofSeq
  98.         // se transforma lista copiilor intr-o lista de tuple de forma ((getParent c "mother") , (getParent c "father"), c)
  99.         // functia getParent trebuie implementata, folosind functia List.find
  100.         // orice alta abordare functionala este binevenita
  101.  
  102.     let printParents parents =
  103.         List.iteri (fun i (m, f, c) -> printfn "%d. mama %s / tata %s / copilul %s" (i + 1) m f c) parents
  104.  
  105.     let mainP3() =
  106.         printfn "Metoda imperativa\n"
  107.         findParents1() |> printParents
  108.  
  109.         printfn "\nMetoda functionala\n"
  110.         findParents2() |> printParents
  111.  
  112. // ====================================================================
  113.  
  114. module Program4 =
  115.     type Person = {
  116.         FirstName: string;
  117.         LastName: string;
  118.         Age: int;
  119.     }
  120.  
  121.     let mainP4a() =
  122.         let persons = [("Ion", "Popescu", 23); ("George", "Ionescu", 24); ("Alexandru", "Georgescu", 21)]
  123.         let t = List.sortBy (fun (prenume, nume, varsta) -> nume) persons
  124.         printfn "Persoanele sortate:"
  125.         List.iter (fun (prenume, nume, varsta) -> printfn "%s %s - %d ani" nume prenume varsta) t
  126.  
  127.     let mainP4b() =
  128.         printfn "Records"
  129.         let persons = [{FirstName="Ion"; LastName="Popescu"; Age=23}; {FirstName="George"; LastName="Ionescu"; Age=24}; {FirstName="Alexandru"; LastName="Georgescu"; Age=21}]
  130.         printfn "Persoanele sortate:"
  131.         persons |> List.sortBy (fun persoana -> persoana.LastName)
  132.             |> List.iter (fun persoana -> printfn "%s %s - %d ani" persoana.LastName persoana.FirstName persoana.Age)
  133.         // functia rescrisa folosind o intregistrare si operatorul pipe
  134.  
  135. // ====================================================================
  136.  
  137. [<EntryPoint>]
  138. let main argv =
  139.     Program1.mainP1()
  140.     Program2.mainP2()
  141.     Program3.mainP3()
  142.     Program4.mainP4a()
  143.     Program4.mainP4b()
  144.     System.Console.ReadKey()
  145.     0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement