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.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/forth/canonical-data.json +1 -7
  4. data/problem-specifications/exercises/meetup/description.md +16 -12
  5. data/problem-specifications/exercises/sum-of-multiples/description.md +3 -3
  6. data/tracks/c/config.json +14 -1
  7. data/tracks/c/exercises/anagram/src/anagram.h +19 -4
  8. data/tracks/c/exercises/anagram/src/example.c +27 -40
  9. data/tracks/c/exercises/anagram/test/test_anagram.c +100 -152
  10. data/tracks/c/exercises/sublist/README.md +53 -0
  11. data/tracks/c/exercises/sublist/makefile +15 -0
  12. data/tracks/c/exercises/sublist/src/example.c +63 -0
  13. data/tracks/c/exercises/sublist/src/sublist.h +17 -0
  14. data/tracks/c/exercises/sublist/test/test_sublist.c +243 -0
  15. data/tracks/c/exercises/sublist/test/vendor/unity.c +1300 -0
  16. data/tracks/c/exercises/sublist/test/vendor/unity.h +274 -0
  17. data/tracks/c/exercises/sublist/test/vendor/unity_internals.h +701 -0
  18. data/tracks/ecmascript/config.json +56 -0
  19. data/tracks/ecmascript/exercises/rectangles/README.md +95 -0
  20. data/tracks/ecmascript/exercises/rectangles/example.js +38 -0
  21. data/tracks/ecmascript/exercises/rectangles/package.json +72 -0
  22. data/tracks/ecmascript/exercises/rectangles/rectangles.spec.js +147 -0
  23. data/tracks/ecmascript/exercises/rotational-cipher/README.md +66 -0
  24. data/tracks/ecmascript/exercises/rotational-cipher/example.js +16 -0
  25. data/tracks/ecmascript/exercises/rotational-cipher/package.json +72 -0
  26. data/tracks/ecmascript/exercises/rotational-cipher/rotational-cipher.spec.js +73 -0
  27. data/tracks/ecmascript/exercises/spiral-matrix/README.md +59 -0
  28. data/tracks/ecmascript/exercises/spiral-matrix/example.js +26 -0
  29. data/tracks/ecmascript/exercises/spiral-matrix/package.json +72 -0
  30. data/tracks/ecmascript/exercises/spiral-matrix/spiral-matrix.spec.js +55 -0
  31. data/tracks/ecmascript/exercises/transpose/README.md +94 -0
  32. data/tracks/ecmascript/exercises/transpose/example.js +12 -0
  33. data/tracks/ecmascript/exercises/transpose/package.json +71 -0
  34. data/tracks/ecmascript/exercises/transpose/transpose.spec.js +121 -0
  35. data/tracks/go/exercises/allergies/.meta/gen.go +88 -0
  36. data/tracks/go/exercises/allergies/allergies_test.go +19 -46
  37. data/tracks/go/exercises/allergies/cases_test.go +60 -0
  38. data/tracks/go/exercises/bob/bob.go +0 -2
  39. data/tracks/go/exercises/forth/cases_test.go +2 -7
  40. data/tracks/go/exercises/nucleotide-count/nucleotide_count.go +0 -2
  41. data/tracks/go/exercises/pangram/.meta/gen.go +54 -0
  42. data/tracks/go/exercises/pangram/cases_test.go +62 -0
  43. data/tracks/go/exercises/pangram/example.go +3 -5
  44. data/tracks/go/exercises/pangram/pangram_test.go +3 -24
  45. data/tracks/go/exercises/rna-transcription/rna_transcription.go +0 -2
  46. data/tracks/go/exercises/robot-name/bonus_example.go +0 -2
  47. data/tracks/java/exercises/acronym/.meta/src/reference/java/Acronym.java +3 -3
  48. data/tracks/lfe/config.json +4 -3
  49. data/tracks/perl6/docs/SNIPPET.txt +8 -3
  50. data/tracks/perl6/exercises/allergies/Allergies.pm6 +1 -1
  51. data/tracks/perl6/exercises/allergies/Example.pm6 +1 -1
  52. data/tracks/perl6/exercises/allergies/allergies.t +10 -2
  53. data/tracks/perl6/exercises/allergies/example.yaml +10 -2
  54. data/tracks/perl6/exercises/leap/Example.pm6 +1 -1
  55. data/tracks/perl6/exercises/leap/Leap.pm6 +1 -1
  56. data/tracks/perl6/exercises/leap/example.yaml +10 -2
  57. data/tracks/perl6/exercises/leap/leap.t +10 -2
  58. data/tracks/perl6/exercises/luhn/Example.pm6 +1 -1
  59. data/tracks/perl6/exercises/luhn/Luhn.pm6 +1 -1
  60. data/tracks/perl6/exercises/luhn/example.yaml +10 -2
  61. data/tracks/perl6/exercises/luhn/luhn.t +10 -2
  62. data/tracks/perl6/exercises/pangram/Example.pm6 +1 -1
  63. data/tracks/perl6/exercises/pangram/Pangram.pm6 +1 -1
  64. data/tracks/perl6/exercises/pangram/example.yaml +12 -6
  65. data/tracks/perl6/exercises/pangram/pangram.t +9 -3
  66. data/tracks/python/config.json +38 -0
  67. data/tracks/python/exercises/complex-numbers/complex_numbers_test.py +81 -66
  68. data/tracks/python/exercises/connect/README.md +44 -0
  69. data/tracks/python/exercises/connect/connect.py +7 -0
  70. data/tracks/python/exercises/connect/connect_test.py +118 -0
  71. data/tracks/python/exercises/connect/example.py +61 -0
  72. data/tracks/python/exercises/go-counting/README.md +44 -0
  73. data/tracks/python/exercises/go-counting/example.py +62 -0
  74. data/tracks/python/exercises/go-counting/go_counting.py +38 -0
  75. data/tracks/python/exercises/go-counting/go_counting_test.py +92 -0
  76. data/tracks/python/exercises/parallel-letter-frequency/README.md +24 -0
  77. data/tracks/python/exercises/parallel-letter-frequency/example.py +56 -0
  78. data/tracks/python/exercises/parallel-letter-frequency/parallel_letter_frequency.py +2 -0
  79. data/tracks/python/exercises/parallel-letter-frequency/parallel_letter_frequency_test.py +61 -0
  80. data/tracks/python/exercises/strain/README.md +3 -1
  81. data/tracks/python/exercises/strain/strain.py +2 -2
  82. data/tracks/rust/.travis.yml +1 -0
  83. data/tracks/rust/README.md +2 -0
  84. data/tracks/rust/_test/check-exercises.sh +41 -54
  85. data/tracks/rust/_test/ensure-readmes-are-updated.sh +40 -0
  86. data/tracks/rust/bin/test-exercise +84 -0
  87. data/tracks/rust/exercises/alphametics/.meta/test-in-release-mode +2 -0
  88. data/tracks/rust/exercises/alphametics/src/lib.rs +1 -1
  89. data/tracks/rust/exercises/dominoes/README.md +3 -3
  90. data/tracks/rust/exercises/isbn-verifier/README.md +3 -2
  91. data/tracks/rust/exercises/nucleotide-count/README.md +2 -2
  92. data/tracks/rust/exercises/perfect-numbers/src/lib.rs +10 -0
  93. data/tracks/rust/exercises/phone-number/README.md +1 -1
  94. data/tracks/rust/exercises/pythagorean-triplet/src/lib.rs +3 -0
  95. data/tracks/rust/exercises/rectangles/README.md +9 -9
  96. data/tracks/rust/exercises/two-bucket/README.md +7 -7
  97. data/tracks/typescript/config.json +16 -0
  98. data/tracks/typescript/exercises/diamond/README.md +84 -0
  99. data/tracks/typescript/exercises/diamond/diamond.example.ts +51 -0
  100. data/tracks/typescript/exercises/diamond/diamond.test.ts +35 -0
  101. data/tracks/typescript/exercises/diamond/diamond.ts +0 -0
  102. data/tracks/typescript/exercises/diamond/package.json +36 -0
  103. data/tracks/typescript/exercises/diamond/tsconfig.json +22 -0
  104. data/tracks/typescript/exercises/diamond/tslint.json +127 -0
  105. data/tracks/typescript/exercises/diamond/yarn.lock +2624 -0
  106. metadata +53 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3084c0fd6f70c36e263665ec8a8e12cec15e09f6
