trackler 2.2.1.61 → 2.2.1.62
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/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;
|