trackler 2.1.0.22 → 2.1.0.23
Sign up to get free protection for your applications and to get access to all the features.
- 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
|