4
- data.tar.gz: 8ff04ba30c6a81000a24ccbb0c8c52b5eac97447
3
+ metadata.gz: 1a6282e44be589af42a98d5eadad3da3614b6645
4
+ data.tar.gz: b848e7356527fa5be1f4570d65607e7fe44d99c4
5
5
  SHA512:
6
- metadata.gz: 375777d69e212de58da88cadbc1a21361ab52be35ae2f5afdcd12d363c1ce1ed62e7cbdf0f24cfbd55ebb16fa9c7e06aaa3e3ede36ca97dcd2f30cdb3ac491e2
7
- data.tar.gz: 7edba3e24c4d7679b1ef258efc321fe7b1cd3086d8942a88762f0e1a23b28e50f3f47ea3c49bfd559329c8fe35cc68c3d0586be0145143f33d39248de1ff19d5
6
+ metadata.gz: d59a5c6e8bfc57a717bff31c9d63ff1dcc2b1a14f18ac94f14f50526028ad9c7cb5e115164af39807eaf9eb2c8d575ff8c6e30e700435babdd9b6d77d87ca7aa
7
+ data.tar.gz: ad2739ff2c636371cf1e6d611f1cb9a21291059e9cde040d111f084267ae45148fa50a8adcda38c363b1d0151146bef8e4da76ac21feece7f2b4dd20525f567c
@@ -1,3 +1,3 @@
1
1
  module Trackler
