trackler 2.1.0.22 → 2.1.0.23
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/tracks/elm/exercises/accumulate/Tests.elm +1 -1
- data/tracks/elm/exercises/pangram/Tests.elm +4 -0
- data/tracks/kotlin/bin/journey-test.sh +2 -0
- data/tracks/kotlin/config.json +19 -0
- data/tracks/kotlin/exercises/all-your-base/build.gradle +28 -0
- data/tracks/kotlin/exercises/all-your-base/src/example/kotlin/BaseConverter.kt +59 -0
- data/tracks/kotlin/exercises/all-your-base/src/main/kotlin/.keep +0 -0
- data/tracks/kotlin/exercises/all-your-base/src/test/kotlin/BaseConverterTest.kt +250 -0
- data/tracks/kotlin/exercises/clock/build.gradle +28 -0
- data/tracks/kotlin/exercises/clock/src/example/kotlin/Clock.kt +40 -0
- data/tracks/kotlin/exercises/clock/src/main/kotlin/.keep +0 -0
- data/tracks/kotlin/exercises/clock/src/test/kotlin/ClockAddTest.kt +138 -0
- data/tracks/kotlin/exercises/clock/src/test/kotlin/ClockCreationTest.kt +123 -0
- data/tracks/kotlin/exercises/clock/src/test/kotlin/ClockEqualTest.kt +101 -0
- data/tracks/kotlin/exercises/settings.gradle +3 -0
- data/tracks/kotlin/exercises/sum-of-multiples/build.gradle +29 -0
- data/tracks/kotlin/exercises/sum-of-multiples/src/example/kotlin/SumOfMultiples.kt +7 -0
- data/tracks/kotlin/exercises/sum-of-multiples/src/main/kotlin/.keep +0 -0
- data/tracks/kotlin/exercises/sum-of-multiples/src/test/kotlin/SumOfMultiplesTest.kt +84 -0
- data/tracks/python/exercises/grade-school/grade_school_test.py +2 -2
- data/tracks/vimscript/config.json +1 -1
- metadata +16 -3
- data/tracks/java/.github/stale.yml +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a5a1f4bc1094d7cab6ba4f22a20e28874665bbb9
|
4
|
+
data.tar.gz: 66cd048370d77f78ffdfef48b573fe302129e99a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d0632cd9d571b3d6f1a604b748380d1b6ba4b3f6501970f4bac7c84361a0ef0ede21d9e0b118968e9daa04dde82fd11619a6edf9cee61e18f0234ea691b9935e
|
7
|
+
data.tar.gz: 3cd5cc5489046c92b192e7955f0c0a18be47eecf3b3c88735a5ba483fc2675027d52f2fca726f51253cdec7fe3c30951e6a10e63baadb47c0d11caef7117db45
|
data/lib/trackler/version.rb
CHANGED
@@ -16,7 +16,7 @@ square x =
|
|
16
16
|
tests : Test
|
17
17
|
tests =
|
18
18
|
describe "Accumulate"
|
19
|
-
[ test "[]
|
19
|
+
[ test "[] Accumulate" <|
|
20
20
|
\() -> Expect.equal [] (accumulate square [])
|
21
21
|
, test "square Accumulate" <|
|
22
22
|
\() -> Expect.equal [ 1, 4, 9 ] (accumulate square [ 1, 2, 3 ])
|
@@ -22,6 +22,10 @@ tests =
|
|
22
22
|
\() ->
|
23
23
|
Expect.equal False
|
24
24
|
(isPangram "a quick movement of the enemy will jeopardize five gunboats")
|
25
|
+
, test "missing character 'z'" <|
|
26
|
+
\() ->
|
27
|
+
Expect.equal False
|
28
|
+
(isPangram "a quick movement of the enemy will jeopardixe five gunboats")
|
25
29
|
, test "another missing character 'x'" <|
|
26
30
|
\() ->
|
27
31
|
Expect.equal False
|
@@ -214,6 +214,8 @@ solve_all_exercises() {
|
|
214
214
|
cp -R -H ${track_root}/exercises/${exercise}/src/example/${TRACK}/* ${exercism_exercises_dir}/${TRACK}/${exercise}/src/main/${TRACK}/
|
215
215
|
|
216
216
|
pushd ${exercism_exercises_dir}/${TRACK}/${exercise}
|
217
|
+
# Check that tests compile before we strip @Ignore annotations
|
218
|
+
gradle compileTestJava
|
217
219
|
# Ensure we run all the tests (as delivered, all but the first is @Ignore'd)
|
218
220
|
for testfile in `find . -name "*Test.${TRACK_SRC_EXT}"`; do
|
219
221
|
sed 's/@Ignore//' ${testfile} > "${tempfile}" && mv "${tempfile}" "${testfile}"
|
data/tracks/kotlin/config.json
CHANGED
@@ -228,11 +228,30 @@
|
|
228
228
|
"slug": "change",
|
229
229
|
"topics": []
|
230
230
|
},
|
231
|
+
{
|
232
|
+
"difficulty": 1,
|
233
|
+
"slug": "clock",
|
234
|
+
"topics": []
|
235
|
+
},
|
231
236
|
{
|
232
237
|
"difficulty": 1,
|
233
238
|
"slug": "triangle",
|
234
239
|
"topics": []
|
235
240
|
},
|
241
|
+
{
|
242
|
+
"difficulty": 1,
|
243
|
+
"slug": "sum-of-multiples",
|
244
|
+
"topics": [
|
245
|
+
"Ranges",
|
246
|
+
"Collections",
|
247
|
+
"Lambdas"
|
248
|
+
]
|
249
|
+
},
|
250
|
+
{
|
251
|
+
"difficulty": 1,
|
252
|
+
"slug": "all-your-base",
|
253
|
+
"topics": []
|
254
|
+
},
|
236
255
|
{
|
237
256
|
"difficulty": 2,
|
238
257
|
"slug": "bank-account",
|
@@ -0,0 +1,28 @@
|
|
1
|
+
buildscript {
|
2
|
+
ext.kotlin_version = '1.1.1'
|
3
|
+
repositories {
|
4
|
+
mavenCentral()
|
5
|
+
}
|
6
|
+
dependencies {
|
7
|
+
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
8
|
+
}
|
9
|
+
}
|
10
|
+
|
11
|
+
apply plugin: 'kotlin'
|
12
|
+
|
13
|
+
repositories {
|
14
|
+
mavenCentral()
|
15
|
+
}
|
16
|
+
|
17
|
+
dependencies {
|
18
|
+
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
19
|
+
|
20
|
+
testCompile 'junit:junit:4.12'
|
21
|
+
testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
|
22
|
+
}
|
23
|
+
test {
|
24
|
+
testLogging {
|
25
|
+
exceptionFormat = 'full'
|
26
|
+
events = ["passed", "failed", "skipped"]
|
27
|
+
}
|
28
|
+
}
|
@@ -0,0 +1,59 @@
|
|
1
|
+
class BaseConverter(originalBase: Int, originalDigits: IntArray) {
|
2
|
+
|
3
|
+
companion object {
|
4
|
+
private val MINIMUM_VALID_BASE = 2
|
5
|
+
private val INVALID_BASE_ERROR_MESSAGE = "Bases must be at least 2."
|
6
|
+
}
|
7
|
+
|
8
|
+
private val numeral: Int
|
9
|
+
|
10
|
+
init {
|
11
|
+
require(originalBase >= MINIMUM_VALID_BASE) { INVALID_BASE_ERROR_MESSAGE }
|
12
|
+
require(originalDigits.isNotEmpty()) { "You must supply at least one digit." }
|
13
|
+
require(originalDigits.size == 1 || originalDigits[0] != 0) { "Digits may not contain leading zeros." }
|
14
|
+
require(originalDigits.min()!! >= 0) { "Digits may not be negative." }
|
15
|
+
require(originalDigits.max()!! < originalBase) { "All digits must be strictly less than the base." }
|
16
|
+
|
17
|
+
this.numeral = computeNumeral(originalBase, originalDigits)
|
18
|
+
}
|
19
|
+
|
20
|
+
fun convertToBase(newBase: Int): IntArray {
|
21
|
+
require(newBase >= MINIMUM_VALID_BASE) { INVALID_BASE_ERROR_MESSAGE }
|
22
|
+
|
23
|
+
val largestExponent = computeLargestExponentForBase(newBase)
|
24
|
+
val result = IntArray(largestExponent + 1)
|
25
|
+
var remainder = numeral
|
26
|
+
|
27
|
+
for (currentExponent in largestExponent downTo 0) {
|
28
|
+
val coefficient = Math.floor(remainder / Math.pow(newBase.toDouble(), currentExponent.toDouble())).toInt()
|
29
|
+
|
30
|
+
result[largestExponent - currentExponent] = coefficient
|
31
|
+
|
32
|
+
remainder -= (coefficient * Math.pow(newBase.toDouble(), currentExponent.toDouble())).toInt()
|
33
|
+
}
|
34
|
+
|
35
|
+
return result
|
36
|
+
}
|
37
|
+
|
38
|
+
private fun computeNumeral(originalBase: Int, originalDigits: IntArray): Int {
|
39
|
+
val largestExponent = originalDigits.size - 1
|
40
|
+
|
41
|
+
val result = (largestExponent downTo 0).sumBy { exponent ->
|
42
|
+
(originalDigits[largestExponent - exponent]
|
43
|
+
* Math.pow(originalBase.toDouble(), exponent.toDouble())).toInt()
|
44
|
+
}
|
45
|
+
|
46
|
+
return result
|
47
|
+
}
|
48
|
+
|
49
|
+
private fun computeLargestExponentForBase(newBase: Int): Int {
|
50
|
+
var result = 0
|
51
|
+
|
52
|
+
while (Math.pow(newBase.toDouble(), (result + 1).toDouble()) < numeral) {
|
53
|
+
result += 1
|
54
|
+
}
|
55
|
+
|
56
|
+
return result
|
57
|
+
}
|
58
|
+
|
59
|
+
}
|
File without changes
|
@@ -0,0 +1,250 @@
|
|
1
|
+
import org.junit.Assert.assertArrayEquals
|
2
|
+
import org.junit.Ignore
|
3
|
+
import org.junit.Rule
|
4
|
+
import org.junit.Test
|
5
|
+
import org.junit.rules.ExpectedException
|
6
|
+
import java.util.*
|
7
|
+
|
8
|
+
/*
|
9
|
+
* version: 1.0.0
|
10
|
+
*/
|
11
|
+
class BaseConverterTest {
|
12
|
+
|
13
|
+
/*
|
14
|
+
* See https://github.com/junit-team/junit4/wiki/Rules for information on JUnit Rules in general and
|
15
|
+
* ExpectedExceptions in particular.
|
16
|
+
*/
|
17
|
+
@Rule @JvmField
|
18
|
+
var expectedException: ExpectedException = ExpectedException.none()
|
19
|
+
|
20
|
+
@Test
|
21
|
+
fun testSingleBitOneToDecimal() {
|
22
|
+
val baseConverter = BaseConverter(2, intArrayOf(1))
|
23
|
+
|
24
|
+
val expectedDigits = intArrayOf(1)
|
25
|
+
val actualDigits = baseConverter.convertToBase(10)
|
26
|
+
|
27
|
+
assertArrayEquals(
|
28
|
+
"Expected digits: ${Arrays.toString(expectedDigits)} but found digits: ${Arrays.toString(actualDigits)}",
|
29
|
+
expectedDigits,
|
30
|
+
actualDigits)
|
31
|
+
}
|
32
|
+
|
33
|
+
@Ignore
|
34
|
+
@Test
|
35
|
+
fun testBinaryToSingleDecimal() {
|
36
|
+
val baseConverter = BaseConverter(2, intArrayOf(1, 0, 1))
|
37
|
+
|
38
|
+
val expectedDigits = intArrayOf(5)
|
39
|
+
val actualDigits = baseConverter.convertToBase(10)
|
40
|
+
|
41
|
+
assertArrayEquals(
|
42
|
+
"Expected digits: ${Arrays.toString(expectedDigits)} but found digits: ${Arrays.toString(actualDigits)}",
|
43
|
+
expectedDigits,
|
44
|
+
actualDigits)
|
45
|
+
}
|
46
|
+
|
47
|
+
@Ignore
|
48
|
+
@Test
|
49
|
+
fun testSingleDecimalToBinary() {
|
50
|
+
val baseConverter = BaseConverter(10, intArrayOf(5))
|
51
|
+
|
52
|
+
val expectedDigits = intArrayOf(1, 0, 1)
|
53
|
+
val actualDigits = baseConverter.convertToBase(2)
|
54
|
+
|
55
|
+
assertArrayEquals(
|
56
|
+
"Expected digits: ${Arrays.toString(expectedDigits)} but found digits: ${Arrays.toString(actualDigits)}",
|
57
|
+
expectedDigits,
|
58
|
+
actualDigits)
|
59
|
+
}
|
60
|
+
|
61
|
+
@Ignore
|
62
|
+
@Test
|
63
|
+
fun testBinaryToMultipleDecimal() {
|
64
|
+
val baseConverter = BaseConverter(2, intArrayOf(1, 0, 1, 0, 1, 0))
|
65
|
+
|
66
|
+
val expectedDigits = intArrayOf(4, 2)
|
67
|
+
val actualDigits = baseConverter.convertToBase(10)
|
68
|
+
|
69
|
+
assertArrayEquals(
|
70
|
+
"Expected digits: ${Arrays.toString(expectedDigits)} but found digits: ${Arrays.toString(actualDigits)}",
|
71
|
+
expectedDigits,
|
72
|
+
actualDigits)
|
73
|
+
}
|
74
|
+
|
75
|
+
@Ignore
|
76
|
+
@Test
|
77
|
+
fun testDecimalToBinary() {
|
78
|
+
val baseConverter = BaseConverter(10, intArrayOf(4, 2))
|
79
|
+
|
80
|
+
val expectedDigits = intArrayOf(1, 0, 1, 0, 1, 0)
|
81
|
+
val actualDigits = baseConverter.convertToBase(2)
|
82
|
+
|
83
|
+
assertArrayEquals(
|
84
|
+
"Expected digits: ${Arrays.toString(expectedDigits)} but found digits: ${Arrays.toString(actualDigits)}",
|
85
|
+
expectedDigits,
|
86
|
+
actualDigits)
|
87
|
+
}
|
88
|
+
|
89
|
+
@Ignore
|
90
|
+
@Test
|
91
|
+
fun testTrinaryToHexadecimal() {
|
92
|
+
val baseConverter = BaseConverter(3, intArrayOf(1, 1, 2, 0))
|
93
|
+
|
94
|
+
val expectedDigits = intArrayOf(2, 10)
|
95
|
+
val actualDigits = baseConverter.convertToBase(16)
|
96
|
+
|
97
|
+
assertArrayEquals(
|
98
|
+
"Expected digits: ${Arrays.toString(expectedDigits)} but found digits: ${Arrays.toString(actualDigits)}",
|
99
|
+
expectedDigits,
|
100
|
+
actualDigits)
|
101
|
+
}
|
102
|
+
|
103
|
+
@Ignore
|
104
|
+
@Test
|
105
|
+
fun testHexadecimalToTrinary() {
|
106
|
+
val baseConverter = BaseConverter(16, intArrayOf(2, 10))
|
107
|
+
|
108
|
+
val expectedDigits = intArrayOf(1, 1, 2, 0)
|
109
|
+
val actualDigits = baseConverter.convertToBase(3)
|
110
|
+
|
111
|
+
assertArrayEquals(
|
112
|
+
"Expected digits: ${Arrays.toString(expectedDigits)} but found digits: ${Arrays.toString(actualDigits)}",
|
113
|
+
expectedDigits,
|
114
|
+
actualDigits)
|
115
|
+
}
|
116
|
+
|
117
|
+
@Ignore
|
118
|
+
@Test
|
119
|
+
fun test15BitInteger() {
|
120
|
+
val baseConverter = BaseConverter(97, intArrayOf(3, 46, 60))
|
121
|
+
|
122
|
+
val expectedDigits = intArrayOf(6, 10, 45)
|
123
|
+
val actualDigits = baseConverter.convertToBase(73)
|
124
|
+
|
125
|
+
assertArrayEquals(
|
126
|
+
"Expected digits: ${Arrays.toString(expectedDigits)} but found digits: ${Arrays.toString(actualDigits)}",
|
127
|
+
expectedDigits,
|
128
|
+
actualDigits)
|
129
|
+
}
|
130
|
+
|
131
|
+
@Ignore
|
132
|
+
@Test
|
133
|
+
fun testEmptyDigits() {
|
134
|
+
expectedException.expect(IllegalArgumentException::class.java)
|
135
|
+
expectedException.expectMessage("You must supply at least one digit.")
|
136
|
+
|
137
|
+
BaseConverter(2, intArrayOf())
|
138
|
+
}
|
139
|
+
|
140
|
+
@Ignore
|
141
|
+
@Test
|
142
|
+
fun testSingleZero() {
|
143
|
+
val baseConverter = BaseConverter(10, intArrayOf(0))
|
144
|
+
|
145
|
+
val expectedDigits = intArrayOf(0)
|
146
|
+
val actualDigits = baseConverter.convertToBase(2)
|
147
|
+
|
148
|
+
assertArrayEquals(
|
149
|
+
"Expected digits: ${Arrays.toString(expectedDigits)} but found digits: ${Arrays.toString(actualDigits)}",
|
150
|
+
expectedDigits,
|
151
|
+
actualDigits)
|
152
|
+
}
|
153
|
+
|
154
|
+
@Ignore
|
155
|
+
@Test
|
156
|
+
fun testMultipleZeros() {
|
157
|
+
expectedException.expect(IllegalArgumentException::class.java)
|
158
|
+
expectedException.expectMessage("Digits may not contain leading zeros.")
|
159
|
+
|
160
|
+
BaseConverter(10, intArrayOf(0, 0, 0))
|
161
|
+
}
|
162
|
+
|
163
|
+
@Ignore
|
164
|
+
@Test
|
165
|
+
fun testLeadingZeros() {
|
166
|
+
expectedException.expect(IllegalArgumentException::class.java)
|
167
|
+
expectedException.expectMessage("Digits may not contain leading zeros.")
|
168
|
+
|
169
|
+
BaseConverter(7, intArrayOf(0, 6, 0))
|
170
|
+
}
|
171
|
+
|
172
|
+
@Ignore
|
173
|
+
@Test
|
174
|
+
fun testNegativeDigit() {
|
175
|
+
expectedException.expect(IllegalArgumentException::class.java)
|
176
|
+
expectedException.expectMessage("Digits may not be negative.")
|
177
|
+
|
178
|
+
BaseConverter(2, intArrayOf(1, -1, 1, 0, 1, 0))
|
179
|
+
}
|
180
|
+
|
181
|
+
@Ignore
|
182
|
+
@Test
|
183
|
+
fun testInvalidPositiveDigit() {
|
184
|
+
expectedException.expect(IllegalArgumentException::class.java)
|
185
|
+
expectedException.expectMessage("All digits must be strictly less than the base.")
|
186
|
+
|
187
|
+
BaseConverter(2, intArrayOf(1, 2, 1, 0, 1, 0))
|
188
|
+
}
|
189
|
+
|
190
|
+
@Ignore
|
191
|
+
@Test
|
192
|
+
fun testFirstBaseIsOne() {
|
193
|
+
expectedException.expect(IllegalArgumentException::class.java)
|
194
|
+
expectedException.expectMessage("Bases must be at least 2.")
|
195
|
+
|
196
|
+
BaseConverter(1, intArrayOf())
|
197
|
+
}
|
198
|
+
|
199
|
+
@Ignore
|
200
|
+
@Test
|
201
|
+
fun testSecondBaseIsOne() {
|
202
|
+
val baseConverter = BaseConverter(2, intArrayOf(1, 0, 1, 0, 1, 0))
|
203
|
+
|
204
|
+
expectedException.expect(IllegalArgumentException::class.java)
|
205
|
+
expectedException.expectMessage("Bases must be at least 2.")
|
206
|
+
|
207
|
+
baseConverter.convertToBase(1)
|
208
|
+
}
|
209
|
+
|
210
|
+
@Ignore
|
211
|
+
@Test
|
212
|
+
fun testFirstBaseIsZero() {
|
213
|
+
expectedException.expect(IllegalArgumentException::class.java)
|
214
|
+
expectedException.expectMessage("Bases must be at least 2.")
|
215
|
+
|
216
|
+
BaseConverter(0, intArrayOf())
|
217
|
+
}
|
218
|
+
|
219
|
+
@Ignore
|
220
|
+
@Test
|
221
|
+
fun testSecondBaseIsZero() {
|
222
|
+
val baseConverter = BaseConverter(2, intArrayOf(1, 0, 1, 0, 1, 0))
|
223
|
+
|
224
|
+
expectedException.expect(IllegalArgumentException::class.java)
|
225
|
+
expectedException.expectMessage("Bases must be at least 2.")
|
226
|
+
|
227
|
+
baseConverter.convertToBase(0)
|
228
|
+
}
|
229
|
+
|
230
|
+
@Ignore
|
231
|
+
@Test
|
232
|
+
fun testFirstBaseIsNegative() {
|
233
|
+
expectedException.expect(IllegalArgumentException::class.java)
|
234
|
+
expectedException.expectMessage("Bases must be at least 2.")
|
235
|
+
|
236
|
+
BaseConverter(-2, intArrayOf())
|
237
|
+
}
|
238
|
+
|
239
|
+
@Ignore
|
240
|
+
@Test
|
241
|
+
fun testSecondBaseIsNegative() {
|
242
|
+
val baseConverter = BaseConverter(2, intArrayOf(1))
|
243
|
+
|
244
|
+
expectedException.expect(IllegalArgumentException::class.java)
|
245
|
+
expectedException.expectMessage("Bases must be at least 2.")
|
246
|
+
|
247
|
+
baseConverter.convertToBase(-7)
|
248
|
+
}
|
249
|
+
|
250
|
+
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
buildscript {
|
2
|
+
ext.kotlin_version = '1.1.1'
|
3
|
+
repositories {
|
4
|
+
mavenCentral()
|
5
|
+
}
|
6
|
+
dependencies {
|
7
|
+
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
8
|
+
}
|
9
|
+
}
|
10
|
+
|
11
|
+
apply plugin: 'kotlin'
|
12
|
+
|
13
|
+
repositories {
|
14
|
+
mavenCentral()
|
15
|
+
}
|
16
|
+
|
17
|
+
dependencies {
|
18
|
+
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
19
|
+
|
20
|
+
testCompile 'junit:junit:4.12'
|
21
|
+
testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
|
22
|
+
}
|
23
|
+
test {
|
24
|
+
testLogging {
|
25
|
+
exceptionFormat = 'full'
|
26
|
+
events = ["passed", "failed", "skipped"]
|
27
|
+
}
|
28
|
+
}
|
@@ -0,0 +1,40 @@
|
|
1
|
+
data class Clock(private var hours: Int, private var minutes: Int) {
|
2
|
+
|
3
|
+
companion object {
|
4
|
+
private val MINUTES_IN_AN_HOUR = 60
|
5
|
+
private val HOURS_IN_A_DAY = 24
|
6
|
+
}
|
7
|
+
|
8
|
+
init {
|
9
|
+
sanitiseTime()
|
10
|
+
}
|
11
|
+
|
12
|
+
override fun toString(): String {
|
13
|
+
return "${hours.toTimeString()}:${minutes.toTimeString()}"
|
14
|
+
}
|
15
|
+
|
16
|
+
fun add(minutes: Int) {
|
17
|
+
this.minutes += minutes
|
18
|
+
sanitiseTime()
|
19
|
+
}
|
20
|
+
|
21
|
+
private fun sanitiseTime() {
|
22
|
+
while (minutes < 0) {
|
23
|
+
minutes += MINUTES_IN_AN_HOUR
|
24
|
+
hours--
|
25
|
+
}
|
26
|
+
|
27
|
+
while (hours < 0) {
|
28
|
+
hours += HOURS_IN_A_DAY
|
29
|
+
}
|
30
|
+
|
31
|
+
val minutesOverflow = minutes / MINUTES_IN_AN_HOUR
|
32
|
+
minutes %= MINUTES_IN_AN_HOUR
|
33
|
+
hours = (hours + minutesOverflow) % HOURS_IN_A_DAY
|
34
|
+
}
|
35
|
+
|
36
|
+
}
|
37
|
+
|
38
|
+
private fun Int.toTimeString(): String {
|
39
|
+
return toString().padStart(length = 2, padChar = '0')
|
40
|
+
}
|
File without changes
|
@@ -0,0 +1,138 @@
|
|
1
|
+
import org.junit.Ignore
|
2
|
+
import org.junit.Test
|
3
|
+
import kotlin.test.assertEquals
|
4
|
+
|
5
|
+
/*
|
6
|
+
* version: 1.0.1
|
7
|
+
*/
|
8
|
+
class ClockAddTest {
|
9
|
+
|
10
|
+
@Ignore
|
11
|
+
@Test
|
12
|
+
fun addMinutes() {
|
13
|
+
val clock = Clock(10, 0)
|
14
|
+
clock.add(3)
|
15
|
+
assertEquals("10:03", clock.toString())
|
16
|
+
}
|
17
|
+
|
18
|
+
@Ignore
|
19
|
+
@Test
|
20
|
+
fun addNoMinutes() {
|
21
|
+
val clock = Clock(6, 41)
|
22
|
+
clock.add(0)
|
23
|
+
assertEquals("06:41", clock.toString())
|
24
|
+
}
|
25
|
+
|
26
|
+
@Ignore
|
27
|
+
@Test
|
28
|
+
fun addToNextHour() {
|
29
|
+
val clock = Clock(0, 45)
|
30
|
+
clock.add(40)
|
31
|
+
assertEquals("01:25", clock.toString())
|
32
|
+
}
|
33
|
+
|
34
|
+
@Ignore
|
35
|
+
@Test
|
36
|
+
fun addMoreThanOneHour() {
|
37
|
+
val clock = Clock(10, 0)
|
38
|
+
clock.add(61)
|
39
|
+
assertEquals("11:01", clock.toString())
|
40
|
+
}
|
41
|
+
|
42
|
+
@Ignore
|
43
|
+
@Test
|
44
|
+
fun addMoreThanTwoHoursWithCarry() {
|
45
|
+
val clock = Clock(0, 45)
|
46
|
+
clock.add(160)
|
47
|
+
assertEquals("03:25", clock.toString())
|
48
|
+
}
|
49
|
+
|
50
|
+
@Ignore
|
51
|
+
@Test
|
52
|
+
fun addAcrossMidnight() {
|
53
|
+
val clock = Clock(23, 59)
|
54
|
+
clock.add(2)
|
55
|
+
assertEquals("00:01", clock.toString())
|
56
|
+
}
|
57
|
+
|
58
|
+
@Ignore
|
59
|
+
@Test
|
60
|
+
fun addMoreThanOneDay() {
|
61
|
+
val clock = Clock(5, 32)
|
62
|
+
clock.add(1500)
|
63
|
+
assertEquals("06:32", clock.toString())
|
64
|
+
}
|
65
|
+
|
66
|
+
@Ignore
|
67
|
+
@Test
|
68
|
+
fun addMoreThanTwoDays() {
|
69
|
+
val clock = Clock(1, 1)
|
70
|
+
clock.add(3500)
|
71
|
+
assertEquals("11:21", clock.toString())
|
72
|
+
}
|
73
|
+
|
74
|
+
@Ignore
|
75
|
+
@Test
|
76
|
+
fun subtractMinutes() {
|
77
|
+
val clock = Clock(10, 3)
|
78
|
+
clock.add(-3)
|
79
|
+
assertEquals("10:00", clock.toString())
|
80
|
+
}
|
81
|
+
|
82
|
+
@Ignore
|
83
|
+
@Test
|
84
|
+
fun subtractToPreviousHour() {
|
85
|
+
val clock = Clock(10, 3)
|
86
|
+
clock.add(-30)
|
87
|
+
assertEquals("09:33", clock.toString())
|
88
|
+
}
|
89
|
+
|
90
|
+
@Ignore
|
91
|
+
@Test
|
92
|
+
fun subtractMoreThanAnHour() {
|
93
|
+
val clock = Clock(10, 3)
|
94
|
+
clock.add(-70)
|
95
|
+
assertEquals("08:53", clock.toString())
|
96
|
+
}
|
97
|
+
|
98
|
+
@Ignore
|
99
|
+
@Test
|
100
|
+
fun subtractAcrossMidnight() {
|
101
|
+
val clock = Clock(0, 3)
|
102
|
+
clock.add(-4)
|
103
|
+
assertEquals("23:59", clock.toString())
|
104
|
+
}
|
105
|
+
|
106
|
+
@Ignore
|
107
|
+
@Test
|
108
|
+
fun subtractMoreThanTwoHours() {
|
109
|
+
val clock = Clock(0, 0)
|
110
|
+
clock.add(-160)
|
111
|
+
assertEquals("21:20", clock.toString())
|
112
|
+
}
|
113
|
+
|
114
|
+
@Ignore
|
115
|
+
@Test
|
116
|
+
fun subtractMoreThanTwoHoursWithBorrow() {
|
117
|
+
val clock = Clock(6, 15)
|
118
|
+
clock.add(-160)
|
119
|
+
assertEquals("03:35", clock.toString())
|
120
|
+
}
|
121
|
+
|
122
|
+
@Ignore
|
123
|
+
@Test
|
124
|
+
fun subtractMoreThanOneDay() {
|
125
|
+
val clock = Clock(5, 32)
|
126
|
+
clock.add(-1500)
|
127
|
+
assertEquals("04:32", clock.toString())
|
128
|
+
}
|
129
|
+
|
130
|
+
@Ignore
|
131
|
+
@Test
|
132
|
+
fun subtractMoreThanTwoDays() {
|
133
|
+
val clock = Clock(2, 20)
|
134
|
+
clock.add(-3000)
|
135
|
+
assertEquals("00:20", clock.toString())
|
136
|
+
}
|
137
|
+
|
138
|
+
}
|
@@ -0,0 +1,123 @@
|
|
1
|
+
import org.junit.Ignore
|
2
|
+
import org.junit.Test
|
3
|
+
import kotlin.test.assertEquals
|
4
|
+
|
5
|
+
/*
|
6
|
+
* version: 1.0.1
|
7
|
+
*/
|
8
|
+
class ClockCreationTest {
|
9
|
+
|
10
|
+
@Test
|
11
|
+
fun canPrintTimeOnTheHour() {
|
12
|
+
assertEquals("08:00", Clock(8, 0).toString())
|
13
|
+
}
|
14
|
+
|
15
|
+
@Ignore
|
16
|
+
@Test
|
17
|
+
fun canPrintTimeWithMinutes() {
|
18
|
+
assertEquals("11:09", Clock(11, 9).toString())
|
19
|
+
}
|
20
|
+
|
21
|
+
@Ignore
|
22
|
+
@Test
|
23
|
+
fun midnightPrintsAsZero() {
|
24
|
+
assertEquals("00:00", Clock(24, 0).toString())
|
25
|
+
}
|
26
|
+
|
27
|
+
@Ignore
|
28
|
+
@Test
|
29
|
+
fun hourRollsOver() {
|
30
|
+
assertEquals("01:00", Clock(25, 0).toString())
|
31
|
+
}
|
32
|
+
|
33
|
+
@Ignore
|
34
|
+
@Test
|
35
|
+
fun hourRollsOverContinuously() {
|
36
|
+
assertEquals("04:00", Clock(100, 0).toString())
|
37
|
+
}
|
38
|
+
|
39
|
+
@Ignore
|
40
|
+
@Test
|
41
|
+
fun sixtyMinutesIsNextHour() {
|
42
|
+
assertEquals("02:00", Clock(1, 60).toString())
|
43
|
+
}
|
44
|
+
|
45
|
+
@Ignore
|
46
|
+
@Test
|
47
|
+
fun minutesRollOver() {
|
48
|
+
assertEquals("02:40", Clock(0, 160).toString())
|
49
|
+
}
|
50
|
+
|
51
|
+
@Ignore
|
52
|
+
@Test
|
53
|
+
fun minutesRollOverContinuously() {
|
54
|
+
assertEquals("04:43", Clock(0, 1723).toString())
|
55
|
+
}
|
56
|
+
|
57
|
+
@Ignore
|
58
|
+
@Test
|
59
|
+
fun hourAndMinutesRollOver() {
|
60
|
+
assertEquals("03:40", Clock(25, 160).toString())
|
61
|
+
}
|
62
|
+
|
63
|
+
@Ignore
|
64
|
+
@Test
|
65
|
+
fun hourAndMinutesRollOverContinuously() {
|
66
|
+
assertEquals("11:01", Clock(201, 3001).toString())
|
67
|
+
}
|
68
|
+
|
69
|
+
@Ignore
|
70
|
+
@Test
|
71
|
+
fun hourAndMinutesRollOverToExactlyMidnight() {
|
72
|
+
assertEquals("00:00", Clock(72, 8640).toString())
|
73
|
+
}
|
74
|
+
|
75
|
+
@Ignore
|
76
|
+
@Test
|
77
|
+
fun negativeHour() {
|
78
|
+
assertEquals("23:15", Clock(-1, 15).toString())
|
79
|
+
}
|
80
|
+
|
81
|
+
@Ignore
|
82
|
+
@Test
|
83
|
+
fun negativeHourRollsOver() {
|
84
|
+
assertEquals("23:00", Clock(-25, 0).toString())
|
85
|
+
}
|
86
|
+
|
87
|
+
@Ignore
|
88
|
+
@Test
|
89
|
+
fun negativeHourRollsOverContinuously() {
|
90
|
+
assertEquals("05:00", Clock(-91, 0).toString())
|
91
|
+
}
|
92
|
+
|
93
|
+
@Ignore
|
94
|
+
@Test
|
95
|
+
fun negativeMinutes() {
|
96
|
+
assertEquals("00:20", Clock(1, -40).toString())
|
97
|
+
}
|
98
|
+
|
99
|
+
@Ignore
|
100
|
+
@Test
|
101
|
+
fun negativeMinutesRollOver() {
|
102
|
+
assertEquals("22:20", Clock(1, -160).toString())
|
103
|
+
}
|
104
|
+
|
105
|
+
@Ignore
|
106
|
+
@Test
|
107
|
+
fun negativeMinutesRollOverContinuously() {
|
108
|
+
assertEquals("16:40", Clock(1, -4820).toString())
|
109
|
+
}
|
110
|
+
|
111
|
+
@Ignore
|
112
|
+
@Test
|
113
|
+
fun negativeHourAndMinutesBothRollOver() {
|
114
|
+
assertEquals("20:20", Clock(-25, -160).toString())
|
115
|
+
}
|
116
|
+
|
117
|
+
@Ignore
|
118
|
+
@Test
|
119
|
+
fun negativeHourAndMinutesBothRollOverContinuously() {
|
120
|
+
assertEquals("22:10", Clock(-121, -5810).toString())
|
121
|
+
}
|
122
|
+
|
123
|
+
}
|
@@ -0,0 +1,101 @@
|
|
1
|
+
import org.junit.Ignore
|
2
|
+
import org.junit.Test
|
3
|
+
import kotlin.test.assertNotEquals
|
4
|
+
import kotlin.test.assertEquals
|
5
|
+
|
6
|
+
/*
|
7
|
+
* version: 1.0.1
|
8
|
+
*/
|
9
|
+
class ClockEqualTest {
|
10
|
+
|
11
|
+
@Ignore
|
12
|
+
@Test
|
13
|
+
fun clocksWithSameTimeAreEqual() {
|
14
|
+
assertEquals(Clock(15, 37), Clock(15, 37))
|
15
|
+
}
|
16
|
+
|
17
|
+
@Ignore
|
18
|
+
@Test
|
19
|
+
fun clocksAMinuteApartAreNotEqual() {
|
20
|
+
assertNotEquals(Clock(15, 36), Clock(15, 37))
|
21
|
+
}
|
22
|
+
|
23
|
+
@Ignore
|
24
|
+
@Test
|
25
|
+
fun clocksAnHourApartAreNotEqual() {
|
26
|
+
assertNotEquals(Clock(14, 37), Clock(15, 37))
|
27
|
+
}
|
28
|
+
|
29
|
+
@Ignore
|
30
|
+
@Test
|
31
|
+
fun clocksWithHourOverflow() {
|
32
|
+
assertEquals(Clock(10, 37), Clock(34, 37))
|
33
|
+
}
|
34
|
+
|
35
|
+
@Ignore
|
36
|
+
@Test
|
37
|
+
fun clocksWithHourOverflowBySeveralDays() {
|
38
|
+
assertEquals(Clock(3, 11), Clock(99, 11))
|
39
|
+
}
|
40
|
+
|
41
|
+
@Ignore
|
42
|
+
@Test
|
43
|
+
fun clocksWithNegateHour() {
|
44
|
+
assertEquals(Clock(22, 40), Clock(-2, 40))
|
45
|
+
}
|
46
|
+
|
47
|
+
@Ignore
|
48
|
+
@Test
|
49
|
+
fun clocksWithNegativeHourThatWraps() {
|
50
|
+
assertEquals(Clock(17, 3), Clock(-31, 3))
|
51
|
+
}
|
52
|
+
|
53
|
+
@Ignore
|
54
|
+
@Test
|
55
|
+
fun clocksWithNegativeHourThatWrapsMultipleTimes() {
|
56
|
+
assertEquals(Clock(13, 49), Clock(-83, 49))
|
57
|
+
}
|
58
|
+
|
59
|
+
@Ignore
|
60
|
+
@Test
|
61
|
+
fun clocksWithMinuteOverflow() {
|
62
|
+
assertEquals(Clock(0, 1), Clock(0, 1441))
|
63
|
+
}
|
64
|
+
|
65
|
+
@Ignore
|
66
|
+
@Test
|
67
|
+
fun clocksWithMinuteOverflowBySeveralDays() {
|
68
|
+
assertEquals(Clock(2, 2), Clock(2, 4322))
|
69
|
+
}
|
70
|
+
|
71
|
+
@Ignore
|
72
|
+
@Test
|
73
|
+
fun clocksWithNegativeMinutes() {
|
74
|
+
assertEquals(Clock(2, 40), Clock(3, -20))
|
75
|
+
}
|
76
|
+
|
77
|
+
@Ignore
|
78
|
+
@Test
|
79
|
+
fun clocksWithNegativeMinutesThatWraps() {
|
80
|
+
assertEquals(Clock(4, 10), Clock(5, -1490))
|
81
|
+
}
|
82
|
+
|
83
|
+
@Ignore
|
84
|
+
@Test
|
85
|
+
fun clocksWithNegativeMinutesThatWrapsMultipleTimes() {
|
86
|
+
assertEquals(Clock(6, 15), Clock(6, -4305))
|
87
|
+
}
|
88
|
+
|
89
|
+
@Ignore
|
90
|
+
@Test
|
91
|
+
fun clocksWithNegativeHoursAndMinutes() {
|
92
|
+
assertEquals(Clock(7, 32), Clock(-12, -268))
|
93
|
+
}
|
94
|
+
|
95
|
+
@Ignore
|
96
|
+
@Test
|
97
|
+
fun clocksWithNegativeHoursAndMinutesThatWrap() {
|
98
|
+
assertEquals(Clock(18, 7), Clock(-54, -11513))
|
99
|
+
}
|
100
|
+
|
101
|
+
}
|
@@ -2,11 +2,13 @@ include 'hello-world'
|
|
2
2
|
include 'accumulate'
|
3
3
|
include 'acronym'
|
4
4
|
include 'allergies'
|
5
|
+
include 'all-your-base'
|
5
6
|
include 'anagram'
|
6
7
|
include 'atbash-cipher'
|
7
8
|
include 'beer-song'
|
8
9
|
include 'binary'
|
9
10
|
include 'bob'
|
11
|
+
include 'clock'
|
10
12
|
include 'difference-of-squares'
|
11
13
|
include 'etl'
|
12
14
|
include 'flatten-array'
|
@@ -43,3 +45,4 @@ include 'change'
|
|
43
45
|
include 'binary-search'
|
44
46
|
include 'triangle'
|
45
47
|
include 'bank-account'
|
48
|
+
include 'sum-of-multiples'
|
@@ -0,0 +1,29 @@
|
|
1
|
+
buildscript {
|
2
|
+
ext.kotlin_version = '1.1.1'
|
3
|
+
repositories {
|
4
|
+
mavenCentral()
|
5
|
+
}
|
6
|
+
dependencies {
|
7
|
+
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
8
|
+
}
|
9
|
+
}
|
10
|
+
|
11
|
+
apply plugin: 'kotlin'
|
12
|
+
|
13
|
+
repositories {
|
14
|
+
mavenCentral()
|
15
|
+
}
|
16
|
+
|
17
|
+
dependencies {
|
18
|
+
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
|
19
|
+
|
20
|
+
testCompile 'junit:junit:4.12'
|
21
|
+
testCompile "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version"
|
22
|
+
}
|
23
|
+
|
24
|
+
test {
|
25
|
+
testLogging {
|
26
|
+
exceptionFormat = 'full'
|
27
|
+
events = ["passed", "failed", "skipped"]
|
28
|
+
}
|
29
|
+
}
|
File without changes
|
@@ -0,0 +1,84 @@
|
|
1
|
+
import org.junit.Ignore
|
2
|
+
import org.junit.Test
|
3
|
+
import kotlin.test.assertEquals
|
4
|
+
|
5
|
+
class SumOfMultiplesTest {
|
6
|
+
|
7
|
+
@Test
|
8
|
+
fun `multiples of 3 or 5 up to 1`() {
|
9
|
+
assertEquals(0, SumOfMultiples.sum(setOf(3, 5), 1))
|
10
|
+
}
|
11
|
+
|
12
|
+
@Test
|
13
|
+
@Ignore
|
14
|
+
fun `multiples of 3 or 5 up to 4`() {
|
15
|
+
assertEquals(3, SumOfMultiples.sum(setOf(3, 5), 4))
|
16
|
+
}
|
17
|
+
|
18
|
+
@Test
|
19
|
+
@Ignore
|
20
|
+
fun `multiples of 3 or 5 up to 10`() {
|
21
|
+
assertEquals(23, SumOfMultiples.sum(setOf(3, 5), 10))
|
22
|
+
}
|
23
|
+
|
24
|
+
@Test
|
25
|
+
@Ignore
|
26
|
+
fun `multiples of 3 or 5 up to 20`() {
|
27
|
+
assertEquals(78, SumOfMultiples.sum(setOf(3, 5), 20))
|
28
|
+
}
|
29
|
+
|
30
|
+
@Test
|
31
|
+
@Ignore
|
32
|
+
fun `multiples of 3 or 5 up to 100`() {
|
33
|
+
assertEquals(2318, SumOfMultiples.sum(setOf(3, 5), 100))
|
34
|
+
}
|
35
|
+
|
36
|
+
@Test
|
37
|
+
@Ignore
|
38
|
+
fun `multiples of 3 or 5 up to 1000`() {
|
39
|
+
assertEquals(233_168, SumOfMultiples.sum(setOf(3, 5), 1000))
|
40
|
+
}
|
41
|
+
|
42
|
+
@Test
|
43
|
+
@Ignore
|
44
|
+
fun `multiples of 7, 13 or 17 up to 20`() {
|
45
|
+
assertEquals(51, SumOfMultiples.sum(setOf(7, 13, 17), 20))
|
46
|
+
}
|
47
|
+
|
48
|
+
@Test
|
49
|
+
@Ignore
|
50
|
+
fun `multiples of 4 or 6 up to 15`() {
|
51
|
+
assertEquals(30, SumOfMultiples.sum(setOf(4, 6), 15))
|
52
|
+
}
|
53
|
+
|
54
|
+
@Test
|
55
|
+
@Ignore
|
56
|
+
fun `multiples of 5, 6 or 8 up to 150`() {
|
57
|
+
assertEquals(4419, SumOfMultiples.sum(setOf(5, 6, 8), 150))
|
58
|
+
}
|
59
|
+
|
60
|
+
@Test
|
61
|
+
@Ignore
|
62
|
+
fun `multiples of 5 or 25 up to 51`() {
|
63
|
+
assertEquals(275, SumOfMultiples.sum(setOf(5, 25), 51))
|
64
|
+
}
|
65
|
+
|
66
|
+
@Test
|
67
|
+
@Ignore
|
68
|
+
fun `multiples of 43 or 47 up to 10000`() {
|
69
|
+
assertEquals(2_203_160, SumOfMultiples.sum(setOf(43, 47), 10_000))
|
70
|
+
}
|
71
|
+
|
72
|
+
@Test
|
73
|
+
@Ignore
|
74
|
+
fun `multiples of 1 up to 100`() {
|
75
|
+
assertEquals(4950, SumOfMultiples.sum(setOf(1), 100))
|
76
|
+
}
|
77
|
+
|
78
|
+
@Test
|
79
|
+
@Ignore
|
80
|
+
fun `multiples of an empty set up to 10000`() {
|
81
|
+
assertEquals(0, SumOfMultiples.sum(emptySet(), 10_000))
|
82
|
+
}
|
83
|
+
|
84
|
+
}
|
@@ -45,8 +45,8 @@ class SchoolTest(unittest.TestCase):
|
|
45
45
|
students = [(3, ("Kyle", )), (4, ("Christopher", "Jennifer", )),
|
46
46
|
(6, ("Kareem", ))]
|
47
47
|
|
48
|
-
for grade, students_in_grade in students:
|
49
|
-
for student in students_in_grade:
|
48
|
+
for grade, students_in_grade in students[::-1]:
|
49
|
+
for student in students_in_grade[::-1]:
|
50
50
|
self.school.add(student, grade)
|
51
51
|
|
52
52
|
result = self.school.sort()
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trackler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.1.0.
|
4
|
+
version: 2.1.0.23
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Katrina Owen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-05-
|
11
|
+
date: 2017-05-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|
@@ -4271,7 +4271,6 @@ files:
|
|
4271
4271
|
- tracks/java/.git
|
4272
4272
|
- tracks/java/.gitattributes
|
4273
4273
|
- tracks/java/.github/PULL_REQUEST_TEMPLATE.md
|
4274
|
-
- tracks/java/.github/stale.yml
|
4275
4274
|
- tracks/java/.gitignore
|
4276
4275
|
- tracks/java/.keep
|
4277
4276
|
- tracks/java/.travis.yml
|
@@ -4921,6 +4920,10 @@ files:
|
|
4921
4920
|
- tracks/kotlin/exercises/acronym/src/example/kotlin/Acronym.kt
|
4922
4921
|
- tracks/kotlin/exercises/acronym/src/main/kotlin/.keep
|
4923
4922
|
- tracks/kotlin/exercises/acronym/src/test/kotlin/AcronymTest.kt
|
4923
|
+
- tracks/kotlin/exercises/all-your-base/build.gradle
|
4924
|
+
- tracks/kotlin/exercises/all-your-base/src/example/kotlin/BaseConverter.kt
|
4925
|
+
- tracks/kotlin/exercises/all-your-base/src/main/kotlin/.keep
|
4926
|
+
- tracks/kotlin/exercises/all-your-base/src/test/kotlin/BaseConverterTest.kt
|
4924
4927
|
- tracks/kotlin/exercises/allergies/build.gradle
|
4925
4928
|
- tracks/kotlin/exercises/allergies/src/example/kotlin/Allergen.kt
|
4926
4929
|
- tracks/kotlin/exercises/allergies/src/example/kotlin/Allergies.kt
|
@@ -4963,6 +4966,12 @@ files:
|
|
4963
4966
|
- tracks/kotlin/exercises/change/src/example/kotlin/Change.kt
|
4964
4967
|
- tracks/kotlin/exercises/change/src/main/kotlin/.keep
|
4965
4968
|
- tracks/kotlin/exercises/change/src/test/kotlin/ChangeTest.kt
|
4969
|
+
- tracks/kotlin/exercises/clock/build.gradle
|
4970
|
+
- tracks/kotlin/exercises/clock/src/example/kotlin/Clock.kt
|
4971
|
+
- tracks/kotlin/exercises/clock/src/main/kotlin/.keep
|
4972
|
+
- tracks/kotlin/exercises/clock/src/test/kotlin/ClockAddTest.kt
|
4973
|
+
- tracks/kotlin/exercises/clock/src/test/kotlin/ClockCreationTest.kt
|
4974
|
+
- tracks/kotlin/exercises/clock/src/test/kotlin/ClockEqualTest.kt
|
4966
4975
|
- tracks/kotlin/exercises/difference-of-squares/build.gradle
|
4967
4976
|
- tracks/kotlin/exercises/difference-of-squares/src/example/kotlin/Squares.kt
|
4968
4977
|
- tracks/kotlin/exercises/difference-of-squares/src/main/kotlin/.keep
|
@@ -5094,6 +5103,10 @@ files:
|
|
5094
5103
|
- tracks/kotlin/exercises/strain/src/example/kotlin/Strain.kt
|
5095
5104
|
- tracks/kotlin/exercises/strain/src/main/kotlin/.keep
|
5096
5105
|
- tracks/kotlin/exercises/strain/src/test/kotlin/StrainTest.kt
|
5106
|
+
- tracks/kotlin/exercises/sum-of-multiples/build.gradle
|
5107
|
+
- tracks/kotlin/exercises/sum-of-multiples/src/example/kotlin/SumOfMultiples.kt
|
5108
|
+
- tracks/kotlin/exercises/sum-of-multiples/src/main/kotlin/.keep
|
5109
|
+
- tracks/kotlin/exercises/sum-of-multiples/src/test/kotlin/SumOfMultiplesTest.kt
|
5097
5110
|
- tracks/kotlin/exercises/triangle/build.gradle
|
5098
5111
|
- tracks/kotlin/exercises/triangle/src/example/kotlin/Triangle.kt
|
5099
5112
|
- tracks/kotlin/exercises/triangle/src/main/kotlin/.keep
|