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.
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;