-
Notifications
You must be signed in to change notification settings - Fork 0
/
homework1-v3.sml
128 lines (104 loc) · 3.61 KB
/
homework1-v3.sml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
fun is_older(dt1: (int * int * int), dt2: (int * int * int)) =
#1 dt1 < #1 dt2
orelse (#1 dt1 = #1 dt2 andalso #2 dt1 < #2 dt2)
orelse (#1 dt1 = #1 dt2 andalso #2 dt1 = #2 dt2 andalso #3 dt1 < #3 dt2)
fun number_in_month(dates: (int * int * int) list, m: int) =
if null dates then 0
else (if #2 (hd dates) = m then 1 else 0) + number_in_month(tl dates, m)
fun number_in_months(dates: (int * int * int) list, ms: int list) =
if null ms then 0
else number_in_month(dates, hd ms) + number_in_months(dates, tl ms)
fun dates_in_month(dates: (int * int * int) list, m: int) =
if null dates then []
else
let
val this = hd dates
in
if #2 this = m
then this :: dates_in_month(tl dates, m)
else dates_in_month(tl dates, m)
end
fun dates_in_months(ds : (int * int* int) list, ms: int list) =
if null ms then []
else dates_in_month(ds, hd ms) @ dates_in_months(ds, tl ms)
fun get_nth(xs: string list, n: int) =
if(n=1) then hd xs
else get_nth(tl xs, n-1)
fun date_to_string(dt: (int * int * int)) =
let
val months = ["January",
"February",
"March",
"April",
"June",
"July",
"August",
"September",
"October",
"November",
"December"]
in
get_nth(months, #2 dt) ^ " " ^ Int.toString(#3 dt) ^ ", " ^ Int.toString(#1 dt)
end
fun number_before_reaching_sum(sum: int, xs: int list) =
if null xs
then 0
else
let
val acc = sum - hd xs
in
if acc <= 0 then 0 else 1 + number_before_reaching_sum(acc, tl xs)
end
fun what_month(n: int) =
let
val months = [31,28,31,30,31,30,31,31,30,31,30,31]
in
number_before_reaching_sum(n, months) + 1
end
val tests01 = [
is_older( (1978,1,19), (1978,1,20)) = true,
is_older( (1978,1,19), (1978,2,19)) = true,
is_older( (1978,1,19), (1979,1,19)) = true,
is_older( (1978,2,19), (1978,2,19)) = false,
is_older( (1978,2,19), (1978,2,18)) = false,
is_older( (1978,2,19), (1978,1,18)) = false,
is_older( (1978,2,19), (1977,2,18)) = false
]
val tests02 = [
number_in_month( [(1978,1,19),(1978,2,19),(1995,2,21), (2012,2,29)] , 1 ) = 1,
number_in_month( [(1978,1,19),(1978,2,19),(1995,2,21), (2012,2,29)] , 2 ) = 3
]
val tests03 = [
number_in_months( [(1978,1,19),(1978,2,19),(1995,2,21), (2012,2,29)] , [1,2] ) = 4,
number_in_months( [(1978,1,19),(1978,2,19),(1995,2,21), (2012,2,29)] , [5,6] ) = 0
]
val tests04 = [
dates_in_month([(1978,1,19),(1978,2,19),(1995,2,21), (2012,2,29)], 1) = [(1978,1,19)],
dates_in_month([(1978,1,19),(1978,2,19),(1995,2,21), (2012,2,29)], 2) = [(1978,2,19),(1995,2,21),(2012,2,29)],
dates_in_month([(1978,1,19),(1978,2,19),(1995,2,21), (2012,2,29)], 5) = []
]
val tests05 = [
dates_in_months([(1978,1,19),(1978,2,19),(1995,2,21), (2012,2,29)], [1,2]) = [(1978,1,19),(1978,2,19),(1995,2,21), (2012,2,29)],
dates_in_months([(1978,1,19),(1978,2,19),(1995,2,21), (2012,2,29)], [5]) = []
]
val tests06 = [
get_nth(["one","two","three","four","five","six","seven"], 1) = "one",
get_nth(["one","two","three","four","five","six","seven"], 4) = "four",
get_nth(["one","two","three","four","five","six","seven"], 7) = "seven"
]
val tests07 = [
date_to_string( (1978, 1, 19) ) = "January 19, 1978",
date_to_string( (2013, 1, 17) ) = "January 17, 2013"
]
val tests08 = [
number_before_reaching_sum(15, [1,2,3,4,5,6,7,8,9,10]) = 4,
number_before_reaching_sum(22, [1,2,3,4,5,6,7,8,9,10]) = 6,
number_before_reaching_sum(15, [31,28,30]) = 0,
number_before_reaching_sum(22, [2,8,1,7,3,9,4,5]) = 5
]
val tests09 = [
what_month(17) = 1,
what_month(31) = 1,
what_month(35) = 2,
what_month(365) = 12
]