trackler 2.2.1.46 → 2.2.1.47

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 (224) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/nucleotide-count/canonical-data.json +7 -7
  4. data/tracks/c/README.md +1 -1
  5. data/tracks/c/docs/SNIPPET.txt +2 -3
  6. data/tracks/c/exercises/acronym/test/test_acronym.c +8 -0
  7. data/tracks/c/exercises/all-your-base/test/test_all_your_base.c +8 -0
  8. data/tracks/c/exercises/allergies/test/test_allergies.c +8 -0
  9. data/tracks/c/exercises/anagram/test/test_anagram.c +8 -0
  10. data/tracks/c/exercises/atbash-cipher/test/test_atbash_cipher.c +8 -0
  11. data/tracks/c/exercises/beer-song/src/example.c +23 -22
  12. data/tracks/c/exercises/beer-song/src/example.h +3 -3
  13. data/tracks/c/exercises/beer-song/test/test_beer_song.c +8 -0
  14. data/tracks/c/exercises/binary-search/test/test_binary_search.c +8 -0
  15. data/tracks/c/exercises/binary/test/test_binary.c +8 -0
  16. data/tracks/c/exercises/bob/test/test_bob.c +8 -0
  17. data/tracks/c/exercises/clock/test/test_clock.c +8 -0
  18. data/tracks/c/exercises/difference-of-squares/test/test_difference_of_squares.c +8 -0
  19. data/tracks/c/exercises/gigasecond/test/test_gigasecond.c +8 -0
  20. data/tracks/c/exercises/grains/test/test_grains.c +8 -0
  21. data/tracks/c/exercises/hamming/test/test_hamming.c +8 -0
  22. data/tracks/c/exercises/hello-world/src/example.c +0 -2
  23. data/tracks/c/exercises/hello-world/test/test_hello_world.c +8 -0
  24. data/tracks/c/exercises/isogram/test/test_isogram.c +8 -0
  25. data/tracks/c/exercises/largest-series-product/test/test_largest_series_product.c +8 -0
  26. data/tracks/c/exercises/leap/test/test_leap.c +8 -0
  27. data/tracks/c/exercises/meetup/test/test_meetup.c +8 -0
  28. data/tracks/c/exercises/nth-prime/test/test_nth_prime.c +8 -0
  29. data/tracks/c/exercises/nucleotide-count/test/test_nucleotide_count.c +8 -0
  30. data/tracks/c/exercises/palindrome-products/test/test_palindrome_products.c +8 -0
  31. data/tracks/c/exercises/pangram/test/test_pangram.c +8 -0
  32. data/tracks/c/exercises/pascals-triangle/test/test_pascals_triangle.c +8 -0
  33. data/tracks/c/exercises/perfect-numbers/src/example.c +4 -4
  34. data/tracks/c/exercises/perfect-numbers/src/example.h +4 -4
  35. data/tracks/c/exercises/perfect-numbers/src/perfect_numbers.h +4 -4
  36. data/tracks/c/exercises/perfect-numbers/test/test_perfect_numbers.c +23 -13
  37. data/tracks/c/exercises/phone-number/test/test_phone_number.c +8 -0
  38. data/tracks/c/exercises/raindrops/test/test_raindrops.c +5 -1
  39. data/tracks/c/exercises/react/src/example.c +8 -8
  40. data/tracks/c/exercises/react/test/test_react.c +8 -0
  41. data/tracks/c/exercises/rna-transcription/test/test_rna_transcription.c +8 -0
  42. data/tracks/c/exercises/robot-simulator/src/example.c +12 -12
  43. data/tracks/c/exercises/robot-simulator/src/robot_simulator.h +11 -11
  44. data/tracks/c/exercises/robot-simulator/test/test_robot_simulator.c +33 -25
  45. data/tracks/c/exercises/roman-numerals/test/test_roman_numerals.c +8 -0
  46. data/tracks/c/exercises/scrabble-score/test/test_scrabble_score.c +8 -0
  47. data/tracks/c/exercises/series/test/test_series.c +8 -0
  48. data/tracks/c/exercises/sieve/test/test_sieve.c +8 -0
  49. data/tracks/c/exercises/space-age/src/example.h +8 -8
  50. data/tracks/c/exercises/space-age/test/test_space_age.c +16 -8
  51. data/tracks/c/exercises/sum-of-multiples/test/test_sum_of_multiples.c +8 -0
  52. data/tracks/c/exercises/triangle/test/test_triangle.c +8 -0
  53. data/tracks/c/exercises/word-count/test/test_word_count.c +8 -0
  54. data/tracks/cfml/config.json +8 -0
  55. data/tracks/cfml/exercises/anagram/.meta/HINTS.md +0 -0
  56. data/tracks/cfml/exercises/anagram/Anagram.cfc +13 -0
  57. data/tracks/cfml/exercises/anagram/AnagramTest.cfc +79 -0
  58. data/tracks/cfml/exercises/anagram/README.md +29 -0
  59. data/tracks/cfml/exercises/anagram/Solution.cfc +42 -0
  60. data/tracks/cfml/exercises/anagram/SolutionTest.cfc +7 -0
  61. data/tracks/cfml/exercises/anagram/TestRunner.cfc +103 -0
  62. data/tracks/cfml/exercises/anagram/box.json +8 -0
  63. data/tracks/cfml/exercises/anagram/index.cfm +37 -0
  64. data/tracks/common-lisp/config.json +5 -5
  65. data/tracks/csharp/exercises/two-bucket/Example.cs +53 -79
  66. data/tracks/csharp/exercises/two-bucket/TwoBucketTest.cs +2 -2
  67. data/tracks/csharp/generators/Exercises/QueenAttack.cs +3 -3
  68. data/tracks/dart/exercises/leap/test/leap_test.dart +1 -1
  69. data/tracks/delphi/exercises/hamming/uHammingTests.pas +2 -2
  70. data/tracks/delphi/exercises/leap/uLeapTests.pas +11 -38
  71. data/tracks/delphi/exercises/nucleotide-count/uNucleotideCountExample.pas +1 -1
  72. data/tracks/delphi/exercises/nucleotide-count/uNucleotideCountTest.pas +31 -55
  73. data/tracks/ecmascript/config.json +31 -0
  74. data/tracks/ecmascript/config/maintainers.json +5 -5
  75. data/tracks/ecmascript/exercises/accumulate/package.json +1 -1
  76. data/tracks/ecmascript/exercises/acronym/package.json +1 -1
  77. data/tracks/ecmascript/exercises/all-your-base/package.json +1 -1
  78. data/tracks/ecmascript/exercises/allergies/package.json +1 -1
  79. data/tracks/ecmascript/exercises/alphametics/package.json +1 -1
  80. data/tracks/ecmascript/exercises/anagram/package.json +1 -1
  81. data/tracks/ecmascript/exercises/atbash-cipher/package.json +1 -1
  82. data/tracks/ecmascript/exercises/beer-song/package.json +1 -1
  83. data/tracks/ecmascript/exercises/binary-search-tree/package.json +1 -1
  84. data/tracks/ecmascript/exercises/binary-search/package.json +1 -1
  85. data/tracks/ecmascript/exercises/binary/package.json +1 -1
  86. data/tracks/ecmascript/exercises/bob/package.json +1 -1
  87. data/tracks/ecmascript/exercises/bracket-push/package.json +1 -1
  88. data/tracks/ecmascript/exercises/circular-buffer/package.json +1 -1
  89. data/tracks/ecmascript/exercises/clock/package.json +1 -1
  90. data/tracks/ecmascript/exercises/collatz-conjecture/README.md +59 -0
  91. data/tracks/ecmascript/exercises/collatz-conjecture/collatz-conjecture.spec.js +31 -0
  92. data/tracks/ecmascript/exercises/collatz-conjecture/example.js +14 -0
  93. data/tracks/ecmascript/exercises/collatz-conjecture/package.json +69 -0
  94. data/tracks/ecmascript/exercises/connect/package.json +1 -1
  95. data/tracks/ecmascript/exercises/crypto-square/package.json +1 -1
  96. data/tracks/ecmascript/exercises/custom-set/package.json +1 -1
  97. data/tracks/ecmascript/exercises/diamond/package.json +1 -1
  98. data/tracks/ecmascript/exercises/difference-of-squares/package.json +1 -1
  99. data/tracks/ecmascript/exercises/diffie-hellman/package.json +1 -1
  100. data/tracks/ecmascript/exercises/etl/package.json +1 -1
  101. data/tracks/ecmascript/exercises/flatten-array/package.json +1 -1
  102. data/tracks/ecmascript/exercises/food-chain/package.json +1 -1
  103. data/tracks/ecmascript/exercises/gigasecond/package.json +1 -1
  104. data/tracks/ecmascript/exercises/grade-school/package.json +1 -1
  105. data/tracks/ecmascript/exercises/grains/package.json +1 -1
  106. data/tracks/ecmascript/exercises/hamming/package.json +1 -1
  107. data/tracks/ecmascript/exercises/hello-world/package.json +1 -1
  108. data/tracks/ecmascript/exercises/hexadecimal/package.json +1 -1
  109. data/tracks/ecmascript/exercises/isogram/package.json +1 -1
  110. data/tracks/ecmascript/exercises/kindergarten-garden/package.json +1 -1
  111. data/tracks/ecmascript/exercises/largest-series-product/package.json +1 -1
  112. data/tracks/ecmascript/exercises/leap/package.json +1 -1
  113. data/tracks/ecmascript/exercises/linked-list/package.json +1 -1
  114. data/tracks/ecmascript/exercises/list-ops/package.json +1 -1
  115. data/tracks/ecmascript/exercises/luhn/package.json +1 -1
  116. data/tracks/ecmascript/exercises/matrix/package.json +1 -1
  117. data/tracks/ecmascript/exercises/meetup/package.json +1 -1
  118. data/tracks/ecmascript/exercises/minesweeper/package.json +1 -1
  119. data/tracks/ecmascript/exercises/nth-prime/package.json +1 -1
  120. data/tracks/ecmascript/exercises/ocr-numbers/package.json +1 -1
  121. data/tracks/ecmascript/exercises/octal/package.json +1 -1
  122. data/tracks/ecmascript/exercises/palindrome-products/package.json +1 -1
  123. data/tracks/ecmascript/exercises/pangram/package.json +1 -1
  124. data/tracks/ecmascript/exercises/pascals-triangle/package.json +1 -1
  125. data/tracks/ecmascript/exercises/perfect-numbers/package.json +1 -1
  126. data/tracks/ecmascript/exercises/phone-number/package.json +1 -1
  127. data/tracks/ecmascript/exercises/pig-latin/package.json +1 -1
  128. data/tracks/ecmascript/exercises/prime-factors/package.json +1 -1
  129. data/tracks/ecmascript/exercises/proverb/package.json +1 -1
  130. data/tracks/ecmascript/exercises/pythagorean-triplet/package.json +1 -1
  131. data/tracks/ecmascript/exercises/queen-attack/package.json +1 -1
  132. data/tracks/ecmascript/exercises/raindrops/package.json +1 -1
  133. data/tracks/ecmascript/exercises/rna-transcription/package.json +1 -1
  134. data/tracks/ecmascript/exercises/robot-name/package.json +1 -1
  135. data/tracks/ecmascript/exercises/robot-simulator/package.json +1 -1
  136. data/tracks/ecmascript/exercises/roman-numerals/package.json +1 -1
  137. data/tracks/ecmascript/exercises/run-length-encoding/package.json +1 -1
  138. data/tracks/ecmascript/exercises/saddle-points/package.json +1 -1
  139. data/tracks/ecmascript/exercises/say/package.json +1 -1
  140. data/tracks/ecmascript/exercises/scrabble-score/package.json +1 -1
  141. data/tracks/ecmascript/exercises/secret-handshake/package.json +1 -1
  142. data/tracks/ecmascript/exercises/series/package.json +1 -1
  143. data/tracks/ecmascript/exercises/sieve/package.json +1 -1
  144. data/tracks/ecmascript/exercises/simple-cipher/package.json +1 -1
  145. data/tracks/ecmascript/exercises/simple-linked-list/package.json +1 -1
  146. data/tracks/ecmascript/exercises/space-age/package.json +1 -1
  147. data/tracks/ecmascript/exercises/strain/package.json +1 -1
  148. data/tracks/ecmascript/exercises/sublist/package.json +1 -1
  149. data/tracks/ecmascript/exercises/sum-of-multiples/package.json +1 -1
  150. data/tracks/ecmascript/exercises/triangle/package.json +1 -1
  151. data/tracks/ecmascript/exercises/trinary/package.json +1 -1
  152. data/tracks/ecmascript/exercises/twelve-days/package.json +1 -1
  153. data/tracks/ecmascript/exercises/two-bucket/package.json +1 -1
  154. data/tracks/ecmascript/exercises/word-count/package.json +1 -1
  155. data/tracks/ecmascript/exercises/word-search/README.md +58 -0
  156. data/tracks/ecmascript/exercises/word-search/example.js +146 -0
  157. data/tracks/ecmascript/exercises/word-search/package.json +69 -0
  158. data/tracks/ecmascript/exercises/word-search/word-search.spec.js +626 -0
  159. data/tracks/ecmascript/exercises/wordy/package.json +1 -1
  160. data/tracks/ecmascript/package.json +1 -1
  161. data/tracks/elixir/config.json +11 -0
  162. data/tracks/elixir/exercises/luhn/example.exs +26 -46
  163. data/tracks/elixir/exercises/luhn/luhn.exs +0 -13
  164. data/tracks/elixir/exercises/luhn/luhn_test.exs +44 -14
  165. data/tracks/elixir/exercises/transpose/README.md +101 -0
  166. data/tracks/elixir/exercises/transpose/example.exs +46 -0
  167. data/tracks/elixir/exercises/transpose/transpose.exs +22 -0
  168. data/tracks/elixir/exercises/transpose/transpose_test.exs +248 -0
  169. data/tracks/fsharp/exercises/grains/Example.fs +10 -2
  170. data/tracks/fsharp/exercises/grains/Grains.fs +2 -4
  171. data/tracks/fsharp/exercises/grains/GrainsTest.fs +52 -25
  172. data/tracks/fsharp/exercises/phone-number/Example.fs +11 -3
  173. data/tracks/fsharp/exercises/phone-number/PhoneNumber.fs +1 -1
  174. data/tracks/fsharp/exercises/phone-number/PhoneNumberTest.fs +32 -21
  175. data/tracks/fsharp/exercises/prime-factors/Example.fs +6 -13
  176. data/tracks/fsharp/exercises/prime-factors/PrimeFactors.fs +1 -1
  177. data/tracks/fsharp/exercises/prime-factors/PrimeFactorsTest.fs +23 -32
  178. data/tracks/fsharp/exercises/rail-fence-cipher/RailFenceCipherTest.fs +22 -13
  179. data/tracks/fsharp/generators/Exercise.fs +3 -4
  180. data/tracks/fsharp/generators/Generators.fs +31 -0
  181. data/tracks/gnu-apl/bin/run-all-tests +5 -2
  182. data/tracks/java/CONTRIBUTING.md +8 -0
  183. data/tracks/java/POLICIES.md +2 -2
  184. data/tracks/java/config.json +26 -4
  185. data/tracks/java/exercises/triangle/.meta/.version +1 -0
  186. data/tracks/java/exercises/triangle/.meta/src/reference/java/Triangle.java +1 -1
  187. data/tracks/java/exercises/triangle/src/test/java/TriangleTest.java +59 -40
  188. data/tracks/javascript/config.json +30 -0
  189. data/tracks/javascript/config/maintainers.json +8 -8
  190. data/tracks/javascript/exercises/change/example.js +6 -22
  191. data/tracks/javascript/exercises/collatz-conjecture/README.md +57 -0
  192. data/tracks/javascript/exercises/collatz-conjecture/collatz-conjecture.spec.js +37 -0
  193. data/tracks/javascript/exercises/collatz-conjecture/example.js +20 -0
  194. data/tracks/javascript/exercises/protein-translation/example.js +30 -31
  195. data/tracks/javascript/exercises/protein-translation/protein-translation.spec.js +60 -60
  196. data/tracks/javascript/exercises/transpose/README.md +89 -0
  197. data/tracks/javascript/exercises/transpose/example.js +17 -0
  198. data/tracks/javascript/exercises/transpose/transpose.spec.js +67 -0
  199. data/tracks/objective-c/config.json +283 -263
  200. data/tracks/objective-c/exercises/grains/GrainsExample.h +6 -0
  201. data/tracks/objective-c/exercises/grains/GrainsExample.m +19 -0
  202. data/tracks/objective-c/exercises/grains/GrainsTest.m +85 -0
  203. data/tracks/objective-c/exercises/nth-prime/NthPrimeExample.h +6 -0
  204. data/tracks/objective-c/exercises/nth-prime/NthPrimeExample.m +39 -0
  205. data/tracks/objective-c/exercises/nth-prime/NthPrimeTest.m +53 -0
  206. data/tracks/python/config.json +42 -11
  207. data/tracks/python/exercises/change/README.md +34 -0
  208. data/tracks/python/exercises/two-bucket/README.md +47 -0
  209. data/tracks/ruby/README.md +4 -1
  210. data/tracks/ruby/lib/generator/command_line.rb +3 -3
  211. data/tracks/ruby/lib/generator/command_line/generator_optparser.rb +3 -3
  212. data/tracks/ruby/test/generator/command_line/generator_optparser_test.rb +4 -4
  213. data/tracks/ruby/test/generator/command_line_test.rb +5 -5
  214. data/tracks/typescript/config.json +15 -0
  215. data/tracks/typescript/exercises/strain/README.md +60 -0
  216. data/tracks/typescript/exercises/strain/package.json +36 -0
  217. data/tracks/typescript/exercises/strain/strain.example.ts +23 -0
  218. data/tracks/typescript/exercises/strain/strain.test.ts +76 -0
  219. data/tracks/typescript/exercises/strain/strain.ts +0 -0
  220. data/tracks/typescript/exercises/strain/tsconfig.json +22 -0
  221. data/tracks/typescript/exercises/strain/tslint.json +127 -0
  222. data/tracks/typescript/exercises/strain/yarn.lock +2305 -0
  223. metadata +46 -3
  224. data/tracks/ecmascript/package-lock.json +0 -2835
@@ -0,0 +1,146 @@
1
+ class WordSearch {
2
+ constructor(grid) {
3
+ this.grid = grid;
4
+ }
5
+
6
+ find(words) {
7
+ return words
8
+ .map(word => ({[word]: findWordInAnyDirection(word, this.grid)}))
9
+ .reduce((acc, oneWord) => Object.assign(acc, oneWord), {});
10
+ }
11
+ }
12
+
13
+ function findWordInAnyDirection(word, grid) {
14
+ return searchHorizontally({word, grid})
15
+ || flipCoordinates(searchHorizontally({word, grid: flipGrid(grid)}))
16
+ || searchDiagonally({word, grid})
17
+ || searchDiagonally({word, grid, fromTop: false});
18
+ }
19
+
20
+ function searchHorizontally({word, grid}) {
21
+ let rowIndex = 0;
22
+ let startCol;
23
+ let start;
24
+ let end;
25
+
26
+ const getCoords = () => [[rowIndex + 1, startCol], [rowIndex + 1, startCol + word.length - 1]];
27
+
28
+ const getStartCol = (word) => 1 + grid[rowIndex].indexOf(word);
29
+
30
+ while (rowIndex < grid.length) {
31
+ startCol = getStartCol(word);
32
+ if (startCol) {
33
+ [start, end] = getCoords();
34
+ } else {
35
+ startCol = getStartCol([...word].reverse().join(''));
36
+ if (startCol) {
37
+ [end, start] = getCoords();
38
+ }
39
+ }
40
+ if (start && end) {
41
+ return {start, end};
42
+ }
43
+ rowIndex++;
44
+ }
45
+ }
46
+
47
+ function flipCoordinates(coords) {
48
+ if (!coords) {
49
+ return undefined;
50
+ }
51
+ return {
52
+ start: coords.start.reverse(),
53
+ end: coords.end.reverse()
54
+ };
55
+ }
56
+
57
+ function flipGrid(grid) {
58
+ return [...grid[0]]
59
+ .map((col, c) => grid.map((row, r) => grid[r][c]))
60
+ .map(row => row.join(''))
61
+ }
62
+
63
+ function searchDiagonally({word, grid, isReversed = false, fromTop = true}) {
64
+ let rIncrement = fromTop ? 1 : -1;
65
+ let startRow = fromTop ? 0 : grid.length - 1;
66
+ let endRow = fromTop ? (r) => r < grid.length : (r) => r > 0;
67
+ let diagonalFind = fromTop ? findAWordDiagonallyTopDown : findAWordDiagonallyBottomUp;
68
+
69
+ for (let r = startRow; (endRow)(r); r += rIncrement) {
70
+ for (let c = 0; c < grid[r].length; c++) {
71
+ const possibleCoords = diagonalFind(r, c, word, grid);
72
+ if (possibleCoords) {
73
+ return formatCoordinates(possibleCoords, isReversed);
74
+ }
75
+ }
76
+ }
77
+
78
+ if (!isReversed) {
79
+ //now find the reversed version
80
+ const reversedWord = [...word].reverse().join('');
81
+ return searchDiagonally({word: reversedWord, grid, isReversed: true, fromTop});
82
+ }
83
+ }
84
+
85
+ function formatCoordinates(coords, isReversed) {
86
+ return {
87
+ true: {
88
+ start: coords.end,
89
+ end: coords.start
90
+ },
91
+ false: coords
92
+ }[isReversed];
93
+ }
94
+
95
+ function findAWordDiagonallyTopDown(r, c, word, grid) {
96
+ function outOfRange(r, c, words, columns, letters) {
97
+ return r > columns - words + letters || c > columns - words + letters;
98
+ }
99
+
100
+ function buildCoords(startR, startC, r, c) {
101
+ return {
102
+ start: [startR, startC],
103
+ end: [r + 1, c]
104
+ }
105
+ }
106
+
107
+ return diagonalFind(r, c, word, grid, 1, outOfRange, buildCoords);
108
+ }
109
+
110
+ function findAWordDiagonallyBottomUp(r, c, word, grid) {
111
+ function outOfRange(r, c, words, columns, letters) {
112
+ return r < words - letters - 1 || c > columns - words + letters;
113
+ }
114
+
115
+ function buildCoords(startR, startC, r, c) {
116
+ return {
117
+ start: [startR, startC],
118
+ end: [r + 1, c]
119
+ };
120
+ }
121
+
122
+ return diagonalFind(r, c, word, grid, -1, outOfRange, buildCoords);
123
+ }
124
+
125
+ function diagonalFind(r, c, word, grid, rIncrement, outOfRange, buildCoords) {
126
+ let foundLetters = "";
127
+ let startR = r + 1;
128
+ let startC = c + 1;
129
+ for (let letter of word) {
130
+ if (outOfRange(r, c, word.length, grid[r].length, foundLetters.length)) {
131
+ return undefined;
132
+ }
133
+ let foundLetter = grid[r].charAt(c++);
134
+ if (foundLetter !== letter) {
135
+ return undefined;
136
+ }
137
+ foundLetters += foundLetter;
138
+ if (foundLetters === word) {
139
+ return buildCoords(startR, startC, r, c);
140
+ }
141
+ r += rIncrement;
142
+ }
143
+ }
144
+
145
+
146
+ module.exports = WordSearch;
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "xecmascript",
3
+ "version": "0.0.0",
4
+ "description": "Exercism exercises in ECMAScript 6.",
5
+ "author": "Katrina Owen",
6
+ "private": true,
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/exercism/xecmascript"
10
+ },
11
+ "devDependencies": {
12
+ "babel-jest": "^20.0.3",
13
+ "babel-plugin-transform-builtin-extend": "^1.1.2",
14
+ "babel-preset-env": "^1.4.0",
15
+ "eslint": "^3.19.0",
16
+ "eslint-config-airbnb": "^15.0.1",
17
+ "eslint-plugin-import": "^2.2.0",
18
+ "eslint-plugin-jsx-a11y": "^5.0.1",
19
+ "eslint-plugin-react": "^7.0.1",
20
+ "jest": "^20.0.4"
21
+ },
22
+ "jest": {
23
+ "modulePathIgnorePatterns": [
24
+ "package.json"
25
+ ]
26
+ },
27
+ "babel": {
28
+ "presets": [
29
+ "env"
30
+ ],
31
+ "plugins": [
32
+ [
33
+ "babel-plugin-transform-builtin-extend",
34
+ {
35
+ "globals": [
36
+ "Error"
37
+ ]
38
+ }
39
+ ],
40
+ ["transform-regenerator"]
41
+ ]
42
+ },
43
+ "scripts": {
44
+ "test": "jest --no-cache ./*",
45
+ "watch": "jest --no-cache --watch ./*",
46
+ "lint": "eslint .",
47
+ "lint-test": "eslint . && jest --no-cache ./* "
48
+ },
49
+ "eslintConfig": {
50
+ "parserOptions": {
51
+ "ecmaVersion": 6,
52
+ "sourceType": "module"
53
+ },
54
+ "env": {
55
+ "es6": true,
56
+ "node": true,
57
+ "jest": true
58
+ },
59
+ "extends": "airbnb",
60
+ "rules": {
61
+ "import/no-unresolved": "off",
62
+ "import/extensions": "off"
63
+ }
64
+ },
65
+ "licenses": [
66
+ "MIT"
67
+ ],
68
+ "dependencies": {}
69
+ }
@@ -0,0 +1,626 @@
1
+ import WordSearch from './word-search';
2
+
3
+
4
+ describe('single line grids', () => {
5
+ test('Should accept an initial game grid', () => {
6
+ const grid = ["jefblpepre"];
7
+
8
+ const wordSearch = new WordSearch(grid);
9
+
10
+ expect(wordSearch instanceof WordSearch).toEqual(true);
11
+ });
12
+
13
+ xtest('can accept a target search word', () => {
14
+
15
+ const grid = ["jefblpepre"];
16
+
17
+ const wordSearch = new WordSearch(grid);
18
+
19
+ expect(wordSearch.find(["glasnost"])).toEqual({"glasnost": undefined});
20
+ });
21
+
22
+ xtest('should locate a word written left to right', () => {
23
+ const grid = ["clojurermt"];
24
+
25
+ const expectedResults = {
26
+ "clojure": {
27
+ "start": [1, 1],
28
+ "end": [1, 7]
29
+ }
30
+ };
31
+
32
+
33
+ const wordSearch = new WordSearch(grid);
34
+
35
+ expect(wordSearch.find(["clojure"])).toEqual(expectedResults);
36
+ });
37
+
38
+ xtest('can locate a left to right word in a different position', () => {
39
+
40
+ const grid = ["mtclojurer"];
41
+
42
+ const expectedResults = {
43
+ "clojure": {
44
+ "start": [1, 3],
45
+ "end": [1, 9]
46
+ }
47
+ };
48
+
49
+ const wordSearch = new WordSearch(grid);
50
+
51
+ expect(wordSearch.find(["clojure"])).toEqual(expectedResults);
52
+
53
+ });
54
+
55
+ xtest('can locate a different left to right word', () => {
56
+
57
+ const grid = ["coffeelplx"];
58
+
59
+ const expectedResults = {
60
+ "coffee": {
61
+ "start": [1, 1],
62
+ "end": [1, 6]
63
+ }
64
+ };
65
+
66
+ const wordSearch = new WordSearch(grid);
67
+
68
+ expect(wordSearch.find(["coffee"])).toEqual(expectedResults);
69
+
70
+ });
71
+
72
+ xtest('can locate that different left to right word in a different position', () => {
73
+
74
+ const grid = ["xcoffeezlp"];
75
+
76
+ const expectedResults = {
77
+ "coffee": {
78
+ "start": [1, 2],
79
+ "end": [1, 7]
80
+ }
81
+ };
82
+
83
+ const wordSearch = new WordSearch(grid);
84
+
85
+ expect(wordSearch.find(["coffee"])).toEqual(expectedResults);
86
+
87
+ });
88
+
89
+ });
90
+
91
+ describe('multi line grids', () => {
92
+ xtest('can locate a left to right word in a two line grid', () => {
93
+
94
+ const grid = [
95
+ "jefblpepre",
96
+ "clojurermt"
97
+ ];
98
+
99
+ const expectedResults = {
100
+ "clojure": {
101
+ "start": [2, 1],
102
+ "end": [2, 7]
103
+ }
104
+ };
105
+
106
+ const wordSearch = new WordSearch(grid);
107
+
108
+ expect(wordSearch.find(["clojure"])).toEqual(expectedResults);
109
+
110
+ });
111
+
112
+ xtest('can locate a left to right word in a different position in a two line grid', () => {
113
+
114
+ const grid = [
115
+ "jefblpepre",
116
+ "tclojurerm"
117
+ ];
118
+
119
+ const expectedResults = {
120
+ "clojure": {
121
+ "start": [2, 2],
122
+ "end": [2, 8]
123
+ }
124
+ };
125
+
126
+ const wordSearch = new WordSearch(grid);
127
+
128
+ expect(wordSearch.find(["clojure"])).toEqual(expectedResults);
129
+
130
+ });
131
+
132
+ xtest('can locate a left to right word in a three line grid', () => {
133
+
134
+ const grid = [
135
+ "camdcimgtc",
136
+ "jefblpepre",
137
+ "clojurermt",
138
+ ];
139
+
140
+ const expectedResults = {
141
+ "clojure": {
142
+ "start": [3, 1],
143
+ "end": [3, 7]
144
+ }
145
+ };
146
+
147
+ const wordSearch = new WordSearch(grid);
148
+
149
+ expect(wordSearch.find(["clojure"])).toEqual(expectedResults);
150
+
151
+ });
152
+
153
+ xtest('can locate a left to right word in a ten line grid', () => {
154
+
155
+ const grid = [
156
+ "jefblpepre",
157
+ "camdcimgtc",
158
+ "oivokprjsm",
159
+ "pbwasqroua",
160
+ "rixilelhrs",
161
+ "wolcqlirpc",
162
+ "screeaumgr",
163
+ "alxhpburyi",
164
+ "jalaycalmp",
165
+ "clojurermt"
166
+ ];
167
+
168
+ const expectedResults = {
169
+ "clojure": {
170
+ "start": [10, 1],
171
+ "end": [10, 7]
172
+ }
173
+ };
174
+
175
+ const wordSearch = new WordSearch(grid);
176
+
177
+ expect(wordSearch.find(["clojure"])).toEqual(expectedResults);
178
+
179
+ });
180
+
181
+ xtest('can locate a left to right word in a different position in a ten line grid', () => {
182
+
183
+ const grid = [
184
+ "jefblpepre",
185
+ "camdcimgtc",
186
+ "oivokprjsm",
187
+ "pbwasqroua",
188
+ "rixilelhrs",
189
+ "wolcqlirpc",
190
+ "screeaumgr",
191
+ "alxhpburyi",
192
+ "clojurermt",
193
+ "jalaycalmp"
194
+ ];
195
+
196
+ const expectedResults = {
197
+ "clojure": {
198
+ "start": [9, 1],
199
+ "end": [9, 7]
200
+ }
201
+ };
202
+
203
+ const wordSearch = new WordSearch(grid);
204
+
205
+ expect(wordSearch.find(["clojure"])).toEqual(expectedResults);
206
+
207
+ });
208
+
209
+ xtest('can locate a different left to right word in a ten line grid', () => {
210
+
211
+ const grid = [
212
+ "jefblpepre",
213
+ "camdcimgtc",
214
+ "oivokprjsm",
215
+ "pbwasqroua",
216
+ "rixilelhrs",
217
+ "wolcqlirpc",
218
+ "screeaumgr",
219
+ "alxhpburyi",
220
+ "clojurermt",
221
+ "jalaycalmp"
222
+ ];
223
+
224
+ const expectedResults = {
225
+ "scree": {
226
+ "start": [7, 1],
227
+ "end": [7, 5]
228
+ }
229
+ };
230
+
231
+ const wordSearch = new WordSearch(grid);
232
+
233
+ expect(wordSearch.find(["scree"])).toEqual(expectedResults);
234
+
235
+ });
236
+
237
+ });
238
+
239
+
240
+ describe('can find multiple words', () => {
241
+ xtest('can find two words written left to right', () => {
242
+ const grid = [
243
+ "jefblpepre",
244
+ "camdcimgtc",
245
+ "oivokprjsm",
246
+ "pbwasqroua",
247
+ "rixilelhrs",
248
+ "wolcqlirpc",
249
+ "screeaumgr",
250
+ "alxhpburyi",
251
+ "jalaycalmp",
252
+ "clojurermt",
253
+ "xjavamtzlp"
254
+ ];
255
+
256
+ const expectedResults = {
257
+ "clojure": {
258
+ "start": [10, 1],
259
+ "end": [10, 7]
260
+ },
261
+ "java": {
262
+ "start": [11, 2],
263
+ "end": [11, 5]
264
+ }
265
+ };
266
+
267
+ const wordSearch = new WordSearch(grid);
268
+
269
+ expect(wordSearch.find(["java", "clojure"])).toEqual(expectedResults);
270
+
271
+ });
272
+ });
273
+
274
+ describe('different directions', () => {
275
+
276
+
277
+
278
+ xtest('should locate a single word written right to left', () => {
279
+ const grid = ["rixilelhrs"];
280
+
281
+ const expectedResults = {
282
+ "elixir": {
283
+ "start": [1, 6],
284
+ "end": [1, 1]
285
+ }
286
+ };
287
+
288
+ const wordSearch = new WordSearch(grid);
289
+
290
+ expect(wordSearch.find(["elixir"])).toEqual(expectedResults);
291
+
292
+ });
293
+
294
+ xtest('should locate multiple words written in different horizontal directions', ()=> {
295
+ const grid = [
296
+ "jefblpepre",
297
+ "camdcimgtc",
298
+ "oivokprjsm",
299
+ "pbwasqroua",
300
+ "rixilelhrs",
301
+ "wolcqlirpc",
302
+ "screeaumgr",
303
+ "alxhpburyi",
304
+ "jalaycalmp",
305
+ "clojurermt"
306
+ ];
307
+
308
+ const expectedResults = {
309
+ "clojure": {
310
+ "start": [10, 1],
311
+ "end": [10, 7]
312
+ },
313
+ "elixir": {
314
+ "start": [5, 6],
315
+ "end": [5, 1]
316
+ }
317
+ };
318
+
319
+ const wordSearch = new WordSearch(grid);
320
+
321
+ expect(wordSearch.find(["elixir", "clojure"])).toEqual(expectedResults);
322
+
323
+ });
324
+ });
325
+
326
+ describe('vertical directions', ()=> {
327
+ xtest('should locate words written top to bottom', ()=> {
328
+ const grid = [
329
+ "jefblpepre",
330
+ "camdcimgtc",
331
+ "oivokprjsm",
332
+ "pbwasqroua",
333
+ "rixilelhrs",
334
+ "wolcqlirpc",
335
+ "screeaumgr",
336
+ "alxhpburyi",
337
+ "jalaycalmp",
338
+ "clojurermt"
339
+ ];
340
+
341
+ const expectedResults = {
342
+ "clojure": {
343
+ "start": [10, 1],
344
+ "end": [10, 7]
345
+ },
346
+ "elixir": {
347
+ "start": [5, 6],
348
+ "end": [5, 1]
349
+ },
350
+ "ecmascript": {
351
+ "start": [1, 10],
352
+ "end": [10, 10]
353
+ }
354
+ };
355
+
356
+ const wordSearch = new WordSearch(grid);
357
+
358
+ expect(wordSearch.find(["elixir", "clojure", "ecmascript"])).toEqual(expectedResults);
359
+
360
+ });
361
+
362
+ xtest('should locate words written bottom to top', ()=> {
363
+ const grid = [
364
+ "jefblpepre",
365
+ "camdcimgtc",
366
+ "oivokprjsm",
367
+ "pbwasqroua",
368
+ "rixilelhrs",
369
+ "wolcqlirpc",
370
+ "screeaumgr",
371
+ "alxhpburyi",
372
+ "jalaycalmp",
373
+ "clojurermt"
374
+ ];
375
+
376
+ const expectedResults = {
377
+ "clojure": {
378
+ "start": [10, 1],
379
+ "end": [10, 7]
380
+ },
381
+ "elixir": {
382
+ "start": [5, 6],
383
+ "end": [5, 1]
384
+ },
385
+ "ecmascript": {
386
+ "start": [1, 10],
387
+ "end": [10, 10]
388
+ },
389
+ "rust":{
390
+ "start": [5, 9],
391
+ "end": [2, 9]
392
+ }
393
+ };
394
+
395
+ const wordSearch = new WordSearch(grid);
396
+
397
+ expect(wordSearch.find(["elixir", "clojure", "ecmascript", "rust"])).toEqual(expectedResults);
398
+
399
+ });
400
+ xtest('should locate words written top left to bottom right', ()=> {
401
+ const grid = [
402
+ "jefblpepre",
403
+ "camdcimgtc",
404
+ "oivokprjsm",
405
+ "pbwasqroua",
406
+ "rixilelhrs",
407
+ "wolcqlirpc",
408
+ "screeaumgr",
409
+ "alxhpburyi",
410
+ "jalaycalmp",
411
+ "clojurermt"
412
+ ];
413
+
414
+ const expectedResults = {
415
+ "clojure": {
416
+ "start": [10, 1],
417
+ "end": [10, 7]
418
+ },
419
+ "elixir": {
420
+ "start": [5, 6],
421
+ "end": [5, 1]
422
+ },
423
+ "ecmascript": {
424
+ "start": [1, 10],
425
+ "end": [10, 10]
426
+ },
427
+ "rust": {
428
+ "start": [5, 9],
429
+ "end": [2, 9]
430
+ },
431
+ "java": {
432
+ "start": [1, 1],
433
+ "end": [4, 4]
434
+ }
435
+ };
436
+
437
+ const wordSearch = new WordSearch(grid);
438
+
439
+ expect(wordSearch.find([
440
+ "clojure",
441
+ "elixir",
442
+ "ecmascript",
443
+ "rust",
444
+ "java"
445
+ ])).toEqual(expectedResults);
446
+
447
+ });
448
+
449
+ xtest('should locate words written bottom right to top left', ()=> {
450
+ const grid = [
451
+ "jefblpepre",
452
+ "camdcimgtc",
453
+ "oivokprjsm",
454
+ "pbwasqroua",
455
+ "rixilelhrs",
456
+ "wolcqlirpc",
457
+ "screeaumgr",
458
+ "alxhpburyi",
459
+ "jalaycalmp",
460
+ "clojurermt"
461
+ ];
462
+
463
+ const expectedResults = {
464
+ "clojure": {
465
+ "start": [10, 1],
466
+ "end": [10, 7]
467
+ },
468
+ "elixir": {
469
+ "start": [5, 6],
470
+ "end": [5, 1]
471
+ },
472
+ "ecmascript": {
473
+ "start": [1, 10],
474
+ "end": [10, 10]
475
+ },
476
+ "rust": {
477
+ "start": [5, 9],
478
+ "end": [2, 9]
479
+ },
480
+ "java": {
481
+ "start": [1, 1],
482
+ "end": [4, 4]
483
+ },
484
+ "lua": {
485
+ "start": [9, 8],
486
+ "end": [7, 6]
487
+ }
488
+ };
489
+
490
+ const wordSearch = new WordSearch(grid);
491
+
492
+ expect(wordSearch.find([
493
+ "clojure",
494
+ "elixir",
495
+ "ecmascript",
496
+ "rust",
497
+ "java",
498
+ "lua"
499
+ ])).toEqual(expectedResults);
500
+
501
+ });
502
+
503
+ xtest('should locate words written bottom left to top right', ()=> {
504
+ const grid = [
505
+ "jefblpepre",
506
+ "camdcimgtc",
507
+ "oivokprjsm",
508
+ "pbwasqroua",
509
+ "rixilelhrs",
510
+ "wolcqlirpc",
511
+ "screeaumgr",
512
+ "alxhpburyi",
513
+ "jalaycalmp",
514
+ "clojurermt"
515
+ ];
516
+
517
+ const expectedResults = {
518
+ "clojure": {
519
+ "start": [10, 1],
520
+ "end": [10, 7]
521
+ },
522
+ "elixir": {
523
+ "start": [5, 6],
524
+ "end": [5, 1]
525
+ },
526
+ "ecmascript": {
527
+ "start": [1, 10],
528
+ "end": [10, 10]
529
+ },
530
+ "rust": {
531
+ "start": [5, 9],
532
+ "end": [2, 9]
533
+ },
534
+ "java": {
535
+ "start": [1, 1],
536
+ "end": [4, 4]
537
+ },
538
+ "lua": {
539
+ "start": [9, 8],
540
+ "end": [7, 6]
541
+ },
542
+ "lisp": {
543
+ "start": [6, 3],
544
+ "end": [3, 6]
545
+ }
546
+ };
547
+
548
+ const wordSearch = new WordSearch(grid);
549
+
550
+ expect(wordSearch.find([
551
+ "clojure",
552
+ "elixir",
553
+ "ecmascript",
554
+ "rust",
555
+ "java",
556
+ "lua",
557
+ "lisp"
558
+ ])).toEqual(expectedResults);
559
+
560
+ });
561
+
562
+ xtest('should locate words written top right to bottom left', ()=> {
563
+ const grid = [
564
+ "jefblpepre",
565
+ "camdcimgtc",
566
+ "oivokprjsm",
567
+ "pbwasqroua",
568
+ "rixilelhrs",
569
+ "wolcqlirpc",
570
+ "screeaumgr",
571
+ "alxhpburyi",
572
+ "jalaycalmp",
573
+ "clojurermt"
574
+ ];
575
+
576
+ const expectedResults = {
577
+ "clojure": {
578
+ "start": [10, 1],
579
+ "end": [10, 7]
580
+ },
581
+ "elixir": {
582
+ "start": [5, 6],
583
+ "end": [5, 1]
584
+ },
585
+ "ecmascript": {
586
+ "start": [1, 10],
587
+ "end": [10, 10]
588
+ },
589
+ "rust": {
590
+ "start": [5, 9],
591
+ "end": [2, 9]
592
+ },
593
+ "java": {
594
+ "start": [1, 1],
595
+ "end": [4, 4]
596
+ },
597
+ "lua": {
598
+ "start": [9, 8],
599
+ "end": [7, 6]
600
+ },
601
+ "lisp": {
602
+ "start": [6, 3],
603
+ "end": [3, 6]
604
+ },
605
+ "ruby": {
606
+ "start": [6, 8],
607
+ "end": [9, 5]
608
+ }
609
+ };
610
+
611
+ const wordSearch = new WordSearch(grid);
612
+
613
+ expect(wordSearch.find([
614
+ "clojure",
615
+ "elixir",
616
+ "ecmascript",
617
+ "rust",
618
+ "java",
619
+ "lua",
620
+ "lisp",
621
+ "ruby"
622
+ ])).toEqual(expectedResults);
623
+
624
+ });
625
+
626
+ });