Advertisement
Guest User

04.test.sml

a guest
Nov 17th, 2018
219
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. use "unittest.sml";
  2. use "63130148-04.sml";
  3.  
  4. val _ = (
  5.  
  6.     (* Podan seznam xs agregira z začetno vrednostjo z
  7.     in funkcijo f v vrednost f(f(f(z, xs_1),  xs_2), xs_3) ... *)
  8.     test("fun reduce (f: 'a * 'b -> 'a, z: 'a, xs: 'b list): 'a", [
  9.         assert_eq(reduce(fn (agg, value) => agg + value, 0, []), 0),
  10.         assert_eq(reduce(fn (agg, value) => agg + value, 0, [1, 2, 3, 4, 5]), 15),
  11.         assert_eq(reduce(fn (agg, value) => agg ^ " " ^ Int.toString(value), "", [1, 2, 3, 4, 5]), " 1 2 3 4 5"),
  12.         assert_eq(reduce(fn (agg, value) => agg + value, 0, []), 0)
  13.     ]);
  14.  
  15.     (* Vrne seznam, ki vsebuje kvadrate števil
  16.     iz vhodnega seznama. Uporabite List.map. *)
  17.     test("fun squares (xs: int list): int list", [
  18.         assert_eq(squares [], []),
  19.         assert_eq(squares [1, 2, 3, 4, 5], [1, 4, 9, 16, 25])
  20.     ]);
  21.  
  22.     (* Vrne seznam, ki vsebuje vsa soda števila
  23.     iz vhodnega seznama. Uporabite List.filter. *)
  24.     test("fun onlyEven (xs: int list): int list", [
  25.         assert_eq(onlyEven [], []),
  26.         assert_eq(onlyEven [1, 2, 3, 4, 5], [2, 4])
  27.     ]);
  28.  
  29.     (* Vrne najboljši niz glede na funkcijo f. Funkcija f primerja dva niza
  30.     in vrne true, če je prvi niz boljši od drugega. Uporabite List.foldl.
  31.     Najboljši niz v praznem seznamu je prazen niz. *)
  32.     test("fun bestString (f: string * string -> bool, xs: string list): string", [
  33.         assert_eq(bestString(fn (l, r) => l > r, []), ""),
  34.         assert_eq(bestString(fn (l, r) => l > r, ["a", "b", "c", "d"]), "d"),
  35.         assert_eq(bestString(fn (l, r) => l < r, ["a", "b", "c", "d"]), "a"),
  36.         assert_eq(bestString(fn (l, r) => l < r, ["g", "u", "d", "a", "o", "v", "i", "l", "t"]), "a")
  37.     ]);
  38.  
  39.     (* Vrne leksikografsko največji niz. Uporabite bestString. *)
  40.     test("fun largestString (xs: string list): string", [
  41.         assert_eq(largestString [], ""),
  42.         assert_eq(largestString ["a", "b", "c", "d"], "d"),
  43.         assert_eq(largestString ["Matej", "Alen", "Nejc", "Žiga"], "Žiga")
  44.     ]);
  45.  
  46.     (* Vrne najdaljši niz. Uporabite bestString. *)
  47.     test("fun longestString (xs: string list): string", [
  48.         assert_eq(longestString [], ""),
  49.         assert_eq(longestString ["avasd", "bsdssd", "c", "dasd"], "bsdssd"),
  50.         assert_eq(longestString ["Matej", "Alen", "Nejc", "Žiga"], "Matej")
  51.     ]);
  52.  
  53.     (* Seznam uredi naraščajoče z algoritmom quicksort. *)
  54.     test("fun quicksort (xs: int list): int list", [
  55.         assert_eq(quicksort [], []),
  56.         assert_eq(quicksort [1,2,3,4,5], [1,2,3,4,5]),
  57.         assert_eq(quicksort [5,4,3,2,1], [1,2,3,4,5]),
  58.         assert_eq(quicksort [2,4,3,5,1], [1,2,3,4,5])
  59.     ]);
  60.  
  61.     (* Vrne skalarni produkt dveh vektorjev.
  62.     Uporabite List.foldl in ListPair.map. *)
  63.     test("fun dot (xs: int list, ys: int list): int", [
  64.         assert_eq(dot([], []), 0),
  65.         assert_eq(dot([1,1,1], [1,2,3]), 6),
  66.         assert_eq(dot([1,2,3], [1,2,3]), 14)
  67.     ]);
  68.  
  69.     (* Vrne transponirano matriko. Matrika je podana z vrstičnimi vektorji
  70.     od zgoraj navzdol: [[1,2,3],[4,5,6],[7,8,9]] predstavlja matriko
  71.     [ 1 2 3 ]
  72.     [ 4 5 6 ]
  73.     [ 7 8 9 ]
  74.     *)
  75.     test("fun transpose (m: 'a list list): 'a list list", [
  76.         assert_eq(transpose [], []),
  77.         assert_eq(transpose [[1, 2, 3]], [[1], [2], [3]]),
  78.         assert_eq(transpose [[1], [2], [3]], [[1, 2, 3]]),
  79.         assert_eq(transpose [[1,2,3],[4,5,6],[7,8,9]], [[1,4,7], [2,5,8], [3,6,9]])
  80.     ]);
  81.  
  82.     (* Zmnoži dve matriki. Uporabite dot in transpose. *)
  83.     test("fun multiply (a: int list list, b: int list list): int list list", [
  84.         assert_eq(multiply([], []), []),
  85.         assert_eq(multiply([[1,0], [0,1]], [[1,2], [3,4]]), [[1,2], [3,4]]),
  86.         assert_eq(multiply([[1,2], [3,4]], [[1,2], [3,4]]), [[7,10], [15,22]])
  87.     ]);
  88.  
  89.     (* V podanem seznamu prešteje zaporedne enake elemente in vrne seznam
  90.     parov (vrednost, število ponovitev). Podobno deluje UNIX-ovo orodje
  91.     uniq -c. *)
  92.     test("fun group (xs: ''a list): (''a * int) list", [
  93.         assert_eq(group [], []),
  94.         assert_eq(group [1,2,2,3,4,4,4,4,5,6,7,6,6,2,1,1,4,4], [(1,1), (2,2), (3,1), (4,4), (5,1), (6,1), (7,1), (6,2), (2,1), (1,2), (4,2)])
  95.     ]);
  96.    
  97.     (* Elemente iz podanega seznama razvrsti v ekvivalenčne razrede.
  98.     Znotraj razredov naj bodo elementi v istem vrstnem redu kot v
  99.     podanem seznamu. Ekvivalentnost elementov definira funkcija f,
  100.     ki za dva elementa vrne true, če sta ekvivalentna. *)
  101.     test("fun equivalenceClasses (f: ''a * ''a -> bool, xs: ''a list): ''a list list", [
  102.         assert_eq(equivalenceClasses((fn (a,b) => a = b), []), []),
  103.         assert_eq(equivalenceClasses((fn (a,b) => a = b), [1, 2, 3, 4, 5, 1, 3, 4, 6, 3, 1]), [[1,1,1], [2], [3,3,3], [4,4], [5], [6]]),
  104.         assert_eq(equivalenceClasses((fn (a,b) => a mod 2 = b mod 2), [1, 2, 3, 4, 5, 1, 3, 4, 6, 3, 1]), [[1,3,5,1,3,3,1], [2,4,4,6]])
  105.     ]);
  106.  
  107.     OS.Process.exit(OS.Process.success)
  108. );
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement