/
intRange.kt
99 lines (75 loc) · 2.34 KB
/
intRange.kt
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
package foo
class RangeIterator(val start: Int, var count: Int, val reversed: Boolean) {
var i = start
operator fun next(): Int {
--count
if (reversed) {
i--
return i + 1
}
else {
i++
return i - 1
}
}
operator fun hasNext() = (count > 0);
}
class NumberRange(val start: Int, val size: Int, val reversed: Boolean) {
val end: Int
get() = if (reversed) start - size + 1 else start + size - 1
fun contains(number: Int): Boolean {
if (reversed) {
return (number <= start) && (number > start - size);
}
else {
return (number >= start) && (number < start + size);
}
}
operator fun iterator() = RangeIterator(start, size, reversed);
}
fun box(): String {
return if (testRange() && testReversedRange()) "OK" else "fail"
}
fun testRange(): Boolean {
val oneToFive = NumberRange(1, 4, false);
if (oneToFive.contains(5)) return false;
if (oneToFive.contains(0)) return false;
if (oneToFive.contains(-100)) return false;
if (oneToFive.contains(10)) return false;
if (!oneToFive.contains(1)) return false;
if (!oneToFive.contains(2)) return false;
if (!oneToFive.contains(3)) return false;
if (!oneToFive.contains(4)) return false;
if (!(oneToFive.start == 1)) return false;
if (!(oneToFive.size == 4)) return false;
if (!(oneToFive.end == 4)) return false;
var sum = 0;
for (i in oneToFive) {
sum += i;
}
if (sum != 10) return false;
return true;
}
fun testReversedRange(): Boolean {
val tenToFive = NumberRange(10, 5, true);
if (tenToFive.contains(5)) return false;
if (tenToFive.contains(11)) return false;
if (tenToFive.contains(-100)) return false;
if (tenToFive.contains(1000)) return false;
if (!tenToFive.contains(6)) return false;
if (!tenToFive.contains(7)) return false;
if (!tenToFive.contains(8)) return false;
if (!tenToFive.contains(9)) return false;
if (!tenToFive.contains(10)) return false;
if (!(tenToFive.start == 10)) return false;
if (!(tenToFive.size == 5)) return false;
if (!(tenToFive.end == 6)) return false;
var sum = 0;
for (i in tenToFive) {
sum += i;
}
if (sum != 40) {
return false;
}
return true;
}