2
- VERSION = "2.2.1.61"
2
+ VERSION = "2.2.1.62"
3
3
  end
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "exercise": "forth",
3
- "version": "1.2.0",
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 will take
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
- - 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
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
- Note that "Monteenth", "Tuesteenth", etc are all made up words. There
14
- was a meetup whose members realized that there are exactly 7 numbered days in a month that
15
- end in '-teenth'. Therefore, one is guaranteed that each day of the week
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 descriptor
20
- (first, second, teenth, etc), calculate the date of the actual meetup.
21
- For example, if given "First Monday of January 2017", the correct meetup date is 2017/1/2
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 up to but not including 20 that are
5
- multiples of either 3 or 5, we get 3, 5, 6 and 9, 10, 12, 15, and 18.
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
- struct vector {
7
- char (*vec)[MAX_STR_LEN];
8
- int size;
6
+ enum anagram_status {
7
+ UNCHECKED = -1,
8
+ NOT_ANAGRAM,
9
+ IS_ANAGRAM
9
10
  };
10
11
 
11
- struct vector anagrams_for(char *, struct vector);
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
- char *lower_case(char *p)
8
+ static void to_lower_case(char p[])
9
9
  {
10
- int len = strlen(p) + 1;
11
- char *lower = (char *)malloc(len);
12
- memcpy(lower, p, len);
13
- p = lower;
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
- struct vector anagrams_for(char *in, struct vector vin)
22
+ void anagrams_for(const char *word, struct candidates *candidates)
28
23
  {
29
- struct vector vout = {
30
- malloc(MAX_STR_LEN * sizeof(char *)),
31
- 0
32
- };
33
- char (*vout_vecp)[MAX_STR_LEN] = vout.vec;
34
-
35
- char *lower = lower_case(in);
36
- char *sorted = malloc(strlen(in) + 1);
37
- memcpy(sorted, lower, strlen(in) + 1);
38
- qsort(sorted, strlen(sorted), 1, compare);
39
-
40
- char (*vecp)[MAX_STR_LEN] = vin.vec;
41
- int x;
42
- for (x = 0; x < vin.size; x++) {
43
- char *input_lower = lower_case((char *)vecp);
44
- if (strcmp(input_lower, lower) != 0) {
45
- char *input_sorted = input_lower;
46
- qsort(input_sorted, strlen(input_sorted), 1, compare);
47
- if (strcmp(sorted, input_sorted) == 0) {
48
- strcpy(*vout_vecp, *vecp);
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
- // Empty vector for when expected output is nothing
8
- static struct vector empty = {
9
- NULL,
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 int stringcmp(const void *a, const void *b)
20
+ static struct candidates build_candidates(char *inputs, size_t count)
22
21
  {
23
- return strcmp(a, b);
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
- // Asserts that the two input vectors are equal
27
- static void assert_equal_vector(struct vector vout, struct vector expected)
33
+ static void assert_correct_anagrams(struct candidates *candidates,
34
+ enum anagram_status expected[])
28
35
  {
29
- // Sort actual and expected outputs for consistency
30
- qsort(expected.vec, expected.size, sizeof(char) * MAX_STR_LEN, stringcmp);
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
- struct vector vin = {
51
- inputs,
52
- sizeof(inputs) / MAX_STR_LEN
53
- };
50
+ char word[] = { "diaper" };
54
51
 
55
- struct vector vout = anagrams_for("diaper", vin);
56
- assert_equal_vector(vout, empty);
57
- free(vout.vec);
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 outputs[][MAX_STR_LEN] = {
70
- "tan"
71
- };
69
+ char word[] = { "ant" };
72
70
 
73
- struct vector vin = {
74
- inputs,
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
- struct vector expected = {
79
- outputs,
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
- struct vector vin = {
96
- inputs,
97
- sizeof(inputs) / MAX_STR_LEN
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
- struct vector vout = anagrams_for("galea", vin);
101
- assert_equal_vector(vout, empty);
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
- struct vector vin = {
114
- inputs,
115
- sizeof(inputs) / MAX_STR_LEN
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
- struct vector vout = anagrams_for("good", vin);
119
- assert_equal_vector(vout, empty);
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 outputs[][MAX_STR_LEN] = {
134
- "inlets"
135
- };
136
-
137
- struct vector vin = {
138
- inputs,
139
- sizeof(inputs) / MAX_STR_LEN
140
- };
122
+ char word[] = { "listen" };
141
123
 
142
- struct vector expected = {
143
- outputs,
144
- sizeof(outputs) / MAX_STR_LEN
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
- struct vector vout = anagrams_for("listen", vin);
148
- assert_equal_vector(vout, expected);
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 outputs[][MAX_STR_LEN] = {
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
- struct vector expected = {
176
- outputs,
177
- sizeof(outputs) / MAX_STR_LEN
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
- struct vector vout = anagrams_for("allergy", vin);
181
- assert_equal_vector(vout, expected);
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 outputs[][MAX_STR_LEN] = {
195
- "Carthorse"
196
- };
197
-
198
- struct vector vin = {
199
- inputs,
200
- sizeof(inputs) / MAX_STR_LEN
201
- };
165
+ char word[] = { "Orchestra" };
202
166
 
203
- struct vector expected = {
204
- outputs,
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
- struct vector vout = anagrams_for("Orchestra", vin);
209
- assert_equal_vector(vout, expected);
210
- free(vout.vec);
170
+ anagrams_for(word, &candidates);
171
+ assert_correct_anagrams(&candidates, expected);
211
172
  }
212
173
 
213
- void test_unicode_anagrams(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
- struct vector vin = {
228
- inputs,
229
- sizeof(inputs) / MAX_STR_LEN
230
- };
181
+ char word[] = { "banana" };
231
182
 
232
- struct vector expected = {
233
- outputs,
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
- struct vector vout = anagrams_for("ΑΒΓ", vin);
238
- assert_equal_vector(vout, expected);
239
- free(vout.vec);
186
+ anagrams_for(word, &candidates);
187
+ assert_correct_anagrams(&candidates, expected);
240
188
  }
241
189
 
242
- void test_misleading_unicode_anagrams(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
- "ABΓ"
194
+ "bAnana"
249
195
  };
250
196
 
251
- struct vector vin = {
252
- inputs,
253
- sizeof(inputs) / MAX_STR_LEN
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
- struct vector vout = anagrams_for("ΑΒΓ", vin);
257
- assert_equal_vector(vout, empty);
258
- free(vout.vec);
202
+ anagrams_for(word, &candidates);
203
+ assert_correct_anagrams(&candidates, expected);
259
204
  }
260
205
 
261
- void test_does_not_detect_a_word_as_its_own_anagram(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
- "banana"
211
+ "ΒΓΑ",
212
+ "ΒΓΔ",
213
+ "γβα"
266
214
  };
267
215
 
268
- struct vector vin = {
269
- inputs,
270
- sizeof(inputs) / MAX_STR_LEN
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
- struct vector vout = anagrams_for("banana", vin);
274
- assert_equal_vector(vout, empty);
275
- free(vout.vec);
221
+ anagrams_for(word, &candidates);
222
+ assert_correct_anagrams(&candidates, expected);
276
223
  }
277
224
 
278
- void test_does_not_detect_a_differently_cased_word_as_its_own_anagram(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
- "bAnana"
231
+ "ABΓ"
283
232
  };
284
233
 
285
- struct vector vin = {
286
- inputs,
287
- sizeof(inputs) / MAX_STR_LEN
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
- struct vector vout = anagrams_for("banana", vin);
291
- assert_equal_vector(vout, empty);
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
- // RUN_TEST(test_unicode_anagrams);
311
- // RUN_TEST(test_misleading_unicode_anagrams);
258
+ RUN_TEST(test_unicode_anagrams);
259
+ RUN_TEST(test_misleading_unicode_anagrams);
312
260
 
313
261
  UnityEnd();
314
262
  return 0;