trackler 2.2.1.61 → 2.2.1.62
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/problem-specifications/exercises/forth/canonical-data.json +1 -7
- data/problem-specifications/exercises/meetup/description.md +16 -12
- data/problem-specifications/exercises/sum-of-multiples/description.md +3 -3
- data/tracks/c/config.json +14 -1
- data/tracks/c/exercises/anagram/src/anagram.h +19 -4
- data/tracks/c/exercises/anagram/src/example.c +27 -40
- data/tracks/c/exercises/anagram/test/test_anagram.c +100 -152
- data/tracks/c/exercises/sublist/README.md +53 -0
- data/tracks/c/exercises/sublist/makefile +15 -0
- data/tracks/c/exercises/sublist/src/example.c +63 -0
- data/tracks/c/exercises/sublist/src/sublist.h +17 -0
- data/tracks/c/exercises/sublist/test/test_sublist.c +243 -0
- data/tracks/c/exercises/sublist/test/vendor/unity.c +1300 -0
- data/tracks/c/exercises/sublist/test/vendor/unity.h +274 -0
- data/tracks/c/exercises/sublist/test/vendor/unity_internals.h +701 -0
- data/tracks/ecmascript/config.json +56 -0
- data/tracks/ecmascript/exercises/rectangles/README.md +95 -0
- data/tracks/ecmascript/exercises/rectangles/example.js +38 -0
- data/tracks/ecmascript/exercises/rectangles/package.json +72 -0
- data/tracks/ecmascript/exercises/rectangles/rectangles.spec.js +147 -0
- data/tracks/ecmascript/exercises/rotational-cipher/README.md +66 -0
- data/tracks/ecmascript/exercises/rotational-cipher/example.js +16 -0
- data/tracks/ecmascript/exercises/rotational-cipher/package.json +72 -0
- data/tracks/ecmascript/exercises/rotational-cipher/rotational-cipher.spec.js +73 -0
- data/tracks/ecmascript/exercises/spiral-matrix/README.md +59 -0
- data/tracks/ecmascript/exercises/spiral-matrix/example.js +26 -0
- data/tracks/ecmascript/exercises/spiral-matrix/package.json +72 -0
- data/tracks/ecmascript/exercises/spiral-matrix/spiral-matrix.spec.js +55 -0
- data/tracks/ecmascript/exercises/transpose/README.md +94 -0
- data/tracks/ecmascript/exercises/transpose/example.js +12 -0
- data/tracks/ecmascript/exercises/transpose/package.json +71 -0
- data/tracks/ecmascript/exercises/transpose/transpose.spec.js +121 -0
- data/tracks/go/exercises/allergies/.meta/gen.go +88 -0
- data/tracks/go/exercises/allergies/allergies_test.go +19 -46
- data/tracks/go/exercises/allergies/cases_test.go +60 -0
- data/tracks/go/exercises/bob/bob.go +0 -2
- data/tracks/go/exercises/forth/cases_test.go +2 -7
- data/tracks/go/exercises/nucleotide-count/nucleotide_count.go +0 -2
- data/tracks/go/exercises/pangram/.meta/gen.go +54 -0
- data/tracks/go/exercises/pangram/cases_test.go +62 -0
- data/tracks/go/exercises/pangram/example.go +3 -5
- data/tracks/go/exercises/pangram/pangram_test.go +3 -24
- data/tracks/go/exercises/rna-transcription/rna_transcription.go +0 -2
- data/tracks/go/exercises/robot-name/bonus_example.go +0 -2
- data/tracks/java/exercises/acronym/.meta/src/reference/java/Acronym.java +3 -3
- data/tracks/lfe/config.json +4 -3
- data/tracks/perl6/docs/SNIPPET.txt +8 -3
- data/tracks/perl6/exercises/allergies/Allergies.pm6 +1 -1
- data/tracks/perl6/exercises/allergies/Example.pm6 +1 -1
- data/tracks/perl6/exercises/allergies/allergies.t +10 -2
- data/tracks/perl6/exercises/allergies/example.yaml +10 -2
- data/tracks/perl6/exercises/leap/Example.pm6 +1 -1
- data/tracks/perl6/exercises/leap/Leap.pm6 +1 -1
- data/tracks/perl6/exercises/leap/example.yaml +10 -2
- data/tracks/perl6/exercises/leap/leap.t +10 -2
- data/tracks/perl6/exercises/luhn/Example.pm6 +1 -1
- data/tracks/perl6/exercises/luhn/Luhn.pm6 +1 -1
- data/tracks/perl6/exercises/luhn/example.yaml +10 -2
- data/tracks/perl6/exercises/luhn/luhn.t +10 -2
- data/tracks/perl6/exercises/pangram/Example.pm6 +1 -1
- data/tracks/perl6/exercises/pangram/Pangram.pm6 +1 -1
- data/tracks/perl6/exercises/pangram/example.yaml +12 -6
- data/tracks/perl6/exercises/pangram/pangram.t +9 -3
- data/tracks/python/config.json +38 -0
- data/tracks/python/exercises/complex-numbers/complex_numbers_test.py +81 -66
- data/tracks/python/exercises/connect/README.md +44 -0
- data/tracks/python/exercises/connect/connect.py +7 -0
- data/tracks/python/exercises/connect/connect_test.py +118 -0
- data/tracks/python/exercises/connect/example.py +61 -0
- data/tracks/python/exercises/go-counting/README.md +44 -0
- data/tracks/python/exercises/go-counting/example.py +62 -0
- data/tracks/python/exercises/go-counting/go_counting.py +38 -0
- data/tracks/python/exercises/go-counting/go_counting_test.py +92 -0
- data/tracks/python/exercises/parallel-letter-frequency/README.md +24 -0
- data/tracks/python/exercises/parallel-letter-frequency/example.py +56 -0
- data/tracks/python/exercises/parallel-letter-frequency/parallel_letter_frequency.py +2 -0
- data/tracks/python/exercises/parallel-letter-frequency/parallel_letter_frequency_test.py +61 -0
- data/tracks/python/exercises/strain/README.md +3 -1
- data/tracks/python/exercises/strain/strain.py +2 -2
- data/tracks/rust/.travis.yml +1 -0
- data/tracks/rust/README.md +2 -0
- data/tracks/rust/_test/check-exercises.sh +41 -54
- data/tracks/rust/_test/ensure-readmes-are-updated.sh +40 -0
- data/tracks/rust/bin/test-exercise +84 -0
- data/tracks/rust/exercises/alphametics/.meta/test-in-release-mode +2 -0
- data/tracks/rust/exercises/alphametics/src/lib.rs +1 -1
- data/tracks/rust/exercises/dominoes/README.md +3 -3
- data/tracks/rust/exercises/isbn-verifier/README.md +3 -2
- data/tracks/rust/exercises/nucleotide-count/README.md +2 -2
- data/tracks/rust/exercises/perfect-numbers/src/lib.rs +10 -0
- data/tracks/rust/exercises/phone-number/README.md +1 -1
- data/tracks/rust/exercises/pythagorean-triplet/src/lib.rs +3 -0
- data/tracks/rust/exercises/rectangles/README.md +9 -9
- data/tracks/rust/exercises/two-bucket/README.md +7 -7
- data/tracks/typescript/config.json +16 -0
- data/tracks/typescript/exercises/diamond/README.md +84 -0
- data/tracks/typescript/exercises/diamond/diamond.example.ts +51 -0
- data/tracks/typescript/exercises/diamond/diamond.test.ts +35 -0
- data/tracks/typescript/exercises/diamond/diamond.ts +0 -0
- data/tracks/typescript/exercises/diamond/package.json +36 -0
- data/tracks/typescript/exercises/diamond/tsconfig.json +22 -0
- data/tracks/typescript/exercises/diamond/tslint.json +127 -0
- data/tracks/typescript/exercises/diamond/yarn.lock +2624 -0
- metadata +53 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1a6282e44be589af42a98d5eadad3da3614b6645
|
|
4
|
+
data.tar.gz: b848e7356527fa5be1f4570d65607e7fe44d99c4
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: d59a5c6e8bfc57a717bff31c9d63ff1dcc2b1a14f18ac94f14f50526028ad9c7cb5e115164af39807eaf9eb2c8d575ff8c6e30e700435babdd9b6d77d87ca7aa
|
|
7
|
+
data.tar.gz: ad2739ff2c636371cf1e6d611f1cb9a21291059e9cde040d111f084267ae45148fa50a8adcda38c363b1d0151146bef8e4da76ac21feece7f2b4dd20525f567c
|
data/lib/trackler/version.rb
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"exercise": "forth",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"comments": [
|
|
5
5
|
"The cases are split into multiple sections, all with the same structure.",
|
|
6
6
|
"In all cases, the `expected` key is the resulting stack",
|
|
@@ -10,12 +10,6 @@
|
|
|
10
10
|
{
|
|
11
11
|
"description": "parsing and numbers",
|
|
12
12
|
"cases": [
|
|
13
|
-
{
|
|
14
|
-
"description": "empty input results in empty stack",
|
|
15
|
-
"property": "evaluate",
|
|
16
|
-
"input": [],
|
|
17
|
-
"expected": []
|
|
18
|
-
},
|
|
19
13
|
{
|
|
20
14
|
"description": "numbers just get pushed onto the stack",
|
|
21
15
|
"property": "evaluate",
|
|
@@ -1,21 +1,25 @@
|
|
|
1
1
|
Calculate the date of meetups.
|
|
2
2
|
|
|
3
|
-
Typically meetups happen on the same day of the week. In this exercise, you
|
|
4
|
-
a description of a meetup date, and return the actual meetup date.
|
|
3
|
+
Typically meetups happen on the same day of the week. In this exercise, you
|
|
4
|
+
will take a description of a meetup date, and return the actual meetup date.
|
|
5
5
|
|
|
6
6
|
Examples of general descriptions are:
|
|
7
7
|
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
8
|
+
- The first Monday of January 2017
|
|
9
|
+
- The third Tuesday of January 2017
|
|
10
|
+
- The wednesteenth of January 2017
|
|
11
|
+
- The last Thursday of January 2017
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
The descriptors you are expected to parse are:
|
|
14
|
+
first, second, third, fourth, fifth, last, monteenth, tuesteenth, wednesteenth,
|
|
15
|
+
thursteenth, friteenth, saturteenth, sunteenth
|
|
16
|
+
|
|
17
|
+
Note that "monteenth", "tuesteenth", etc are all made up words. There was a
|
|
18
|
+
meetup whose members realized that there are exactly 7 numbered days in a month
|
|
19
|
+
that end in '-teenth'. Therefore, one is guaranteed that each day of the week
|
|
16
20
|
(Monday, Tuesday, ...) will have exactly one date that is named with '-teenth'
|
|
17
21
|
in every month.
|
|
18
22
|
|
|
19
|
-
Given examples of a meetup dates, each containing a month, day, year, and
|
|
20
|
-
|
|
21
|
-
|
|
23
|
+
Given examples of a meetup dates, each containing a month, day, year, and
|
|
24
|
+
descriptor calculate the date of the actual meetup. For example, if given
|
|
25
|
+
"The first Monday of January 2017", the correct meetup date is 2017/1/2.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
Given a number, find the sum of all the multiples of particular numbers up to
|
|
1
|
+
Given a number, find the sum of all the unique multiples of particular numbers up to
|
|
2
2
|
but not including that number.
|
|
3
3
|
|
|
4
|
-
If we list all the natural numbers
|
|
5
|
-
|
|
4
|
+
If we list all the natural numbers below 20 that are multiples of 3 or 5,
|
|
5
|
+
we get 3, 5, 6, 9, 10, 12, 15, and 18.
|
|
6
6
|
|
|
7
7
|
The sum of these multiples is 78.
|
data/tracks/c/config.json
CHANGED
|
@@ -247,7 +247,6 @@
|
|
|
247
247
|
"slug": "anagram",
|
|
248
248
|
"topics": [
|
|
249
249
|
"filtering",
|
|
250
|
-
"memory_management",
|
|
251
250
|
"strings",
|
|
252
251
|
"structs"
|
|
253
252
|
],
|
|
@@ -442,6 +441,20 @@
|
|
|
442
441
|
"unlocked_by": "atbash-cipher",
|
|
443
442
|
"uuid": "55b87cc2-c3a0-438a-b2b6-116ad6356802"
|
|
444
443
|
},
|
|
444
|
+
{
|
|
445
|
+
"core": false,
|
|
446
|
+
"difficulty": 4,
|
|
447
|
+
"slug": "sublist",
|
|
448
|
+
"topics": [
|
|
449
|
+
"pointers",
|
|
450
|
+
"arrays",
|
|
451
|
+
"searching",
|
|
452
|
+
"control_flow_if_statements",
|
|
453
|
+
"control_flow_loops"
|
|
454
|
+
],
|
|
455
|
+
"unlocked_by": "palindrome-products",
|
|
456
|
+
"uuid": "928e9860-0df9-5180-8529-7024c991b3616adc21a"
|
|
457
|
+
},
|
|
445
458
|
{
|
|
446
459
|
"core": false,
|
|
447
460
|
"difficulty": 2,
|
|
@@ -3,11 +3,26 @@
|
|
|
3
3
|
|
|
4
4
|
#define MAX_STR_LEN 20
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
enum anagram_status {
|
|
7
|
+
UNCHECKED = -1,
|
|
8
|
+
NOT_ANAGRAM,
|
|
9
|
+
IS_ANAGRAM
|
|
9
10
|
};
|
|
10
11
|
|
|
11
|
-
struct
|
|
12
|
+
struct candidate {
|
|
13
|
+
enum anagram_status is_anagram;
|
|
14
|
+
const char *candidate;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
struct candidates {
|
|
18
|
+
struct candidate *candidate;
|
|
19
|
+
size_t count;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* @description - determines if any of the words in candidate are anagrams
|
|
24
|
+
* for word. Word buffer and candidate structures may be modified.
|
|
25
|
+
*/
|
|
26
|
+
void anagrams_for(const char *word, struct candidates *candidates);
|
|
12
27
|
|
|
13
28
|
#endif
|
|
@@ -5,56 +5,43 @@
|
|
|
5
5
|
|
|
6
6
|
#include "anagram.h"
|
|
7
7
|
|
|
8
|
-
|
|
8
|
+
static void to_lower_case(char p[])
|
|
9
9
|
{
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
while (*p) {
|
|
15
|
-
*p = tolower(*p);
|
|
16
|
-
p++;
|
|
10
|
+
char *tmp = p;
|
|
11
|
+
while (*tmp) {
|
|
12
|
+
*tmp = tolower(*tmp);
|
|
13
|
+
tmp++;
|
|
17
14
|
}
|
|
18
|
-
|
|
19
|
-
return lower;
|
|
20
15
|
}
|
|
21
16
|
|
|
22
|
-
int compare(const void *a, const void *b)
|
|
17
|
+
static int compare(const void *a, const void *b)
|
|
23
18
|
{
|
|
24
19
|
return *(const char *)a - *(const char *)b;
|
|
25
20
|
}
|
|
26
21
|
|
|
27
|
-
|
|
22
|
+
void anagrams_for(const char *word, struct candidates *candidates)
|
|
28
23
|
{
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
vout_vecp++;
|
|
50
|
-
vout.size++;
|
|
24
|
+
char lower_word[MAX_STR_LEN] = { 0 };
|
|
25
|
+
strncpy(&lower_word[0], word, MAX_STR_LEN);
|
|
26
|
+
to_lower_case(&lower_word[0]);
|
|
27
|
+
char sorted_word[MAX_STR_LEN] = { 0 };
|
|
28
|
+
strncpy(&sorted_word[0], &lower_word[0], MAX_STR_LEN);
|
|
29
|
+
qsort(&sorted_word, strlen(sorted_word), 1, compare);
|
|
30
|
+
for (int i = 0; i < (int)candidates->count; i++) {
|
|
31
|
+
char lower_candidate[MAX_STR_LEN] = { 0 };
|
|
32
|
+
strncpy(&lower_candidate[0], candidates->candidate[i].candidate,
|
|
33
|
+
MAX_STR_LEN);
|
|
34
|
+
to_lower_case(&lower_candidate[0]);
|
|
35
|
+
if (strcmp(&lower_candidate[0], &lower_word[0]) == 0) {
|
|
36
|
+
candidates->candidate[i].is_anagram = NOT_ANAGRAM;
|
|
37
|
+
}
|
|
38
|
+
if (candidates->candidate[i].is_anagram == UNCHECKED) {
|
|
39
|
+
qsort(&lower_candidate[0], strlen(&lower_candidate[0]), 1, compare);
|
|
40
|
+
if (strcmp(&sorted_word[0], &lower_candidate[0]) == 0) {
|
|
41
|
+
candidates->candidate[i].is_anagram = IS_ANAGRAM;
|
|
42
|
+
} else {
|
|
43
|
+
candidates->candidate[i].is_anagram = NOT_ANAGRAM;
|
|
51
44
|
}
|
|
52
45
|
}
|
|
53
|
-
free(input_lower);
|
|
54
|
-
vecp++;
|
|
55
46
|
}
|
|
56
|
-
|
|
57
|
-
free(lower);
|
|
58
|
-
free(sorted);
|
|
59
|
-
return vout;
|
|
60
47
|
}
|
|
@@ -4,11 +4,9 @@
|
|
|
4
4
|
#include "vendor/unity.h"
|
|
5
5
|
#include "../src/anagram.h"
|
|
6
6
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
0
|
|
11
|
-
};
|
|
7
|
+
#define MAX_STR_LEN 20
|
|
8
|
+
|
|
9
|
+
struct candidates candidates;
|
|
12
10
|
|
|
13
11
|
void setUp(void)
|
|
14
12
|
{
|
|
@@ -16,25 +14,27 @@ void setUp(void)
|
|
|
16
14
|
|
|
17
15
|
void tearDown(void)
|
|
18
16
|
{
|
|
17
|
+
free(candidates.candidate);
|
|
19
18
|
}
|
|
20
19
|
|
|
21
|
-
static
|
|
20
|
+
static struct candidates build_candidates(char *inputs, size_t count)
|
|
22
21
|
{
|
|
23
|
-
|
|
22
|
+
struct candidates result;
|
|
23
|
+
result.count = count;
|
|
24
|
+
result.candidate = malloc(sizeof(struct candidate) * count);
|
|
25
|
+
for (int i = 0; i < (int)count; i++) {
|
|
26
|
+
result.candidate[i].candidate = &inputs[i * MAX_STR_LEN];
|
|
27
|
+
result.candidate[i].is_anagram = UNCHECKED;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
return result;
|
|
24
31
|
}
|
|
25
32
|
|
|
26
|
-
|
|
27
|
-
|
|
33
|
+
static void assert_correct_anagrams(struct candidates *candidates,
|
|
34
|
+
enum anagram_status expected[])
|
|
28
35
|
{
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
qsort(vout.vec, vout.size, sizeof(char) * MAX_STR_LEN, stringcmp);
|
|
32
|
-
|
|
33
|
-
TEST_ASSERT_EQUAL(expected.size, vout.size);
|
|
34
|
-
for (int x = 0; x < vout.size; x++) {
|
|
35
|
-
TEST_ASSERT_EQUAL(strlen(expected.vec[x]), strlen(vout.vec[x]));
|
|
36
|
-
TEST_ASSERT_EQUAL_MEMORY(expected.vec[x], vout.vec[x],
|
|
37
|
-
strlen(expected.vec[x]));
|
|
36
|
+
for (int i = 0; i < (int)candidates->count; i++) {
|
|
37
|
+
TEST_ASSERT_EQUAL(expected[i], candidates->candidate[i].is_anagram);
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
|
|
@@ -47,14 +47,14 @@ void test_no_matches(void)
|
|
|
47
47
|
"pants"
|
|
48
48
|
};
|
|
49
49
|
|
|
50
|
-
|
|
51
|
-
inputs,
|
|
52
|
-
sizeof(inputs) / MAX_STR_LEN
|
|
53
|
-
};
|
|
50
|
+
char word[] = { "diaper" };
|
|
54
51
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
52
|
+
candidates = build_candidates(*inputs, sizeof(inputs) / MAX_STR_LEN);
|
|
53
|
+
enum anagram_status expected[] =
|
|
54
|
+
{ NOT_ANAGRAM, NOT_ANAGRAM, NOT_ANAGRAM, NOT_ANAGRAM };
|
|
55
|
+
|
|
56
|
+
anagrams_for(word, &candidates);
|
|
57
|
+
assert_correct_anagrams(&candidates, expected);
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
void test_detect_simple_anagram(void)
|
|
@@ -66,23 +66,14 @@ void test_detect_simple_anagram(void)
|
|
|
66
66
|
"at"
|
|
67
67
|
};
|
|
68
68
|
|
|
69
|
-
char
|
|
70
|
-
"tan"
|
|
71
|
-
};
|
|
69
|
+
char word[] = { "ant" };
|
|
72
70
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
sizeof(inputs) / MAX_STR_LEN
|
|
76
|
-
};
|
|
71
|
+
candidates = build_candidates(*inputs, sizeof(inputs) / MAX_STR_LEN);
|
|
72
|
+
enum anagram_status expected[] = { IS_ANAGRAM, NOT_ANAGRAM, NOT_ANAGRAM };
|
|
77
73
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
sizeof(outputs) / MAX_STR_LEN
|
|
81
|
-
};
|
|
74
|
+
anagrams_for(word, &candidates);
|
|
75
|
+
assert_correct_anagrams(&candidates, expected);
|
|
82
76
|
|
|
83
|
-
struct vector vout = anagrams_for("ant", vin);
|
|
84
|
-
assert_equal_vector(vout, expected);
|
|
85
|
-
free(vout.vec);
|
|
86
77
|
}
|
|
87
78
|
|
|
88
79
|
void test_does_not_confuse_different_duplicates(void)
|
|
@@ -92,14 +83,13 @@ void test_does_not_confuse_different_duplicates(void)
|
|
|
92
83
|
"eagle"
|
|
93
84
|
};
|
|
94
85
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
};
|
|
86
|
+
char word[] = { "galea" };
|
|
87
|
+
|
|
88
|
+
candidates = build_candidates(*inputs, sizeof(inputs) / MAX_STR_LEN);
|
|
89
|
+
enum anagram_status expected[] = { NOT_ANAGRAM };
|
|
99
90
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
free(vout.vec);
|
|
91
|
+
anagrams_for(word, &candidates);
|
|
92
|
+
assert_correct_anagrams(&candidates, expected);
|
|
103
93
|
}
|
|
104
94
|
|
|
105
95
|
void test_eliminate_anagram_subsets(void)
|
|
@@ -110,14 +100,13 @@ void test_eliminate_anagram_subsets(void)
|
|
|
110
100
|
"goody"
|
|
111
101
|
};
|
|
112
102
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
};
|
|
103
|
+
char word[] = { "good" };
|
|
104
|
+
|
|
105
|
+
candidates = build_candidates(*inputs, sizeof(inputs) / MAX_STR_LEN);
|
|
106
|
+
enum anagram_status expected[] = { NOT_ANAGRAM, NOT_ANAGRAM };
|
|
117
107
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
free(vout.vec);
|
|
108
|
+
anagrams_for(word, &candidates);
|
|
109
|
+
assert_correct_anagrams(&candidates, expected);
|
|
121
110
|
}
|
|
122
111
|
|
|
123
112
|
void test_detect_anagram(void)
|
|
@@ -130,23 +119,14 @@ void test_detect_anagram(void)
|
|
|
130
119
|
"banana"
|
|
131
120
|
};
|
|
132
121
|
|
|
133
|
-
char
|
|
134
|
-
"inlets"
|
|
135
|
-
};
|
|
136
|
-
|
|
137
|
-
struct vector vin = {
|
|
138
|
-
inputs,
|
|
139
|
-
sizeof(inputs) / MAX_STR_LEN
|
|
140
|
-
};
|
|
122
|
+
char word[] = { "listen" };
|
|
141
123
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
};
|
|
124
|
+
candidates = build_candidates(*inputs, sizeof(inputs) / MAX_STR_LEN);
|
|
125
|
+
enum anagram_status expected[] =
|
|
126
|
+
{ NOT_ANAGRAM, NOT_ANAGRAM, IS_ANAGRAM, NOT_ANAGRAM };
|
|
146
127
|
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
free(vout.vec);
|
|
128
|
+
anagrams_for(word, &candidates);
|
|
129
|
+
assert_correct_anagrams(&candidates, expected);
|
|
150
130
|
}
|
|
151
131
|
|
|
152
132
|
void test_multiple_anagrams(void)
|
|
@@ -161,25 +141,16 @@ void test_multiple_anagrams(void)
|
|
|
161
141
|
"leading"
|
|
162
142
|
};
|
|
163
143
|
|
|
164
|
-
char
|
|
165
|
-
"gallery",
|
|
166
|
-
"regally",
|
|
167
|
-
"largely"
|
|
168
|
-
};
|
|
169
|
-
|
|
170
|
-
struct vector vin = {
|
|
171
|
-
inputs,
|
|
172
|
-
sizeof(inputs) / MAX_STR_LEN
|
|
173
|
-
};
|
|
144
|
+
char word[] = { "allergy" };
|
|
174
145
|
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
146
|
+
candidates = build_candidates(*inputs, sizeof(inputs) / MAX_STR_LEN);
|
|
147
|
+
enum anagram_status expected[] =
|
|
148
|
+
{ IS_ANAGRAM, NOT_ANAGRAM, IS_ANAGRAM, NOT_ANAGRAM, IS_ANAGRAM,
|
|
149
|
+
NOT_ANAGRAM
|
|
178
150
|
};
|
|
179
151
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
free(vout.vec);
|
|
152
|
+
anagrams_for(word, &candidates);
|
|
153
|
+
assert_correct_anagrams(&candidates, expected);
|
|
183
154
|
}
|
|
184
155
|
|
|
185
156
|
void test_case_insensitive_anagrams(void)
|
|
@@ -191,105 +162,82 @@ void test_case_insensitive_anagrams(void)
|
|
|
191
162
|
"radishes"
|
|
192
163
|
};
|
|
193
164
|
|
|
194
|
-
char
|
|
195
|
-
"Carthorse"
|
|
196
|
-
};
|
|
197
|
-
|
|
198
|
-
struct vector vin = {
|
|
199
|
-
inputs,
|
|
200
|
-
sizeof(inputs) / MAX_STR_LEN
|
|
201
|
-
};
|
|
165
|
+
char word[] = { "Orchestra" };
|
|
202
166
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
sizeof(outputs) / MAX_STR_LEN
|
|
206
|
-
};
|
|
167
|
+
candidates = build_candidates(*inputs, sizeof(inputs) / MAX_STR_LEN);
|
|
168
|
+
enum anagram_status expected[] = { NOT_ANAGRAM, IS_ANAGRAM, NOT_ANAGRAM };
|
|
207
169
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
free(vout.vec);
|
|
170
|
+
anagrams_for(word, &candidates);
|
|
171
|
+
assert_correct_anagrams(&candidates, expected);
|
|
211
172
|
}
|
|
212
173
|
|
|
213
|
-
void
|
|
174
|
+
void test_does_not_detect_a_word_as_its_own_anagram(void)
|
|
214
175
|
{
|
|
215
176
|
TEST_IGNORE();
|
|
216
|
-
// These words don't make sense, they're just greek letters cobbled together.
|
|
217
177
|
char inputs[][MAX_STR_LEN] = {
|
|
218
|
-
"
|
|
219
|
-
"ΒΓΔ",
|
|
220
|
-
"γβα"
|
|
221
|
-
};
|
|
222
|
-
|
|
223
|
-
char outputs[][MAX_STR_LEN] = {
|
|
224
|
-
"ΒΓΑ"
|
|
178
|
+
"banana"
|
|
225
179
|
};
|
|
226
180
|
|
|
227
|
-
|
|
228
|
-
inputs,
|
|
229
|
-
sizeof(inputs) / MAX_STR_LEN
|
|
230
|
-
};
|
|
181
|
+
char word[] = { "banana" };
|
|
231
182
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
sizeof(outputs) / MAX_STR_LEN
|
|
235
|
-
};
|
|
183
|
+
candidates = build_candidates(*inputs, sizeof(inputs) / MAX_STR_LEN);
|
|
184
|
+
enum anagram_status expected[] = { NOT_ANAGRAM };
|
|
236
185
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
free(vout.vec);
|
|
186
|
+
anagrams_for(word, &candidates);
|
|
187
|
+
assert_correct_anagrams(&candidates, expected);
|
|
240
188
|
}
|
|
241
189
|
|
|
242
|
-
void
|
|
190
|
+
void test_does_not_detect_a_differently_cased_word_as_its_own_anagram(void)
|
|
243
191
|
{
|
|
244
192
|
TEST_IGNORE();
|
|
245
|
-
// Despite what a human might think these words different letters, the input uses Greek A and B
|
|
246
|
-
// while the list of potential anagrams uses Latin A and B.
|
|
247
193
|
char inputs[][MAX_STR_LEN] = {
|
|
248
|
-
"
|
|
194
|
+
"bAnana"
|
|
249
195
|
};
|
|
250
196
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
};
|
|
197
|
+
char word[] = { "banana" };
|
|
198
|
+
|
|
199
|
+
candidates = build_candidates(*inputs, sizeof(inputs) / MAX_STR_LEN);
|
|
200
|
+
enum anagram_status expected[] = { NOT_ANAGRAM };
|
|
255
201
|
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
free(vout.vec);
|
|
202
|
+
anagrams_for(word, &candidates);
|
|
203
|
+
assert_correct_anagrams(&candidates, expected);
|
|
259
204
|
}
|
|
260
205
|
|
|
261
|
-
void
|
|
206
|
+
void test_unicode_anagrams(void)
|
|
262
207
|
{
|
|
263
|
-
TEST_IGNORE();
|
|
208
|
+
TEST_IGNORE(); // This is an extra credit test. Delete this line to accept the challenge
|
|
209
|
+
// These words don't make sense, they're just greek letters cobbled together.
|
|
264
210
|
char inputs[][MAX_STR_LEN] = {
|
|
265
|
-
"
|
|
211
|
+
"ΒΓΑ",
|
|
212
|
+
"ΒΓΔ",
|
|
213
|
+
"γβα"
|
|
266
214
|
};
|
|
267
215
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
};
|
|
216
|
+
char word[] = { "ΑΒΓ" };
|
|
217
|
+
|
|
218
|
+
candidates = build_candidates(*inputs, sizeof(inputs) / MAX_STR_LEN);
|
|
219
|
+
enum anagram_status expected[] = { IS_ANAGRAM, NOT_ANAGRAM, NOT_ANAGRAM };
|
|
272
220
|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
free(vout.vec);
|
|
221
|
+
anagrams_for(word, &candidates);
|
|
222
|
+
assert_correct_anagrams(&candidates, expected);
|
|
276
223
|
}
|
|
277
224
|
|
|
278
|
-
void
|
|
225
|
+
void test_misleading_unicode_anagrams(void)
|
|
279
226
|
{
|
|
280
|
-
TEST_IGNORE();
|
|
227
|
+
TEST_IGNORE(); //This is an extra credit test, are you up for the challenge
|
|
228
|
+
// Despite what a human might think these words different letters, the input uses Greek A and B
|
|
229
|
+
// while the list of potential anagrams uses Latin A and B.
|
|
281
230
|
char inputs[][MAX_STR_LEN] = {
|
|
282
|
-
"
|
|
231
|
+
"ABΓ"
|
|
283
232
|
};
|
|
284
233
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
};
|
|
234
|
+
char word[] = { "ΑΒΓ" };
|
|
235
|
+
|
|
236
|
+
candidates = build_candidates(*inputs, sizeof(inputs) / MAX_STR_LEN);
|
|
237
|
+
enum anagram_status expected[] = { NOT_ANAGRAM };
|
|
289
238
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
free(vout.vec);
|
|
239
|
+
anagrams_for(word, &candidates);
|
|
240
|
+
assert_correct_anagrams(&candidates, expected);
|
|
293
241
|
}
|
|
294
242
|
|
|
295
243
|
int main(void)
|
|
@@ -307,8 +255,8 @@ int main(void)
|
|
|
307
255
|
RUN_TEST(test_does_not_detect_a_differently_cased_word_as_its_own_anagram);
|
|
308
256
|
|
|
309
257
|
// Bonus points
|
|
310
|
-
|
|
311
|
-
|
|
258
|
+
RUN_TEST(test_unicode_anagrams);
|
|
259
|
+
RUN_TEST(test_misleading_unicode_anagrams);
|
|
312
260
|
|
|
313
261
|
UnityEnd();
|
|
314
262
|
return 0;
|