trackler 2.2.1.70 → 2.2.1.71
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/c/exercises/all-your-base/src/example.c +1 -1
- data/tracks/c/exercises/beer-song/src/example.c +2 -2
- data/tracks/c/exercises/meetup/src/example.c +3 -4
- data/tracks/c/exercises/nucleotide-count/src/example.c +1 -1
- data/tracks/c/exercises/raindrops/src/example.c +1 -1
- data/tracks/c/exercises/sieve/src/example.c +1 -2
- data/tracks/delphi/docs/EXERCISE_README_INSERT.md +1 -1
- data/tracks/java/exercises/binary-search-tree/.meta/src/reference/java/BinarySearchTree.java +8 -8
- data/tracks/java/exercises/book-store/.meta/src/reference/java/BookStore.java +30 -30
- data/tracks/java/exercises/bowling/.meta/src/reference/java/BowlingGame.java +4 -4
- data/tracks/java/exercises/bowling/src/test/java/BowlingTest.java +11 -11
- data/tracks/java/exercises/collatz-conjecture/src/main/java/CollatzCalculator.java +7 -0
- data/tracks/java/exercises/difference-of-squares/src/main/java/DifferenceOfSquaresCalculator.java +15 -0
- data/tracks/python/exercises/beer-song/example.py +8 -6
- data/tracks/python/exercises/clock/example.py +1 -1
- data/tracks/python/exercises/nucleotide-count/example.py +1 -1
- data/tracks/python/exercises/phone-number/example.py +3 -3
- data/tracks/python/exercises/protein-translation/example.py +1 -1
- data/tracks/python/exercises/say/example.py +1 -1
- data/tracks/python/exercises/two-fer/example.py +1 -1
- data/tracks/ruby/exercises/minesweeper/.meta/solutions/minesweeper.rb +3 -5
- data/tracks/ruby/exercises/minesweeper/minesweeper_test.rb +3 -3
- data/tracks/scala/config.json +12 -12
- data/tracks/scala/exercises/flatten-array/src/test/scala/FlattenArrayTest.scala +7 -10
- data/tracks/scala/testgen/src/main/scala/FlattenArrayTestGenerator.scala +44 -0
- metadata +5 -4
- data/tracks/java/exercises/collatz-conjecture/src/main/java/.keep +0 -0
- data/tracks/java/exercises/difference-of-squares/src/main/java/.keep +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 035f344758e70ee0d97c2246e5cfdf0878ec339b
|
4
|
+
data.tar.gz: 7b52f923df0cb958c251e599a75de951173521ee
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cdbc6ff2470de2c426509584b99d3853b3f59c25f6942883f8902a3acc8baae255f23b8f202758f3ea646d63c98d11acec4cedf6c78d5c64731737390b0ebb99
|
7
|
+
data.tar.gz: a47dc3a6adc5811139e22b25216924c2b669088bc12def99668fb36fec8cc69dbbb8571b4281981c5bdb427cb9373289e931c6df766732230dabafd286cb3cb8
|
data/lib/trackler/version.rb
CHANGED
@@ -8,7 +8,7 @@ size_t rebase(int8_t digits[DIGITS_ARRAY_SIZE], int16_t from_base,
|
|
8
8
|
uint16_t denary = 0;
|
9
9
|
size_t new_num_digits = 0;
|
10
10
|
|
11
|
-
if ((from_base <= 1) || (to_base <= 1) || (num_digits
|
11
|
+
if ((from_base <= 1) || (to_base <= 1) || (num_digits == 0))
|
12
12
|
return 0; /* invalid bases or length */
|
13
13
|
if (digits[0] == 0)
|
14
14
|
return 0; /* leading zeros */
|
@@ -24,8 +24,8 @@ static unsigned int get_verse(char *buffer, unsigned int verse_number)
|
|
24
24
|
} else if (verse_number <= 99) {
|
25
25
|
bytes_written =
|
26
26
|
sprintf(buffer,
|
27
|
-
"%
|
28
|
-
"Take one down and pass it around, %
|
27
|
+
"%u bottles of beer on the wall, %u bottles of beer.\n"
|
28
|
+
"Take one down and pass it around, %u bottles of beer on the wall.\n",
|
29
29
|
verse_number, verse_number, verse_number - 1);
|
30
30
|
}
|
31
31
|
|
@@ -108,16 +108,15 @@ int meetup_day_of_month(unsigned int year, unsigned int month, const char *week,
|
|
108
108
|
const char *day_of_week)
|
109
109
|
{
|
110
110
|
int day_of_month = BAD_DATE_REQUESTED;
|
111
|
-
int baseline_day_of_week;
|
112
111
|
int days_in_test_month = days_in_month(year, month);
|
113
|
-
int day_offset;
|
114
|
-
int reference_day = 1; // used to calculate a baseline day of week given a target date.
|
115
112
|
|
116
113
|
int which_week_of_month = get_week_of_month(week);
|
117
114
|
int target_day_in_week = get_requested_day_of_week(day_of_week);
|
118
115
|
|
119
116
|
// check for valid lookup...
|
120
117
|
if ((which_week_of_month >= 0) && (target_day_in_week >= 0)) {
|
118
|
+
int day_offset;
|
119
|
+
int reference_day = 1; // used to calculate a baseline day of week given a target date.
|
121
120
|
// first - fifth Xday of month
|
122
121
|
if (which_week_of_month <= 5) {
|
123
122
|
day_offset = 1 + ((which_week_of_month - 1) * 7);
|
@@ -130,7 +129,7 @@ int meetup_day_of_month(unsigned int year, unsigned int month, const char *week,
|
|
130
129
|
}
|
131
130
|
day_offset = reference_day;
|
132
131
|
}
|
133
|
-
baseline_day_of_week =
|
132
|
+
int baseline_day_of_week =
|
134
133
|
get_day_of_week_from_date(year, month, reference_day);
|
135
134
|
day_of_month =
|
136
135
|
day_offset + ((target_day_in_week + 7 - baseline_day_of_week) % 7);
|
@@ -36,7 +36,7 @@ char *count(const char *dna_strand)
|
|
36
36
|
}
|
37
37
|
|
38
38
|
if (!invalid_char) {
|
39
|
-
sprintf(count_results, "A:%
|
39
|
+
sprintf(count_results, "A:%zu C:%zu G:%zu T:%zu", nucleotide_a_count,
|
40
40
|
nucleotide_c_count, nucleotide_g_count, nucleotide_t_count);
|
41
41
|
}
|
42
42
|
return count_results;
|
@@ -6,14 +6,13 @@
|
|
6
6
|
unsigned int sieve(const unsigned int limit, primes_array_t primes)
|
7
7
|
{
|
8
8
|
unsigned int number_of_primes = 0;
|
9
|
-
unsigned char *number_is_prime;
|
10
9
|
|
11
10
|
// clear the results
|
12
11
|
memset(primes, 0, sizeof(*primes));
|
13
12
|
|
14
13
|
if (limit > 1) {
|
15
14
|
//allocate 1 more than limit for convenience so the number and the index are same
|
16
|
-
number_is_prime = malloc(limit + 1);
|
15
|
+
unsigned char *number_is_prime = malloc(limit + 1);
|
17
16
|
memset(number_is_prime, 1, limit + 1);
|
18
17
|
|
19
18
|
unsigned int max_factor = sqrt(limit) + 1;
|
@@ -1,7 +1,7 @@
|
|
1
1
|
## Testing
|
2
2
|
|
3
3
|
In order to run the tests for this track, you will need to install
|
4
|
-
DUnitX. Please see the [installation](http://www.exercism.io/languages/delphi/
|
4
|
+
DUnitX. Please see the [installation](http://www.exercism.io/languages/delphi/installation) instructions for more information.
|
5
5
|
|
6
6
|
### Loading Exercises into Delphi
|
7
7
|
|
data/tracks/java/exercises/binary-search-tree/.meta/src/reference/java/BinarySearchTree.java
CHANGED
@@ -9,20 +9,20 @@ class BinarySearchTree<T extends Comparable<T>> {
|
|
9
9
|
if (root == null) {
|
10
10
|
root = new Node<>(value);
|
11
11
|
} else {
|
12
|
-
|
12
|
+
insert(root, value);
|
13
13
|
}
|
14
|
-
|
14
|
+
nodeCount++;
|
15
15
|
}
|
16
16
|
|
17
17
|
List<T> getAsSortedList() {
|
18
|
-
List<T> result = new ArrayList<>(
|
19
|
-
|
18
|
+
List<T> result = new ArrayList<>(nodeCount);
|
19
|
+
putInSortedOrderToList(root, result);
|
20
20
|
return Collections.unmodifiableList(result);
|
21
21
|
}
|
22
22
|
|
23
23
|
List<T> getAsLevelOrderList() {
|
24
|
-
List<T> result = new ArrayList<>(
|
25
|
-
|
24
|
+
List<T> result = new ArrayList<>(nodeCount);
|
25
|
+
putInLevelOrderToList(root, result);
|
26
26
|
return Collections.unmodifiableList(result);
|
27
27
|
}
|
28
28
|
|
@@ -33,13 +33,13 @@ class BinarySearchTree<T extends Comparable<T>> {
|
|
33
33
|
private void insert(Node<T> node, T value) {
|
34
34
|
if (value.compareTo(node.getData()) <= 0) {
|
35
35
|
if (node.getLeft() == null) {
|
36
|
-
node.setLeft(new Node
|
36
|
+
node.setLeft(new Node<>(value));
|
37
37
|
} else {
|
38
38
|
insert(node.getLeft(), value);
|
39
39
|
}
|
40
40
|
} else {
|
41
41
|
if (node.getRight() == null) {
|
42
|
-
node.setRight(new Node
|
42
|
+
node.setRight(new Node<>(value));
|
43
43
|
} else {
|
44
44
|
insert(node.getRight(), value);
|
45
45
|
}
|
@@ -4,47 +4,47 @@ import java.util.stream.Collectors;
|
|
4
4
|
|
5
5
|
class BookStore {
|
6
6
|
|
7
|
-
|
7
|
+
private static final int BOOK_PRICE = 8, MAX_GROUP_SIZE = 5;
|
8
8
|
|
9
|
-
|
9
|
+
private static double[] DISCOUNT_TIERS = {0, 5, 10, 20, 25};
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
}
|
14
|
-
|
15
|
-
private double calculateBasketCost(final List<Integer> books, final double priceSoFar) {
|
16
|
-
if (books.size() == 0) {
|
17
|
-
return priceSoFar;
|
11
|
+
double calculateBasketCost(final List<Integer> books) {
|
12
|
+
return calculateBasketCost(books, 0);
|
18
13
|
}
|
19
14
|
|
20
|
-
List<Integer>
|
21
|
-
.
|
22
|
-
|
15
|
+
private double calculateBasketCost(final List<Integer> books, final double priceSoFar) {
|
16
|
+
if (books.size() == 0) {
|
17
|
+
return priceSoFar;
|
18
|
+
}
|
23
19
|
|
24
|
-
|
20
|
+
List<Integer> availableBookNumbers = books.stream()
|
21
|
+
.distinct()
|
22
|
+
.collect(Collectors.toList());
|
25
23
|
|
26
|
-
|
27
|
-
List<Integer> newGroupBooks = new ArrayList<>(availableBookNumbers.subList(0, i + 1));
|
28
|
-
List<Integer> remainingBooks = new ArrayList<>(books);
|
24
|
+
double minPrice = Double.MAX_VALUE;
|
29
25
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
}
|
26
|
+
for (int i = 0; i < availableBookNumbers.size(); i++) {
|
27
|
+
List<Integer> newGroupBooks = new ArrayList<>(availableBookNumbers.subList(0, i + 1));
|
28
|
+
List<Integer> remainingBooks = new ArrayList<>(books);
|
34
29
|
|
35
|
-
|
36
|
-
|
37
|
-
|
30
|
+
for (final Integer newGroupBook : newGroupBooks) {
|
31
|
+
//noinspection UseBulkOperation - we want to remove _one_ of each book number, not _all_ of each book number.
|
32
|
+
remainingBooks.remove(newGroupBook);
|
33
|
+
}
|
38
34
|
|
39
|
-
|
40
|
-
|
35
|
+
double price = calculateBasketCost(remainingBooks, priceSoFar + costOfGroupSize(newGroupBooks.size()));
|
36
|
+
minPrice = Math.min(minPrice, price);
|
37
|
+
}
|
41
38
|
|
42
|
-
|
43
|
-
if (groupSize < 1 || groupSize > MAX_GROUP_SIZE) {
|
44
|
-
throw new IllegalStateException("Invalid group size : " + groupSize);
|
39
|
+
return minPrice;
|
45
40
|
}
|
46
41
|
|
47
|
-
|
48
|
-
|
42
|
+
private double costOfGroupSize(int groupSize) {
|
43
|
+
if (groupSize < 1 || groupSize > MAX_GROUP_SIZE) {
|
44
|
+
throw new IllegalStateException("Invalid group size : " + groupSize);
|
45
|
+
}
|
46
|
+
|
47
|
+
return BOOK_PRICE * groupSize * (100 - DISCOUNT_TIERS[groupSize - 1]) / 100;
|
48
|
+
}
|
49
49
|
|
50
50
|
}
|
@@ -1,16 +1,16 @@
|
|
1
1
|
import java.util.ArrayList;
|
2
2
|
import java.util.List;
|
3
3
|
|
4
|
-
|
4
|
+
class BowlingGame {
|
5
5
|
private static final int NUMBER_OF_FRAMES = 10;
|
6
6
|
private static final int MAXIMUM_FRAME_SCORE = 10;
|
7
|
-
private List<Integer> rolls = new ArrayList
|
7
|
+
private List<Integer> rolls = new ArrayList<>();
|
8
8
|
|
9
|
-
|
9
|
+
void roll(int pins) {
|
10
10
|
rolls.add(pins);
|
11
11
|
}
|
12
12
|
|
13
|
-
|
13
|
+
int score() {
|
14
14
|
int score = 0;
|
15
15
|
int frameIndex = 0;
|
16
16
|
|
@@ -150,7 +150,7 @@ public class BowlingTest {
|
|
150
150
|
|
151
151
|
@Ignore("Remove to run test")
|
152
152
|
@Test
|
153
|
-
public void rollsCanNotScoreNegativePoints()
|
153
|
+
public void rollsCanNotScoreNegativePoints() {
|
154
154
|
int[] rolls = {-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
155
155
|
|
156
156
|
playGame(rolls);
|
@@ -163,7 +163,7 @@ public class BowlingTest {
|
|
163
163
|
|
164
164
|
@Ignore("Remove to run test")
|
165
165
|
@Test
|
166
|
-
public void aRollCanNotScoreMoreThan10Points()
|
166
|
+
public void aRollCanNotScoreMoreThan10Points() {
|
167
167
|
int[] rolls = {11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
168
168
|
|
169
169
|
playGame(rolls);
|
@@ -176,7 +176,7 @@ public class BowlingTest {
|
|
176
176
|
|
177
177
|
@Ignore("Remove to run test")
|
178
178
|
@Test
|
179
|
-
public void twoRollsInAFrameCanNotScoreMoreThan10Points()
|
179
|
+
public void twoRollsInAFrameCanNotScoreMoreThan10Points() {
|
180
180
|
int[] rolls = {5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
181
181
|
|
182
182
|
playGame(rolls);
|
@@ -189,7 +189,7 @@ public class BowlingTest {
|
|
189
189
|
|
190
190
|
@Ignore("Remove to run test")
|
191
191
|
@Test
|
192
|
-
public void twoBonusRollsAfterAStrikeInTheLastFrameCanNotScoreMoreThan10Points()
|
192
|
+
public void twoBonusRollsAfterAStrikeInTheLastFrameCanNotScoreMoreThan10Points() {
|
193
193
|
int[] rolls = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 5, 6};
|
194
194
|
|
195
195
|
playGame(rolls);
|
@@ -202,7 +202,7 @@ public class BowlingTest {
|
|
202
202
|
|
203
203
|
@Ignore("Remove to run test")
|
204
204
|
@Test
|
205
|
-
public void twoBonusRollsAfterAStrikeInTheLastFrameCanScoreMoreThan10PointsIfOneIsAStrike()
|
205
|
+
public void twoBonusRollsAfterAStrikeInTheLastFrameCanScoreMoreThan10PointsIfOneIsAStrike() {
|
206
206
|
int[] rolls = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 6};
|
207
207
|
|
208
208
|
playGame(rolls);
|
@@ -212,7 +212,7 @@ public class BowlingTest {
|
|
212
212
|
|
213
213
|
@Ignore("Remove to run test")
|
214
214
|
@Test
|
215
|
-
public void anUnstartedGameCanNotBeScored()
|
215
|
+
public void anUnstartedGameCanNotBeScored() {
|
216
216
|
int[] rolls = new int[0];
|
217
217
|
|
218
218
|
playGame(rolls);
|
@@ -225,7 +225,7 @@ public class BowlingTest {
|
|
225
225
|
|
226
226
|
@Ignore("Remove to run test")
|
227
227
|
@Test
|
228
|
-
public void anIncompleteGameCanNotBeScored()
|
228
|
+
public void anIncompleteGameCanNotBeScored() {
|
229
229
|
int[] rolls = {0, 0};
|
230
230
|
|
231
231
|
playGame(rolls);
|
@@ -238,7 +238,7 @@ public class BowlingTest {
|
|
238
238
|
|
239
239
|
@Ignore("Remove to run test")
|
240
240
|
@Test
|
241
|
-
public void aGameWithMoreThanTenFramesCanNotBeScored()
|
241
|
+
public void aGameWithMoreThanTenFramesCanNotBeScored() {
|
242
242
|
int[] rolls = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
243
243
|
|
244
244
|
playGame(rolls);
|
@@ -251,7 +251,7 @@ public class BowlingTest {
|
|
251
251
|
|
252
252
|
@Ignore("Remove to run test")
|
253
253
|
@Test
|
254
|
-
public void bonusRollsForAStrikeInTheLastFrameMustBeRolledBeforeScoreCanBeCalculated()
|
254
|
+
public void bonusRollsForAStrikeInTheLastFrameMustBeRolledBeforeScoreCanBeCalculated() {
|
255
255
|
int[] rolls = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10};
|
256
256
|
|
257
257
|
playGame(rolls);
|
@@ -264,7 +264,7 @@ public class BowlingTest {
|
|
264
264
|
|
265
265
|
@Ignore("Remove to run test")
|
266
266
|
@Test
|
267
|
-
public void bothBonusRollsForAStrikeInTheLastFrameMustBeRolledBeforeScoreCanBeCalculated()
|
267
|
+
public void bothBonusRollsForAStrikeInTheLastFrameMustBeRolledBeforeScoreCanBeCalculated() {
|
268
268
|
int[] rolls = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10};
|
269
269
|
|
270
270
|
playGame(rolls);
|
@@ -277,7 +277,7 @@ public class BowlingTest {
|
|
277
277
|
|
278
278
|
@Ignore("Remove to run test")
|
279
279
|
@Test
|
280
|
-
public void bonusRollForASpareInTheLastFrameMustBeRolledBeforeScoreCanBeCalculated()
|
280
|
+
public void bonusRollForASpareInTheLastFrameMustBeRolledBeforeScoreCanBeCalculated() {
|
281
281
|
int[] rolls = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 3};
|
282
282
|
|
283
283
|
playGame(rolls);
|
data/tracks/java/exercises/difference-of-squares/src/main/java/DifferenceOfSquaresCalculator.java
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
class DifferenceOfSquaresCalculator {
|
2
|
+
|
3
|
+
int computeSquareOfSumTo(int input) {
|
4
|
+
throw new UnsupportedOperationException("Delete this statement and write your own implementation.");
|
5
|
+
}
|
6
|
+
|
7
|
+
int computeSumOfSquaresTo(int input) {
|
8
|
+
throw new UnsupportedOperationException("Delete this statement and write your own implementation.");
|
9
|
+
}
|
10
|
+
|
11
|
+
int computeDifferenceOfSquares(int input) {
|
12
|
+
throw new UnsupportedOperationException("Delete this statement and write your own implementation.");
|
13
|
+
}
|
14
|
+
|
15
|
+
}
|
@@ -8,8 +8,8 @@ def song(first, last=0):
|
|
8
8
|
|
9
9
|
def verse(number):
|
10
10
|
return ''.join([
|
11
|
-
"
|
12
|
-
"
|
11
|
+
"{} of beer on the wall, ".format(_bottles(number).capitalize()),
|
12
|
+
"{} of beer.\n".format(_bottles(number)),
|
13
13
|
_action(number),
|
14
14
|
_next_bottle(number),
|
15
15
|
])
|
@@ -19,13 +19,15 @@ def _action(current_verse):
|
|
19
19
|
if current_verse == 0:
|
20
20
|
return "Go to the store and buy some more, "
|
21
21
|
else:
|
22
|
-
return "Take
|
23
|
-
"one" if current_verse > 1 else "it"
|
22
|
+
return "Take {} down and pass it around, ".format(
|
23
|
+
"one" if current_verse > 1 else "it",
|
24
24
|
)
|
25
25
|
|
26
26
|
|
27
27
|
def _next_bottle(current_verse):
|
28
|
-
return "
|
28
|
+
return "{} of beer on the wall.\n".format(
|
29
|
+
_bottles(_next_verse(current_verse)),
|
30
|
+
)
|
29
31
|
|
30
32
|
|
31
33
|
def _bottles(number):
|
@@ -34,7 +36,7 @@ def _bottles(number):
|
|
34
36
|
if number == 1:
|
35
37
|
return '1 bottle'
|
36
38
|
else:
|
37
|
-
return '
|
39
|
+
return '{} bottles'.format(number)
|
38
40
|
|
39
41
|
|
40
42
|
def _next_verse(current_verse):
|
@@ -9,15 +9,15 @@ class Phone(object):
|
|
9
9
|
self.subscriber_number = self.number[-4:]
|
10
10
|
|
11
11
|
def pretty(self):
|
12
|
-
return "(
|
12
|
+
return "({}) {}-{}".format(
|
13
13
|
self.area_code,
|
14
14
|
self.exchange_code,
|
15
|
-
self.subscriber_number
|
15
|
+
self.subscriber_number,
|
16
16
|
)
|
17
17
|
|
18
18
|
def _clean(self, number):
|
19
19
|
return self._normalize(
|
20
|
-
re.sub(r'[^\d]', '', number)
|
20
|
+
re.sub(r'[^\d]', '', number),
|
21
21
|
)
|
22
22
|
|
23
23
|
def _normalize(self, number):
|
@@ -12,7 +12,7 @@ def say(number, recursive=False):
|
|
12
12
|
if number < 0:
|
13
13
|
raise ValueError('number is negative')
|
14
14
|
if number >= t:
|
15
|
-
raise ValueError('number is too large:
|
15
|
+
raise ValueError('number is too large: {}'.format(number))
|
16
16
|
|
17
17
|
if number < 20:
|
18
18
|
return small[number] if not recursive else 'and ' + small[number]
|
@@ -64,7 +64,7 @@ class Board
|
|
64
64
|
def validate_size
|
65
65
|
len = rows.first.length
|
66
66
|
if rows.any? { |row| row.length != len }
|
67
|
-
fail
|
67
|
+
fail ArgumentError, 'Invalid board'
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
@@ -73,7 +73,7 @@ class Board
|
|
73
73
|
invalid = row.chars.any? do |char|
|
74
74
|
!VALID_BORDERS.include?(char)
|
75
75
|
end
|
76
|
-
fail
|
76
|
+
fail ArgumentError, 'Invalid board' if invalid
|
77
77
|
end
|
78
78
|
end
|
79
79
|
|
@@ -82,9 +82,7 @@ class Board
|
|
82
82
|
invalid = row.chars.any? do |char|
|
83
83
|
!VALID_DATA.include?(char)
|
84
84
|
end
|
85
|
-
fail
|
85
|
+
fail ArgumentError, 'Invalid board' if invalid
|
86
86
|
end
|
87
87
|
end
|
88
88
|
end
|
89
|
-
|
90
|
-
ValueError = Class.new(StandardError)
|
@@ -73,7 +73,7 @@ class MinesweeperTest < Minitest::Test
|
|
73
73
|
def test_different_len
|
74
74
|
skip
|
75
75
|
inp = ['+-+', '| |', '|* |', '| |', '+-+']
|
76
|
-
assert_raises(
|
76
|
+
assert_raises(ArgumentError) do
|
77
77
|
Board.transform(inp)
|
78
78
|
end
|
79
79
|
end
|
@@ -81,7 +81,7 @@ class MinesweeperTest < Minitest::Test
|
|
81
81
|
def test_faulty_border
|
82
82
|
skip
|
83
83
|
inp = ['+-----+', '* * |', '+-- --+']
|
84
|
-
assert_raises(
|
84
|
+
assert_raises(ArgumentError) do
|
85
85
|
Board.transform(inp)
|
86
86
|
end
|
87
87
|
end
|
@@ -89,7 +89,7 @@ class MinesweeperTest < Minitest::Test
|
|
89
89
|
def test_invalid_char
|
90
90
|
skip
|
91
91
|
inp = ['+-----+', '|X * |', '+-----+']
|
92
|
-
assert_raises(
|
92
|
+
assert_raises(ArgumentError) do
|
93
93
|
Board.transform(inp)
|
94
94
|
end
|
95
95
|
end
|
data/tracks/scala/config.json
CHANGED
@@ -34,18 +34,6 @@
|
|
34
34
|
"Mathematics"
|
35
35
|
]
|
36
36
|
},
|
37
|
-
{
|
38
|
-
"uuid": "825e94e5-6fc8-4dce-befe-74e1516fae14",
|
39
|
-
"slug": "flatten-array",
|
40
|
-
"core": true,
|
41
|
-
"unlocked_by": null,
|
42
|
-
"difficulty": 2,
|
43
|
-
"topics": [
|
44
|
-
"Recursion",
|
45
|
-
"Lists",
|
46
|
-
"Pattern matching"
|
47
|
-
]
|
48
|
-
},
|
49
37
|
{
|
50
38
|
"uuid": "57b76aba-a485-464d-84ba-e9a445b25be6",
|
51
39
|
"slug": "bob",
|
@@ -94,6 +82,18 @@
|
|
94
82
|
"Transforming"
|
95
83
|
]
|
96
84
|
},
|
85
|
+
{
|
86
|
+
"uuid": "825e94e5-6fc8-4dce-befe-74e1516fae14",
|
87
|
+
"slug": "flatten-array",
|
88
|
+
"core": true,
|
89
|
+
"unlocked_by": "accumulate",
|
90
|
+
"difficulty": 2,
|
91
|
+
"topics": [
|
92
|
+
"Recursion",
|
93
|
+
"Lists",
|
94
|
+
"Pattern matching"
|
95
|
+
]
|
96
|
+
},
|
97
97
|
{
|
98
98
|
"uuid": "65a76aba-a485-222d-84ba-e9a445b25be6",
|
99
99
|
"slug": "collatz-conjecture",
|
@@ -1,18 +1,15 @@
|
|
1
1
|
import org.scalatest.{Matchers, FunSuite}
|
2
2
|
|
3
|
+
/** @version 1.1.0 */
|
3
4
|
class FlattenArrayTest extends FunSuite with Matchers {
|
4
|
-
test("empty list") {
|
5
|
-
FlattenArray.flatten(List()) should equal(List())
|
6
|
-
}
|
7
5
|
|
8
6
|
test("no nesting") {
|
9
|
-
|
10
|
-
FlattenArray.flatten(List(0, 1, 2)) should equal(List(0, 1, 2))
|
7
|
+
FlattenArray.flatten(List(0, 1, 2)) should be(List(0, 1, 2))
|
11
8
|
}
|
12
9
|
|
13
10
|
test("flattens array with just integers present") {
|
14
11
|
pending
|
15
|
-
FlattenArray.flatten(List(1, List(2, 3, 4, 5, 6, 7), 8)) should
|
12
|
+
FlattenArray.flatten(List(1, List(2, 3, 4, 5, 6, 7), 8)) should be(
|
16
13
|
List(1, 2, 3, 4, 5, 6, 7, 8))
|
17
14
|
}
|
18
15
|
|
@@ -21,7 +18,7 @@ class FlattenArrayTest extends FunSuite with Matchers {
|
|
21
18
|
FlattenArray.flatten(List(0,
|
22
19
|
2,
|
23
20
|
List(List(2, 3), 8, 100, 4, List(List(List(50)))),
|
24
|
-
-2)) should
|
21
|
+
-2)) should be(
|
25
22
|
List(0, 2, 2, 3, 8, 100, 4, 50, -2))
|
26
23
|
}
|
27
24
|
|
@@ -30,7 +27,7 @@ class FlattenArrayTest extends FunSuite with Matchers {
|
|
30
27
|
FlattenArray.flatten(List(
|
31
28
|
1,
|
32
29
|
List(2, List(List(3)), List(4, List(List(5))), 6, 7),
|
33
|
-
8)) should
|
30
|
+
8)) should be(List(1, 2, 3, 4, 5, 6, 7, 8))
|
34
31
|
}
|
35
32
|
|
36
33
|
test("6 level nest list with null values") {
|
@@ -39,7 +36,7 @@ class FlattenArrayTest extends FunSuite with Matchers {
|
|
39
36
|
List(0,
|
40
37
|
2,
|
41
38
|
List(List(2, 3), 8, List(List(100)), null, List(List(null))),
|
42
|
-
-2)) should
|
39
|
+
-2)) should be(List(0, 2, 2, 3, 8, 100, -2))
|
43
40
|
}
|
44
41
|
|
45
42
|
test("all values in nested list are null") {
|
@@ -50,6 +47,6 @@ class FlattenArrayTest extends FunSuite with Matchers {
|
|
50
47
|
null,
|
51
48
|
null,
|
52
49
|
List(List(null, null), null),
|
53
|
-
null)) should
|
50
|
+
null)) should be(List())
|
54
51
|
}
|
55
52
|
}
|
@@ -0,0 +1,44 @@
|
|
1
|
+
import java.io.File
|
2
|
+
|
3
|
+
import testgen.TestSuiteBuilder._
|
4
|
+
import testgen._
|
5
|
+
|
6
|
+
object FlattenArrayTestGenerator {
|
7
|
+
def main(args: Array[String]): Unit = {
|
8
|
+
val file = new File("src/main/resources/flatten-array.json")
|
9
|
+
|
10
|
+
def sutArgs(parseResult: CanonicalDataParser.ParseResult, argNames: String*): String =
|
11
|
+
argNames map (name => toArgString(parseResult(name))) mkString ", "
|
12
|
+
|
13
|
+
def toArgString(any: Any): String = {
|
14
|
+
any match {
|
15
|
+
case xs: List[Any] => s"List(${xs.map(x => toArgString(x)).mkString(", ")})"
|
16
|
+
case null => "null"
|
17
|
+
case _ => any.toString
|
18
|
+
}
|
19
|
+
}
|
20
|
+
|
21
|
+
def toExpectedString(expected: CanonicalDataParser.Expected): String = {
|
22
|
+
expected match {
|
23
|
+
case Left(_) => throw new IllegalStateException()
|
24
|
+
case Right(xs: List[Any]) => s"List(${xs.mkString(", ")})"
|
25
|
+
}
|
26
|
+
}
|
27
|
+
|
28
|
+
def fromLabeledTest(argNames: String*): ToTestCaseData =
|
29
|
+
withLabeledTest { sut =>
|
30
|
+
labeledTest =>
|
31
|
+
val args = sutArgs(labeledTest.result, argNames: _*)
|
32
|
+
val property = labeledTest.property
|
33
|
+
val sutCall =
|
34
|
+
s"""$sut.$property($args)"""
|
35
|
+
val expected = toExpectedString(labeledTest.expected)
|
36
|
+
TestCaseData(labeledTest.description, sutCall, expected)
|
37
|
+
}
|
38
|
+
|
39
|
+
val code = TestSuiteBuilder.build(file, fromLabeledTest("input"))
|
40
|
+
println(s"-------------")
|
41
|
+
println(code)
|
42
|
+
println(s"-------------")
|
43
|
+
}
|
44
|
+
}
|
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.2.1.
|
4
|
+
version: 2.2.1.71
|
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-11-
|
11
|
+
date: 2017-11-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|
@@ -7103,7 +7103,7 @@ files:
|
|
7103
7103
|
- tracks/java/exercises/collatz-conjecture/.meta/version
|
7104
7104
|
- tracks/java/exercises/collatz-conjecture/README.md
|
7105
7105
|
- tracks/java/exercises/collatz-conjecture/build.gradle
|
7106
|
-
- tracks/java/exercises/collatz-conjecture/src/main/java
|
7106
|
+
- tracks/java/exercises/collatz-conjecture/src/main/java/CollatzCalculator.java
|
7107
7107
|
- tracks/java/exercises/collatz-conjecture/src/test/java/CollatzCalculatorTest.java
|
7108
7108
|
- tracks/java/exercises/complex-numbers/.meta/src/reference/java/ComplexNumber.java
|
7109
7109
|
- tracks/java/exercises/complex-numbers/.meta/version
|
@@ -7132,7 +7132,7 @@ files:
|
|
7132
7132
|
- tracks/java/exercises/difference-of-squares/.meta/version
|
7133
7133
|
- tracks/java/exercises/difference-of-squares/README.md
|
7134
7134
|
- tracks/java/exercises/difference-of-squares/build.gradle
|
7135
|
-
- tracks/java/exercises/difference-of-squares/src/main/java
|
7135
|
+
- tracks/java/exercises/difference-of-squares/src/main/java/DifferenceOfSquaresCalculator.java
|
7136
7136
|
- tracks/java/exercises/difference-of-squares/src/test/java/DifferenceOfSquaresCalculatorTest.java
|
7137
7137
|
- tracks/java/exercises/etl/.meta/src/reference/java/Etl.java
|
7138
7138
|
- tracks/java/exercises/etl/README.md
|
@@ -12808,6 +12808,7 @@ files:
|
|
12808
12808
|
- tracks/scala/testgen/src/main/scala/DifferenceOfSquaresTestGenerator.scala
|
12809
12809
|
- tracks/scala/testgen/src/main/scala/DominoesTestGenerator.scala
|
12810
12810
|
- tracks/scala/testgen/src/main/scala/EtlTestGenerator.scala
|
12811
|
+
- tracks/scala/testgen/src/main/scala/FlattenArrayTestGenerator.scala
|
12811
12812
|
- tracks/scala/testgen/src/main/scala/FoodChainTestGenerator.scala
|
12812
12813
|
- tracks/scala/testgen/src/main/scala/ForthTestGenerator.scala
|
12813
12814
|
- tracks/scala/testgen/src/main/scala/GigasecondTestGenerator.scala
|
File without changes
|
File without changes
|