trackler 2.2.1.104 → 2.2.1.105

Sign up to get free protection for your applications and to get access to all the features.
Files changed (608) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/.travis.yml +41 -1
  4. data/problem-specifications/README.md +5 -5
  5. data/problem-specifications/canonical-schema.json +11 -6
  6. data/problem-specifications/exercises/all-your-base/canonical-data.json +2 -2
  7. data/problem-specifications/exercises/circular-buffer/USE_OLD_SCHEMA +0 -0
  8. data/problem-specifications/exercises/complex-numbers/canonical-data.json +9 -1
  9. data/problem-specifications/exercises/forth/USE_OLD_SCHEMA +0 -0
  10. data/problem-specifications/exercises/grains/USE_OLD_SCHEMA +0 -0
  11. data/problem-specifications/exercises/grep/USE_OLD_SCHEMA +0 -0
  12. data/problem-specifications/exercises/house/USE_OLD_SCHEMA +0 -0
  13. data/problem-specifications/exercises/isogram/USE_OLD_SCHEMA +0 -0
  14. data/problem-specifications/exercises/list-ops/USE_OLD_SCHEMA +0 -0
  15. data/problem-specifications/exercises/pov/USE_OLD_SCHEMA +0 -0
  16. data/problem-specifications/exercises/scale-generator/canonical-data.json +181 -0
  17. data/problem-specifications/exercises/trinary/USE_OLD_SCHEMA +0 -0
  18. data/problem-specifications/exercises/word-search/USE_OLD_SCHEMA +0 -0
  19. data/problem-specifications/exercises/zipper/USE_OLD_SCHEMA +0 -0
  20. data/problem-specifications/old-schema.json +137 -0
  21. data/tracks/bash/config.json +13 -1
  22. data/tracks/bash/exercises/scrabble-score/.meta/version +1 -0
  23. data/tracks/bash/exercises/scrabble-score/README.md +55 -0
  24. data/tracks/bash/exercises/scrabble-score/example.sh +14 -0
  25. data/tracks/bash/exercises/scrabble-score/scrabble_score_test.sh +89 -0
  26. data/tracks/c/config/exercise_readme.go.tmpl +31 -4
  27. data/tracks/c/exercises/all-your-base/README.md +0 -1
  28. data/tracks/c/exercises/beer-song/README.md +1 -1
  29. data/tracks/c/exercises/collatz-conjecture/README.md +1 -1
  30. data/tracks/c/exercises/complex-numbers/README.md +21 -18
  31. data/tracks/c/exercises/nucleotide-count/README.md +2 -2
  32. data/tracks/c/exercises/palindrome-products/README.md +5 -12
  33. data/tracks/c/exercises/pangram/test/test_pangram.c +11 -22
  34. data/tracks/c/exercises/pascals-triangle/README.md +1 -1
  35. data/tracks/c/exercises/phone-number/README.md +1 -1
  36. data/tracks/c/exercises/react/README.md +0 -1
  37. data/tracks/c/exercises/rna-transcription/README.md +2 -2
  38. data/tracks/c/exercises/sublist/README.md +0 -1
  39. data/tracks/c/exercises/sum-of-multiples/README.md +3 -6
  40. data/tracks/ceylon/config/exercise_readme.go.tmpl +15 -4
  41. data/tracks/ceylon/exercises/react/README.md +0 -1
  42. data/tracks/cfml/{docs/EXERCISE_README_INSERT.md → config/exercise-readme-insert.md} +0 -0
  43. data/tracks/cfml/exercises/acronym/AcronymTest.cfc +2 -6
  44. data/tracks/cfml/exercises/acronym/README.md +0 -1
  45. data/tracks/cfml/exercises/anagram/AnagramTest.cfc +0 -16
  46. data/tracks/cfml/exercises/atbash-cipher/README.md +2 -1
  47. data/tracks/cfml/exercises/bob/Bob.cfc +1 -1
  48. data/tracks/cfml/exercises/bob/BobTest.cfc +25 -25
  49. data/tracks/cfml/exercises/bob/README.md +2 -0
  50. data/tracks/cfml/exercises/bob/Solution.cfc +17 -5
  51. data/tracks/cfml/exercises/diamond/Diamond.cfc +1 -1
  52. data/tracks/cfml/exercises/diamond/DiamondTest.cfc +5 -5
  53. data/tracks/cfml/exercises/diamond/README.md +6 -6
  54. data/tracks/cfml/exercises/diamond/Solution.cfc +2 -2
  55. data/tracks/cfml/exercises/flatten-array/FlattenArray.cfc +1 -1
  56. data/tracks/cfml/exercises/flatten-array/FlattenArrayTest.cfc +6 -9
  57. data/tracks/cfml/exercises/flatten-array/README.md +1 -2
  58. data/tracks/cfml/exercises/flatten-array/Solution.cfc +2 -2
  59. data/tracks/cfml/exercises/gigasecond/Gigasecond.cfc +1 -1
  60. data/tracks/cfml/exercises/gigasecond/GigasecondTest.cfc +5 -5
  61. data/tracks/cfml/exercises/gigasecond/Solution.cfc +3 -3
  62. data/tracks/cfml/exercises/grains/README.md +0 -1
  63. data/tracks/cfml/exercises/grains/Solution.cfc +4 -1
  64. data/tracks/cfml/exercises/hamming/HammingTest.cfc +2 -2
  65. data/tracks/cfml/exercises/hello-world/HelloWorld.cfc +1 -1
  66. data/tracks/cfml/exercises/hello-world/HelloWorldTest.cfc +5 -4
  67. data/tracks/cfml/exercises/hello-world/Solution.cfc +1 -1
  68. data/tracks/cfml/exercises/isogram/IsogramTest.cfc +2 -2
  69. data/tracks/cfml/exercises/isogram/README.md +2 -1
  70. data/tracks/cfml/exercises/leap/Leap.cfc +1 -1
  71. data/tracks/cfml/exercises/leap/LeapTest.cfc +14 -22
  72. data/tracks/cfml/exercises/leap/README.md +1 -1
  73. data/tracks/cfml/exercises/leap/Solution.cfc +1 -1
  74. data/tracks/cfml/exercises/luhn/Luhn.cfc +1 -1
  75. data/tracks/cfml/exercises/luhn/LuhnTest.cfc +14 -14
  76. data/tracks/cfml/exercises/luhn/README.md +7 -7
  77. data/tracks/cfml/exercises/luhn/Solution.cfc +6 -6
  78. data/tracks/cfml/exercises/markdown/Markdown.cfc +4 -4
  79. data/tracks/cfml/exercises/markdown/MarkdownTest.cfc +9 -9
  80. data/tracks/cfml/exercises/markdown/Solution.cfc +4 -4
  81. data/tracks/cfml/exercises/nth-prime/NthPrime.cfc +1 -1
  82. data/tracks/cfml/exercises/nth-prime/NthPrimeTest.cfc +5 -5
  83. data/tracks/cfml/exercises/nth-prime/Solution.cfc +4 -4
  84. data/tracks/cfml/exercises/pangram/Pangram.cfc +1 -1
  85. data/tracks/cfml/exercises/pangram/PangramTest.cfc +14 -10
  86. data/tracks/cfml/exercises/pangram/README.md +1 -1
  87. data/tracks/cfml/exercises/pangram/Solution.cfc +4 -4
  88. data/tracks/cfml/exercises/pig-latin/PigLatin.cfc +1 -1
  89. data/tracks/cfml/exercises/pig-latin/PigLatinTest.cfc +35 -23
  90. data/tracks/cfml/exercises/pig-latin/Solution.cfc +4 -4
  91. data/tracks/cfml/exercises/rna-transcription/README.md +2 -2
  92. data/tracks/cfml/exercises/rna-transcription/RnaTranscriptionTest.cfc +0 -12
  93. data/tracks/cfml/exercises/saddle-points/README.md +2 -2
  94. data/tracks/cfml/exercises/saddle-points/SaddlePoints.cfc +1 -1
  95. data/tracks/cfml/exercises/saddle-points/SaddlePointsTest.cfc +5 -5
  96. data/tracks/cfml/exercises/saddle-points/Solution.cfc +10 -10
  97. data/tracks/cfml/exercises/scrabble-score/README.md +3 -1
  98. data/tracks/cfml/exercises/scrabble-score/ScrabbleScore.cfc +1 -1
  99. data/tracks/cfml/exercises/scrabble-score/ScrabbleScoreTest.cfc +11 -11
  100. data/tracks/cfml/exercises/scrabble-score/Solution.cfc +2 -2
  101. data/tracks/cfml/exercises/secret-handshake/README.md +2 -2
  102. data/tracks/cfml/exercises/secret-handshake/SecretHandshake.cfc +1 -1
  103. data/tracks/cfml/exercises/secret-handshake/SecretHandshakeTest.cfc +11 -11
  104. data/tracks/cfml/exercises/secret-handshake/Solution.cfc +6 -6
  105. data/tracks/cfml/exercises/space-age/README.md +1 -2
  106. data/tracks/cfml/exercises/sum-of-multiples/README.md +3 -6
  107. data/tracks/cfml/exercises/sum-of-multiples/SumOfMultiplesTest.cfc +4 -0
  108. data/tracks/cfml/exercises/triangle/README.md +9 -6
  109. data/tracks/cfml/exercises/word-count/README.md +1 -2
  110. data/tracks/cfml/exercises/word-count/Solution.cfc +2 -2
  111. data/tracks/cfml/exercises/word-count/WordCount.cfc +1 -1
  112. data/tracks/cfml/exercises/word-count/WordCountTest.cfc +14 -10
  113. data/tracks/cfml/tasks/GenerateReadme.cfc +2 -2
  114. data/tracks/cfml/tasks/GenerateTests.cfc +17 -4
  115. data/tracks/cfml/tasks/TestAllSolutions.cfc +3 -0
  116. data/tracks/common-lisp/config/exercise_readme.go.tmpl +46 -4
  117. data/tracks/common-lisp/exercises/acronym/README.md +1 -1
  118. data/tracks/common-lisp/exercises/beer-song/README.md +1 -1
  119. data/tracks/common-lisp/exercises/crypto-square/README.md +6 -4
  120. data/tracks/common-lisp/exercises/etl/README.md +2 -2
  121. data/tracks/common-lisp/exercises/isogram/README.md +3 -1
  122. data/tracks/common-lisp/exercises/meetup/README.md +16 -12
  123. data/tracks/common-lisp/exercises/nucleotide-count/README.md +2 -2
  124. data/tracks/common-lisp/exercises/pascals-triangle/README.md +1 -1
  125. data/tracks/common-lisp/exercises/phone-number/README.md +1 -1
  126. data/tracks/common-lisp/exercises/rna-transcription/README.md +2 -2
  127. data/tracks/common-lisp/exercises/space-age/README.md +1 -2
  128. data/tracks/common-lisp/exercises/sublist/README.md +2 -0
  129. data/tracks/crystal/config/exercise_readme.go.tmpl +22 -4
  130. data/tracks/crystal/exercises/acronym/README.md +0 -1
  131. data/tracks/crystal/exercises/atbash-cipher/README.md +2 -1
  132. data/tracks/crystal/exercises/binary/README.md +2 -0
  133. data/tracks/{php → crystal}/exercises/bob/.meta/description.md +0 -0
  134. data/tracks/crystal/exercises/flatten-array/README.md +1 -2
  135. data/tracks/crystal/exercises/forth/README.md +0 -1
  136. data/tracks/crystal/exercises/leap/README.md +1 -1
  137. data/tracks/crystal/exercises/pangram/README.md +1 -1
  138. data/tracks/crystal/exercises/pascals-triangle/README.md +2 -2
  139. data/tracks/crystal/exercises/react/README.md +0 -1
  140. data/tracks/crystal/exercises/rna-transcription/README.md +2 -2
  141. data/tracks/crystal/exercises/roman-numerals/README.md +1 -1
  142. data/tracks/crystal/exercises/run-length-encoding/README.md +4 -4
  143. data/tracks/csharp/config/exercise_readme.go.tmpl +0 -3
  144. data/tracks/csharp/exercises/accumulate/README.md +0 -3
  145. data/tracks/csharp/exercises/acronym/README.md +0 -3
  146. data/tracks/csharp/exercises/all-your-base/README.md +0 -3
  147. data/tracks/csharp/exercises/allergies/README.md +0 -3
  148. data/tracks/csharp/exercises/alphametics/README.md +0 -3
  149. data/tracks/csharp/exercises/anagram/README.md +0 -3
  150. data/tracks/csharp/exercises/armstrong-numbers/README.md +0 -3
  151. data/tracks/csharp/exercises/atbash-cipher/README.md +0 -3
  152. data/tracks/csharp/exercises/bank-account/README.md +0 -3
  153. data/tracks/csharp/exercises/beer-song/README.md +0 -3
  154. data/tracks/csharp/exercises/binary-search-tree/README.md +0 -3
  155. data/tracks/csharp/exercises/binary-search/README.md +0 -3
  156. data/tracks/csharp/exercises/binary/README.md +0 -3
  157. data/tracks/csharp/exercises/bob/README.md +0 -3
  158. data/tracks/csharp/exercises/book-store/README.md +0 -3
  159. data/tracks/csharp/exercises/bowling/README.md +0 -3
  160. data/tracks/csharp/exercises/bracket-push/README.md +0 -3
  161. data/tracks/csharp/exercises/change/README.md +0 -3
  162. data/tracks/csharp/exercises/circular-buffer/README.md +0 -3
  163. data/tracks/csharp/exercises/clock/README.md +0 -3
  164. data/tracks/csharp/exercises/collatz-conjecture/README.md +0 -3
  165. data/tracks/csharp/exercises/complex-numbers/README.md +0 -3
  166. data/tracks/csharp/exercises/connect/README.md +0 -3
  167. data/tracks/csharp/exercises/crypto-square/README.md +0 -3
  168. data/tracks/csharp/exercises/custom-set/README.md +0 -3
  169. data/tracks/csharp/exercises/diamond/README.md +0 -3
  170. data/tracks/csharp/exercises/difference-of-squares/README.md +0 -3
  171. data/tracks/csharp/exercises/diffie-hellman/README.md +0 -3
  172. data/tracks/csharp/exercises/dominoes/README.md +0 -3
  173. data/tracks/csharp/exercises/dot-dsl/README.md +0 -3
  174. data/tracks/csharp/exercises/error-handling/README.md +0 -3
  175. data/tracks/csharp/exercises/etl/README.md +0 -3
  176. data/tracks/csharp/exercises/flatten-array/README.md +0 -3
  177. data/tracks/csharp/exercises/food-chain/README.md +0 -3
  178. data/tracks/csharp/exercises/forth/README.md +0 -3
  179. data/tracks/csharp/exercises/gigasecond/README.md +0 -3
  180. data/tracks/csharp/exercises/go-counting/README.md +0 -3
  181. data/tracks/csharp/exercises/grade-school/README.md +0 -3
  182. data/tracks/csharp/exercises/grains/README.md +0 -3
  183. data/tracks/csharp/exercises/grep/README.md +0 -3
  184. data/tracks/csharp/exercises/hamming/README.md +0 -3
  185. data/tracks/csharp/exercises/hangman/README.md +0 -3
  186. data/tracks/csharp/exercises/hello-world/README.md +0 -3
  187. data/tracks/csharp/exercises/hexadecimal/README.md +0 -3
  188. data/tracks/csharp/exercises/house/README.md +0 -3
  189. data/tracks/csharp/exercises/isbn-verifier/README.md +0 -3
  190. data/tracks/csharp/exercises/isogram/README.md +0 -3
  191. data/tracks/csharp/exercises/kindergarten-garden/README.md +0 -3
  192. data/tracks/csharp/exercises/largest-series-product/README.md +0 -3
  193. data/tracks/csharp/exercises/leap/README.md +0 -3
  194. data/tracks/csharp/exercises/ledger/README.md +0 -3
  195. data/tracks/csharp/exercises/linked-list/README.md +0 -3
  196. data/tracks/csharp/exercises/list-ops/README.md +0 -3
  197. data/tracks/csharp/exercises/luhn/README.md +0 -3
  198. data/tracks/csharp/exercises/markdown/README.md +0 -3
  199. data/tracks/csharp/exercises/matrix/README.md +0 -3
  200. data/tracks/csharp/exercises/meetup/README.md +0 -3
  201. data/tracks/csharp/exercises/minesweeper/README.md +0 -3
  202. data/tracks/csharp/exercises/nth-prime/README.md +0 -3
  203. data/tracks/csharp/exercises/nucleotide-count/README.md +0 -3
  204. data/tracks/csharp/exercises/ocr-numbers/README.md +0 -3
  205. data/tracks/csharp/exercises/octal/README.md +0 -3
  206. data/tracks/csharp/exercises/palindrome-products/README.md +0 -3
  207. data/tracks/csharp/exercises/pangram/README.md +0 -3
  208. data/tracks/csharp/exercises/parallel-letter-frequency/README.md +0 -3
  209. data/tracks/csharp/exercises/pascals-triangle/README.md +0 -3
  210. data/tracks/csharp/exercises/perfect-numbers/README.md +0 -3
  211. data/tracks/csharp/exercises/phone-number/README.md +0 -3
  212. data/tracks/csharp/exercises/pig-latin/README.md +0 -3
  213. data/tracks/csharp/exercises/poker/README.md +0 -3
  214. data/tracks/csharp/exercises/pov/README.md +0 -3
  215. data/tracks/csharp/exercises/prime-factors/README.md +0 -3
  216. data/tracks/csharp/exercises/protein-translation/README.md +0 -3
  217. data/tracks/csharp/exercises/proverb/README.md +0 -3
  218. data/tracks/csharp/exercises/pythagorean-triplet/README.md +0 -3
  219. data/tracks/csharp/exercises/queen-attack/README.md +0 -3
  220. data/tracks/csharp/exercises/rail-fence-cipher/README.md +0 -3
  221. data/tracks/csharp/exercises/raindrops/README.md +0 -3
  222. data/tracks/csharp/exercises/react/README.md +0 -3
  223. data/tracks/csharp/exercises/rectangles/README.md +0 -3
  224. data/tracks/csharp/exercises/reverse-string/README.md +0 -3
  225. data/tracks/csharp/exercises/rna-transcription/README.md +0 -3
  226. data/tracks/csharp/exercises/robot-name/README.md +0 -3
  227. data/tracks/csharp/exercises/robot-simulator/README.md +0 -3
  228. data/tracks/csharp/exercises/roman-numerals/README.md +0 -3
  229. data/tracks/csharp/exercises/rotational-cipher/README.md +0 -3
  230. data/tracks/csharp/exercises/run-length-encoding/README.md +0 -3
  231. data/tracks/csharp/exercises/saddle-points/README.md +0 -3
  232. data/tracks/csharp/exercises/say/README.md +0 -3
  233. data/tracks/csharp/exercises/scale-generator/README.md +0 -3
  234. data/tracks/csharp/exercises/scrabble-score/README.md +0 -3
  235. data/tracks/csharp/exercises/secret-handshake/README.md +0 -3
  236. data/tracks/csharp/exercises/series/README.md +0 -3
  237. data/tracks/csharp/exercises/sgf-parsing/README.md +0 -3
  238. data/tracks/csharp/exercises/sieve/README.md +0 -3
  239. data/tracks/csharp/exercises/simple-cipher/README.md +0 -3
  240. data/tracks/csharp/exercises/simple-linked-list/README.md +0 -3
  241. data/tracks/csharp/exercises/space-age/README.md +0 -3
  242. data/tracks/csharp/exercises/spiral-matrix/README.md +0 -3
  243. data/tracks/csharp/exercises/strain/README.md +0 -3
  244. data/tracks/csharp/exercises/sublist/README.md +0 -3
  245. data/tracks/csharp/exercises/sum-of-multiples/README.md +0 -3
  246. data/tracks/csharp/exercises/tournament/README.md +0 -3
  247. data/tracks/csharp/exercises/transpose/README.md +0 -3
  248. data/tracks/csharp/exercises/tree-building/README.md +0 -3
  249. data/tracks/csharp/exercises/triangle/README.md +0 -3
  250. data/tracks/csharp/exercises/trinary/README.md +0 -3
  251. data/tracks/csharp/exercises/twelve-days/README.md +0 -3
  252. data/tracks/csharp/exercises/two-bucket/README.md +0 -3
  253. data/tracks/csharp/exercises/two-fer/README.md +0 -3
  254. data/tracks/csharp/exercises/variable-length-quantity/README.md +0 -3
  255. data/tracks/csharp/exercises/word-count/README.md +0 -3
  256. data/tracks/csharp/exercises/word-search/README.md +0 -3
  257. data/tracks/csharp/exercises/wordy/README.md +0 -3
  258. data/tracks/csharp/exercises/zebra-puzzle/README.md +0 -3
  259. data/tracks/csharp/exercises/zipper/README.md +0 -3
  260. data/tracks/dart/config/exercise_readme.go.tmpl +9 -4
  261. data/tracks/dart/exercises/anagram/README.md +0 -1
  262. data/tracks/dart/exercises/difference-of-squares/README.md +0 -1
  263. data/tracks/dart/exercises/gigasecond/README.md +0 -1
  264. data/tracks/dart/exercises/hamming/README.md +0 -1
  265. data/tracks/dart/exercises/hello-world/README.md +0 -1
  266. data/tracks/dart/exercises/leap/README.md +0 -1
  267. data/tracks/dart/exercises/phone-number/.meta/hints.md +24 -0
  268. data/tracks/dart/exercises/phone-number/README.md +17 -2
  269. data/tracks/dart/exercises/raindrops/README.md +0 -1
  270. data/tracks/dart/exercises/rna-transcription/README.md +2 -3
  271. data/tracks/dart/exercises/word-count/README.md +0 -1
  272. data/tracks/delphi/config/exercise_readme.go.tmpl +20 -4
  273. data/tracks/delphi/exercises/bank-account/README.md +0 -1
  274. data/tracks/delphi/exercises/minesweeper/README.md +0 -1
  275. data/tracks/delphi/exercises/two-fer/README.md +1 -1
  276. data/tracks/elixir/exercises/all-your-base/all-your-base-test.exs +1 -2
  277. data/tracks/elm/README.md +23 -20
  278. data/tracks/elm/bin/build.sh +1 -1
  279. data/tracks/elm/bin/install-elm-format +2 -2
  280. data/tracks/elm/exercises/accumulate/tests/Tests.elm +2 -2
  281. data/tracks/elm/exercises/all-your-base/AllYourBase.example.elm +10 -10
  282. data/tracks/elm/exercises/all-your-base/tests/Tests.elm +62 -42
  283. data/tracks/elm/exercises/allergies/Allergies.example.elm +1 -1
  284. data/tracks/elm/exercises/allergies/tests/Tests.elm +4 -4
  285. data/tracks/elm/exercises/anagram/Anagram.example.elm +2 -2
  286. data/tracks/elm/exercises/anagram/tests/Tests.elm +2 -2
  287. data/tracks/elm/exercises/atbash-cipher/AtbashCipher.example.elm +11 -11
  288. data/tracks/elm/exercises/atbash-cipher/tests/Tests.elm +2 -2
  289. data/tracks/elm/exercises/bob/Bob.example.elm +1 -1
  290. data/tracks/elm/exercises/bob/tests/Tests.elm +5 -5
  291. data/tracks/elm/exercises/collatz-conjecture/tests/Tests.elm +2 -2
  292. data/tracks/elm/exercises/difference-of-squares/DifferenceOfSquares.example.elm +1 -1
  293. data/tracks/elm/exercises/difference-of-squares/tests/Tests.elm +2 -2
  294. data/tracks/elm/exercises/gigasecond/tests/Tests.elm +2 -2
  295. data/tracks/elm/exercises/grade-school/GradeSchool.example.elm +2 -2
  296. data/tracks/elm/exercises/grade-school/tests/Tests.elm +3 -3
  297. data/tracks/elm/exercises/hamming/tests/Tests.elm +1 -1
  298. data/tracks/elm/exercises/hello-world/tests/Tests.elm +1 -1
  299. data/tracks/elm/exercises/isogram/Isogram.example.elm +7 -7
  300. data/tracks/elm/exercises/isogram/tests/Tests.elm +1 -1
  301. data/tracks/elm/exercises/largest-series-product/LargestSeriesProduct.example.elm +4 -4
  302. data/tracks/elm/exercises/largest-series-product/tests/Tests.elm +1 -1
  303. data/tracks/elm/exercises/leap/tests/Tests.elm +1 -1
  304. data/tracks/elm/exercises/list-ops/tests/Tests.elm +1 -1
  305. data/tracks/elm/exercises/nucleotide-count/NucleotideCount.elm +1 -1
  306. data/tracks/elm/exercises/nucleotide-count/tests/Tests.elm +1 -1
  307. data/tracks/elm/exercises/pangram/Pangram.example.elm +2 -2
  308. data/tracks/elm/exercises/pangram/tests/Tests.elm +1 -1
  309. data/tracks/elm/exercises/pascals-triangle/Triangle.example.elm +4 -4
  310. data/tracks/elm/exercises/phone-number/PhoneNumber.example.elm +3 -3
  311. data/tracks/elm/exercises/phone-number/tests/Tests.elm +1 -1
  312. data/tracks/elm/exercises/raindrops/Raindrops.example.elm +4 -4
  313. data/tracks/elm/exercises/raindrops/tests/Tests.elm +1 -1
  314. data/tracks/elm/exercises/rna-transcription/tests/Tests.elm +1 -7
  315. data/tracks/elm/exercises/robot-simulator/RobotSimulator.example.elm +5 -5
  316. data/tracks/elm/exercises/robot-simulator/tests/Tests.elm +65 -65
  317. data/tracks/elm/exercises/roman-numerals/RomanNumerals.example.elm +1 -1
  318. data/tracks/elm/exercises/roman-numerals/tests/Tests.elm +19 -19
  319. data/tracks/elm/exercises/run-length-encoding/RunLengthEncoding.elm +1 -1
  320. data/tracks/elm/exercises/run-length-encoding/RunLengthEncoding.example.elm +2 -2
  321. data/tracks/elm/exercises/run-length-encoding/RunLengthEncodingPropertyChecks.elm +3 -3
  322. data/tracks/elm/exercises/run-length-encoding/tests/Tests.elm +2 -2
  323. data/tracks/elm/exercises/say/Say.example.elm +4 -4
  324. data/tracks/elm/exercises/say/tests/Tests.elm +2 -2
  325. data/tracks/elm/exercises/scrabble-score/ScrabbleScore.example.elm +16 -16
  326. data/tracks/elm/exercises/scrabble-score/tests/Tests.elm +1 -1
  327. data/tracks/elm/exercises/series/Series.example.elm +5 -5
  328. data/tracks/elm/exercises/series/tests/Tests.elm +2 -2
  329. data/tracks/elm/exercises/space-age/SpaceAge.elm +9 -8
  330. data/tracks/elm/exercises/space-age/SpaceAge.example.elm +3 -2
  331. data/tracks/elm/exercises/space-age/tests/Tests.elm +1 -1
  332. data/tracks/elm/exercises/strain/tests/Tests.elm +3 -3
  333. data/tracks/elm/exercises/sublist/Sublist.elm +1 -1
  334. data/tracks/elm/exercises/sublist/Sublist.example.elm +6 -6
  335. data/tracks/elm/exercises/sublist/tests/Tests.elm +2 -2
  336. data/tracks/elm/exercises/sum-of-multiples/tests/Tests.elm +1 -1
  337. data/tracks/elm/exercises/triangle/tests/Tests.elm +2 -2
  338. data/tracks/elm/exercises/word-count/WordCount.example.elm +2 -2
  339. data/tracks/elm/exercises/word-count/tests/Tests.elm +2 -2
  340. data/tracks/factor/config/exercise_readme.go.tmpl +12 -4
  341. data/tracks/factor/exercises/isogram/README.md +4 -3
  342. data/tracks/factor/exercises/leap/README.md +1 -1
  343. data/tracks/factor/exercises/two-fer/README.md +3 -32
  344. data/tracks/fsharp/config.json +10 -0
  345. data/tracks/fsharp/exercises/Exercises.sln +6 -0
  346. data/tracks/fsharp/exercises/rational-numbers/Example.fs +46 -0
  347. data/tracks/fsharp/exercises/rational-numbers/Program.fs +1 -0
  348. data/tracks/fsharp/exercises/rational-numbers/README.md +29 -0
  349. data/tracks/fsharp/exercises/rational-numbers/RationalNumbers.fs +19 -0
  350. data/tracks/fsharp/exercises/rational-numbers/RationalNumbers.fsproj +23 -0
  351. data/tracks/fsharp/exercises/rational-numbers/RationalNumbersTest.fs +153 -0
  352. data/tracks/fsharp/exercises/two-bucket/Example.fs +49 -57
  353. data/tracks/fsharp/exercises/two-bucket/TwoBucketTest.fs +40 -25
  354. data/tracks/fsharp/exercises/variable-length-quantity/Example.fs +21 -17
  355. data/tracks/fsharp/exercises/variable-length-quantity/VariableLengthQuantityTest.fs +85 -42
  356. data/tracks/fsharp/exercises/word-search/Example.fs +20 -14
  357. data/tracks/fsharp/exercises/word-search/WordSearch.fs +1 -1
  358. data/tracks/fsharp/exercises/word-search/WordSearchTest.fs +303 -48
  359. data/tracks/fsharp/generators/Formatting.fs +7 -2
  360. data/tracks/fsharp/generators/Generators.fs +97 -2
  361. data/tracks/fsharp/generators/Templates/_AssertEqualWithin.liquid +1 -0
  362. data/tracks/go/config.json +14 -0
  363. data/tracks/go/exercises/all-your-base/.meta/gen.go +2 -2
  364. data/tracks/go/exercises/all-your-base/cases_test.go +2 -2
  365. data/tracks/go/exercises/rectangles/.meta/gen.go +57 -0
  366. data/tracks/go/exercises/rectangles/README.md +85 -0
  367. data/tracks/go/exercises/rectangles/cases_test.go +134 -0
  368. data/tracks/go/exercises/rectangles/example.go +51 -0
  369. data/tracks/go/exercises/rectangles/rectangles_test.go +22 -0
  370. data/tracks/go/exercises/reverse-string/.meta/gen.go +4 -2
  371. data/tracks/go/exercises/reverse-string/cases_test.go +4 -2
  372. data/tracks/go/exercises/reverse-string/reverse_string_test.go +12 -1
  373. data/tracks/haskell/exercises/matrix/package.yaml +1 -1
  374. data/tracks/haskell/exercises/matrix/test/Tests.hs +1 -1
  375. data/tracks/java/config.json +12 -0
  376. data/tracks/java/config/exercise_readme.go.tmpl +10 -4
  377. data/tracks/java/exercises/all-your-base/README.md +0 -1
  378. data/tracks/java/exercises/alphametics/README.md +0 -1
  379. data/tracks/java/exercises/bank-account/README.md +0 -1
  380. data/tracks/java/exercises/complex-numbers/src/test/java/ComplexNumberTest.java +17 -15
  381. data/tracks/java/exercises/custom-set/README.md +0 -1
  382. data/tracks/java/exercises/diamond/.meta/version +1 -1
  383. data/tracks/java/exercises/diamond/src/test/java/DiamondPrinterTest.java +9 -11
  384. data/tracks/java/exercises/forth/README.md +0 -11
  385. data/tracks/java/exercises/list-ops/README.md +0 -1
  386. data/tracks/java/exercises/markdown/README.md +0 -1
  387. data/tracks/java/exercises/minesweeper/README.md +0 -1
  388. data/tracks/java/exercises/palindrome-products/.meta/src/reference/java/PalindromeCalculator.java +9 -0
  389. data/tracks/java/exercises/palindrome-products/.meta/version +1 -0
  390. data/tracks/java/exercises/palindrome-products/src/test/java/PalindromeCalculatorTest.java +110 -15
  391. data/tracks/java/exercises/parallel-letter-frequency/README.md +0 -1
  392. data/tracks/java/exercises/pig-latin/.meta/src/reference/java/PigLatinTranslator.java +16 -0
  393. data/tracks/java/exercises/pig-latin/.meta/version +1 -0
  394. data/tracks/java/exercises/pig-latin/src/test/java/PigLatinTranslatorTest.java +15 -1
  395. data/tracks/java/exercises/prime-factors/.meta/version +1 -1
  396. data/tracks/java/exercises/rational-numbers/.meta/src/reference/java/Rational.java +128 -0
  397. data/tracks/java/exercises/rational-numbers/.meta/version +1 -0
  398. data/tracks/java/exercises/rational-numbers/README.md +47 -0
  399. data/tracks/java/exercises/rational-numbers/build.gradle +17 -0
  400. data/tracks/java/exercises/rational-numbers/src/main/java/Rational.java +40 -0
  401. data/tracks/java/exercises/rational-numbers/src/test/java/RationalTest.java +288 -0
  402. data/tracks/java/exercises/rectangles/README.md +0 -1
  403. data/tracks/java/exercises/settings.gradle +1 -0
  404. data/tracks/java/exercises/sublist/README.md +0 -1
  405. data/tracks/java/exercises/tournament/README.md +0 -1
  406. data/tracks/java/exercises/two-fer/README.md +1 -1
  407. data/tracks/java/exercises/word-search/README.md +0 -1
  408. data/tracks/lua/config/exercise_readme.go.tmpl +9 -4
  409. data/tracks/lua/exercises/all-your-base/README.md +0 -1
  410. data/tracks/lua/exercises/alphametics/README.md +0 -1
  411. data/tracks/lua/exercises/bank-account/README.md +0 -1
  412. data/tracks/lua/exercises/custom-set/README.md +0 -1
  413. data/tracks/lua/exercises/isbn-verifier/README.md +1 -1
  414. data/tracks/lua/exercises/list-ops/README.md +0 -1
  415. data/tracks/lua/exercises/minesweeper/README.md +0 -1
  416. data/tracks/lua/exercises/protein-translation/README.md +2 -2
  417. data/tracks/lua/exercises/react/README.md +0 -1
  418. data/tracks/lua/exercises/rectangles/README.md +0 -1
  419. data/tracks/lua/exercises/reverse-string/README.md +1 -1
  420. data/tracks/lua/exercises/rna-transcription/README.md +1 -1
  421. data/tracks/lua/exercises/sublist/README.md +0 -1
  422. data/tracks/lua/exercises/tournament/README.md +0 -1
  423. data/tracks/lua/exercises/word-search/README.md +0 -1
  424. data/tracks/perl5/bin/exercise-gen.pl +4 -1
  425. data/tracks/perl5/exercises/bob/bob.t +9 -15
  426. data/tracks/perl5/exercises/bob/example.yaml +0 -4
  427. data/tracks/perl5/exercises/hello-world/example.yaml +0 -4
  428. data/tracks/perl5/exercises/hello-world/hello-world.t +9 -15
  429. data/tracks/perl5/exercises/leap/example.yaml +0 -4
  430. data/tracks/perl5/exercises/leap/leap.t +9 -15
  431. data/tracks/perl5/exercises/luhn/luhn.t +9 -13
  432. data/tracks/perl5/exercises/phone-number/phone-number.t +9 -13
  433. data/tracks/perl5/templates/test.mustache +10 -18
  434. data/tracks/perl6/bin/exercise-gen.pl6 +12 -2
  435. data/tracks/perl6/config/exercise_readme.go.tmpl +18 -4
  436. data/tracks/perl6/exercises/all-your-base/README.md +0 -1
  437. data/tracks/perl6/exercises/raindrops/.meta/exercise-data.yaml +2 -2
  438. data/tracks/perl6/exercises/raindrops/raindrops.t +57 -21
  439. data/tracks/perl6/exercises/two-fer/README.md +1 -1
  440. data/tracks/php/.travis.yml +1 -0
  441. data/tracks/php/exercises/bob/README.md +2 -0
  442. data/tracks/php/exercises/bob/bob_test.php +4 -1
  443. data/tracks/php/exercises/bob/example.php +4 -0
  444. data/tracks/php/exercises/connect/example.php +3 -4
  445. data/tracks/python/config.json +12 -12
  446. data/tracks/python/exercises/beer-song/beer_song.py +1 -5
  447. data/tracks/python/exercises/beer-song/beer_song_test.py +376 -57
  448. data/tracks/python/exercises/beer-song/example.py +18 -13
  449. data/tracks/r/config/exercise_readme.go.tmpl +9 -4
  450. data/tracks/r/exercises/allergies/README.md +0 -1
  451. data/tracks/r/exercises/beer-song/README.md +2 -2
  452. data/tracks/r/exercises/collatz-conjecture/README.md +1 -1
  453. data/tracks/r/exercises/diamond/README.md +6 -6
  454. data/tracks/r/exercises/grains/README.md +0 -1
  455. data/tracks/r/exercises/isogram/README.md +2 -1
  456. data/tracks/r/exercises/leap/README.md +1 -1
  457. data/tracks/r/exercises/luhn/README.md +7 -7
  458. data/tracks/r/exercises/nucleotide-count/README.md +8 -22
  459. data/tracks/r/exercises/pangram/README.md +1 -1
  460. data/tracks/r/exercises/pascals-triangle/README.md +2 -2
  461. data/tracks/r/exercises/perfect-numbers/README.md +2 -2
  462. data/tracks/r/exercises/phone-number/README.md +4 -3
  463. data/tracks/r/exercises/rna-transcription/README.md +2 -2
  464. data/tracks/r/exercises/rotational-cipher/README.md +2 -1
  465. data/tracks/r/exercises/scrabble-score/README.md +3 -1
  466. data/tracks/r/exercises/secret-handshake/README.md +2 -2
  467. data/tracks/r/exercises/space-age/README.md +1 -1
  468. data/tracks/r/exercises/sum-of-multiples/README.md +3 -6
  469. data/tracks/r/exercises/tournament/README.md +5 -6
  470. data/tracks/r/exercises/triangle/README.md +9 -6
  471. data/tracks/r/exercises/word-count/README.md +1 -2
  472. data/tracks/rust/.gitignore +1 -0
  473. data/tracks/rust/exercises/reverse-string/.meta/hints.md +3 -0
  474. data/tracks/rust/exercises/reverse-string/README.md +5 -0
  475. data/tracks/rust/exercises/reverse-string/tests/reverse-string.rs +7 -0
  476. data/tracks/scala/config/exercise_readme.go.tmpl +10 -4
  477. data/tracks/scala/exercises/accumulate/README.md +0 -3
  478. data/tracks/scala/exercises/acronym/README.md +0 -1
  479. data/tracks/scala/exercises/acronym/src/test/scala/AcronymTest.scala +6 -12
  480. data/tracks/scala/exercises/all-your-base/README.md +1 -2
  481. data/tracks/scala/exercises/all-your-base/example.scala +5 -4
  482. data/tracks/scala/exercises/all-your-base/src/test/scala/AllYourBaseTest.scala +26 -27
  483. data/tracks/scala/exercises/allergies/README.md +0 -1
  484. data/tracks/scala/exercises/allergies/src/test/scala/AllergiesTest.scala +1 -1
  485. data/tracks/scala/exercises/alphametics/README.md +2 -3
  486. data/tracks/scala/exercises/alphametics/example.scala +25 -25
  487. data/tracks/scala/exercises/alphametics/src/test/scala/AlphameticsTest.scala +58 -42
  488. data/tracks/scala/exercises/anagram/src/test/scala/AnagramTest.scala +4 -30
  489. data/tracks/scala/exercises/atbash-cipher/README.md +2 -1
  490. data/tracks/scala/exercises/atbash-cipher/src/test/scala/AtbashCipherTest.scala +18 -14
  491. data/tracks/scala/exercises/bank-account/README.md +0 -1
  492. data/tracks/scala/exercises/beer-song/README.md +2 -2
  493. data/tracks/scala/exercises/binary/README.md +2 -0
  494. data/tracks/scala/exercises/bob/example.scala +11 -0
  495. data/tracks/scala/exercises/bob/src/test/scala/BobTest.scala +3 -2
  496. data/tracks/scala/exercises/book-store/README.md +5 -5
  497. data/tracks/scala/exercises/bowling/README.md +20 -6
  498. data/tracks/scala/exercises/change/README.md +1 -1
  499. data/tracks/scala/exercises/collatz-conjecture/README.md +4 -3
  500. data/tracks/scala/exercises/connect/README.md +1 -2
  501. data/tracks/scala/exercises/crypto-square/README.md +10 -8
  502. data/tracks/scala/exercises/custom-set/README.md +0 -1
  503. data/tracks/scala/exercises/dominoes/README.md +3 -4
  504. data/tracks/scala/exercises/etl/README.md +3 -1
  505. data/tracks/scala/exercises/flatten-array/README.md +7 -8
  506. data/tracks/scala/exercises/food-chain/README.md +1 -1
  507. data/tracks/scala/exercises/forth/README.md +0 -1
  508. data/tracks/scala/exercises/grade-school/README.md +0 -1
  509. data/tracks/scala/exercises/grains/README.md +0 -1
  510. data/tracks/scala/exercises/house/README.md +2 -3
  511. data/tracks/scala/exercises/isogram/README.md +2 -1
  512. data/tracks/scala/exercises/kindergarten-garden/README.md +13 -13
  513. data/tracks/scala/exercises/leap/README.md +1 -1
  514. data/tracks/scala/exercises/lens-person/README.md +1 -2
  515. data/tracks/scala/exercises/linked-list/README.md +10 -10
  516. data/tracks/scala/exercises/luhn/README.md +7 -7
  517. data/tracks/scala/exercises/matrix/README.md +6 -4
  518. data/tracks/scala/exercises/meetup/README.md +16 -13
  519. data/tracks/scala/exercises/minesweeper/README.md +0 -1
  520. data/tracks/scala/exercises/nucleotide-count/README.md +8 -22
  521. data/tracks/scala/exercises/ocr-numbers/README.md +6 -6
  522. data/tracks/scala/exercises/octal/README.md +6 -2
  523. data/tracks/scala/exercises/palindrome-products/README.md +15 -16
  524. data/tracks/scala/exercises/pangram/README.md +1 -1
  525. data/tracks/scala/exercises/parallel-letter-frequency/README.md +0 -1
  526. data/tracks/scala/exercises/pascals-triangle/README.md +2 -2
  527. data/tracks/scala/exercises/perfect-numbers/README.md +2 -2
  528. data/tracks/scala/exercises/phone-number/README.md +4 -3
  529. data/tracks/scala/exercises/protein-translation/README.md +5 -6
  530. data/tracks/scala/exercises/pythagorean-triplet/README.md +3 -3
  531. data/tracks/scala/exercises/queen-attack/README.md +1 -1
  532. data/tracks/scala/exercises/rail-fence-cipher/README.md +12 -7
  533. data/tracks/scala/exercises/rna-transcription/README.md +2 -2
  534. data/tracks/scala/exercises/roman-numerals/README.md +1 -1
  535. data/tracks/scala/exercises/run-length-encoding/README.md +4 -4
  536. data/tracks/scala/exercises/saddle-points/README.md +2 -2
  537. data/tracks/scala/exercises/scrabble-score/README.md +3 -1
  538. data/tracks/scala/exercises/secret-handshake/README.md +2 -2
  539. data/tracks/scala/exercises/sgf-parsing/README.md +4 -5
  540. data/tracks/scala/exercises/simple-cipher/README.md +5 -7
  541. data/tracks/scala/exercises/space-age/README.md +1 -1
  542. data/tracks/scala/exercises/spiral-matrix/README.md +2 -2
  543. data/tracks/scala/exercises/sublist/README.md +0 -1
  544. data/tracks/scala/exercises/sum-of-multiples/README.md +3 -6
  545. data/tracks/scala/exercises/triangle/README.md +9 -6
  546. data/tracks/scala/exercises/trinary/README.md +1 -1
  547. data/tracks/scala/exercises/variable-length-quantity/README.md +6 -7
  548. data/tracks/scala/exercises/word-count/README.md +1 -2
  549. data/tracks/scala/exercises/wordy/README.md +0 -5
  550. data/tracks/scala/exercises/zipper/README.md +1 -2
  551. data/tracks/scala/testgen/src/main/scala/AcronymTestGenerator.scala +1 -1
  552. data/tracks/scala/testgen/src/main/scala/AllYourBaseTestGenerator.scala +3 -5
  553. data/tracks/scala/testgen/src/main/scala/AllergiesTestGenerator.scala +8 -5
  554. data/tracks/scala/testgen/src/main/scala/{AlphametricsTestGenerator.scala → AlphameticsTestGenerator.scala} +5 -5
  555. data/tracks/scala/testgen/src/main/scala/AnagramTestGenerator.scala +1 -1
  556. data/tracks/scala/testgen/src/main/scala/AtbashCipherTestGenerator.scala +1 -1
  557. data/tracks/scala/testgen/src/main/scala/BobTestGenerator.scala +4 -3
  558. data/tracks/scala/testgen/src/main/scala/testgen/TestSuiteBuilder.scala +35 -0
  559. data/tracks/sml/config/exercise_readme.go.tmpl +29 -4
  560. data/tracks/sml/exercises/accumulate/README.md +2 -2
  561. data/tracks/sml/exercises/all-your-base/README.md +13 -10
  562. data/tracks/sml/exercises/atbash-cipher/README.md +2 -1
  563. data/tracks/sml/exercises/collatz-conjecture/README.md +1 -1
  564. data/tracks/sml/exercises/diamond/README.md +6 -6
  565. data/tracks/sml/exercises/leap/README.md +1 -1
  566. data/tracks/sml/exercises/list-ops/README.md +0 -1
  567. data/tracks/sml/exercises/nth-prime/README.md +1 -1
  568. data/tracks/sml/exercises/pangram/README.md +1 -1
  569. data/tracks/sml/exercises/perfect-numbers/README.md +2 -2
  570. data/tracks/sml/exercises/phone-number/README.md +4 -3
  571. data/tracks/sml/exercises/rna-transcription/README.md +2 -2
  572. data/tracks/sml/exercises/roman-numerals/README.md +1 -1
  573. data/tracks/sml/exercises/sum-of-multiples/README.md +3 -6
  574. data/tracks/sml/exercises/two-fer/README.md +2 -31
  575. data/tracks/vimscript/config/exercise_readme.go.tmpl +8 -4
  576. data/tracks/vimscript/exercises/allergies/README.md +0 -1
  577. data/tracks/vimscript/exercises/atbash-cipher/README.md +2 -1
  578. data/tracks/vimscript/exercises/beer-song/README.md +2 -2
  579. data/tracks/vimscript/exercises/etl/README.md +3 -1
  580. data/tracks/vimscript/exercises/leap/README.md +1 -1
  581. data/tracks/vimscript/exercises/nucleotide-count/README.md +8 -22
  582. data/tracks/vimscript/exercises/pangram/README.md +1 -1
  583. data/tracks/vimscript/exercises/phone-number/README.md +4 -3
  584. data/tracks/vimscript/exercises/rna-transcription/README.md +2 -2
  585. data/tracks/vimscript/exercises/roman-numerals/README.md +1 -1
  586. data/tracks/vimscript/exercises/scrabble-score/README.md +3 -1
  587. data/tracks/vimscript/exercises/triangle/README.md +9 -6
  588. data/tracks/vimscript/exercises/word-count/README.md +1 -2
  589. metadata +44 -78
  590. data/tracks/c/docs/EXERCISE_README_INSERT.md +0 -30
  591. data/tracks/ceylon/config/exercise-readme-insert.md +0 -1
  592. data/tracks/common-lisp/docs/EXERCISE_README_INSERT.md +0 -45
  593. data/tracks/crystal/docs/EXERCISE_README_INSERT.md +0 -21
  594. data/tracks/dart/docs/EXERCISE_README_INSERT.md +0 -8
  595. data/tracks/delphi/docs/EXERCISE_README_INSERT.md +0 -19
  596. data/tracks/factor/docs/EXERCISE_README_INSERT.md +0 -12
  597. data/tracks/java/config/exercise-readme-insert.md +0 -9
  598. data/tracks/lua/docs/EXERCISE_README_INSERT.md +0 -8
  599. data/tracks/perl6/docs/EXERCISE_README_INSERT.md +0 -17
  600. data/tracks/r/docs/EXERCISE_README_INSERT.md +0 -8
  601. data/tracks/rust/exercises/binary-search/Cargo.lock +0 -4
  602. data/tracks/rust/exercises/collatz-conjecture/Cargo.lock +0 -4
  603. data/tracks/rust/exercises/isbn-verifier/Cargo.lock +0 -4
  604. data/tracks/rust/exercises/two-bucket/Cargo.lock +0 -4
  605. data/tracks/scala/docs/EXERCISE_README_INSERT.md +0 -9
  606. data/tracks/scala/exercises/bob/.meta/description.md +0 -10
  607. data/tracks/sml/docs/EXERCISE_README_INSERT.md +0 -28
  608. data/tracks/vimscript/docs/EXERCISE_README_INSERT.md +0 -7
@@ -1,3 +1,3 @@
1
1
  module WordSearch
2
2
 
3
- let find puzzle word = failwith "You need to implement this function."
3
+ let search grid wordsToSearchFor = failwith "You need to implement this function."
@@ -1,75 +1,330 @@
1
- // This file was created manually and its version is 1.0.0.
1
+ // This file was auto-generated based on version 1.1.0 of the canonical data.
2
2
 
3
3
  module WordSearchTest
4
4
 
5
- open Xunit
6
5
  open FsUnit.Xunit
6
+ open Xunit
7
7
 
8
8
  open WordSearch
9
9
 
10
- let puzzle =
11
- ["jefblpepre";
12
- "camdcimgtc";
13
- "oivokprjsm";
14
- "pbwasqroua";
15
- "rixilelhrs";
16
- "wolcqlirpc";
17
- "screeaumgr";
18
- "alxhpburyi";
19
- "jalaycalmp";
20
- "clojurermt"]
21
-
22
10
  [<Fact>]
23
- let ``Should find horizontal words written left-to-right`` () =
24
- let actual = find puzzle "clojure"
25
- actual |> should equal <| Some ((1, 10), (7, 10))
11
+ let ``Should accept an initial game grid and a target search word`` () =
12
+ let grid = ["jefblpepre"]
13
+ let wordsToSearchFor = ["clojure"]
14
+ let expected = [("clojure", Option<((int * int) * (int * int))>.None)] |> Map.ofList
15
+ search grid wordsToSearchFor |> should equal expected
16
+
17
+ [<Fact(Skip = "Remove to run test")>]
18
+ let ``Should locate one word written left to right`` () =
19
+ let grid = ["clojurermt"]
20
+ let wordsToSearchFor = ["clojure"]
21
+ let expected = [("clojure", Some (((1, 1), (7, 1))))] |> Map.ofList
22
+ search grid wordsToSearchFor |> should equal expected
23
+
24
+ [<Fact(Skip = "Remove to run test")>]
25
+ let ``Should locate the same word written left to right in a different position`` () =
26
+ let grid = ["mtclojurer"]
27
+ let wordsToSearchFor = ["clojure"]
28
+ let expected = [("clojure", Some (((3, 1), (9, 1))))] |> Map.ofList
29
+ search grid wordsToSearchFor |> should equal expected
30
+
31
+ [<Fact(Skip = "Remove to run test")>]
32
+ let ``Should locate a different left to right word`` () =
33
+ let grid = ["coffeelplx"]
34
+ let wordsToSearchFor = ["coffee"]
35
+ let expected = [("coffee", Some (((1, 1), (6, 1))))] |> Map.ofList
36
+ search grid wordsToSearchFor |> should equal expected
37
+
38
+ [<Fact(Skip = "Remove to run test")>]
39
+ let ``Should locate that different left to right word in a different position`` () =
40
+ let grid = ["xcoffeezlp"]
41
+ let wordsToSearchFor = ["coffee"]
42
+ let expected = [("coffee", Some (((2, 1), (7, 1))))] |> Map.ofList
43
+ search grid wordsToSearchFor |> should equal expected
44
+
45
+ [<Fact(Skip = "Remove to run test")>]
46
+ let ``Should locate a left to right word in two line grid`` () =
47
+ let grid =
48
+ [ "jefblpepre";
49
+ "tclojurerm" ]
50
+ let wordsToSearchFor = ["clojure"]
51
+ let expected = [("clojure", Some (((2, 2), (8, 2))))] |> Map.ofList
52
+ search grid wordsToSearchFor |> should equal expected
53
+
54
+ [<Fact(Skip = "Remove to run test")>]
55
+ let ``Should locate a left to right word in three line grid`` () =
56
+ let grid =
57
+ [ "camdcimgtc";
58
+ "jefblpepre";
59
+ "clojurermt" ]
60
+ let wordsToSearchFor = ["clojure"]
61
+ let expected = [("clojure", Some (((1, 3), (7, 3))))] |> Map.ofList
62
+ search grid wordsToSearchFor |> should equal expected
63
+
64
+ [<Fact(Skip = "Remove to run test")>]
65
+ let ``Should locate a left to right word in ten line grid`` () =
66
+ let grid =
67
+ [ "jefblpepre";
68
+ "camdcimgtc";
69
+ "oivokprjsm";
70
+ "pbwasqroua";
71
+ "rixilelhrs";
72
+ "wolcqlirpc";
73
+ "screeaumgr";
74
+ "alxhpburyi";
75
+ "jalaycalmp";
76
+ "clojurermt" ]
77
+ let wordsToSearchFor = ["clojure"]
78
+ let expected = [("clojure", Some (((1, 10), (7, 10))))] |> Map.ofList
79
+ search grid wordsToSearchFor |> should equal expected
80
+
81
+ [<Fact(Skip = "Remove to run test")>]
82
+ let ``Should locate that left to right word in a different position in a ten line grid`` () =
83
+ let grid =
84
+ [ "jefblpepre";
85
+ "camdcimgtc";
86
+ "oivokprjsm";
87
+ "pbwasqroua";
88
+ "rixilelhrs";
89
+ "wolcqlirpc";
90
+ "screeaumgr";
91
+ "alxhpburyi";
92
+ "clojurermt";
93
+ "jalaycalmp" ]
94
+ let wordsToSearchFor = ["clojure"]
95
+ let expected = [("clojure", Some (((1, 9), (7, 9))))] |> Map.ofList
96
+ search grid wordsToSearchFor |> should equal expected
97
+
98
+ [<Fact(Skip = "Remove to run test")>]
99
+ let ``Should locate a different left to right word in a ten line grid`` () =
100
+ let grid =
101
+ [ "jefblpepre";
102
+ "camdcimgtc";
103
+ "oivokprjsm";
104
+ "pbwasqroua";
105
+ "rixilelhrs";
106
+ "wolcqlirpc";
107
+ "fortranftw";
108
+ "alxhpburyi";
109
+ "clojurermt";
110
+ "jalaycalmp" ]
111
+ let wordsToSearchFor = ["fortran"]
112
+ let expected = [("fortran", Some (((1, 7), (7, 7))))] |> Map.ofList
113
+ search grid wordsToSearchFor |> should equal expected
114
+
115
+ [<Fact(Skip = "Remove to run test")>]
116
+ let ``Should locate multiple words`` () =
117
+ let grid =
118
+ [ "jefblpepre";
119
+ "camdcimgtc";
120
+ "oivokprjsm";
121
+ "pbwasqroua";
122
+ "rixilelhrs";
123
+ "wolcqlirpc";
124
+ "fortranftw";
125
+ "alxhpburyi";
126
+ "jalaycalmp";
127
+ "clojurermt" ]
128
+ let wordsToSearchFor = ["fortran"; "clojure"]
129
+ let expected =
130
+ [ ("clojure", Some (((1, 10), (7, 10))));
131
+ ("fortran", Some (((1, 7), (7, 7)))) ]
132
+ |> Map.ofList
133
+ search grid wordsToSearchFor |> should equal expected
26
134
 
27
135
  [<Fact(Skip = "Remove to run test")>]
28
- let ``Should find horizontal words written right-to-left`` () =
29
- let actual = find puzzle "elixir"
30
- actual |> should equal <| Some ((6, 5), (1, 5))
136
+ let ``Should locate a single word written right to left`` () =
137
+ let grid = ["rixilelhrs"]
138
+ let wordsToSearchFor = ["elixir"]
139
+ let expected = [("elixir", Some (((6, 1), (1, 1))))] |> Map.ofList
140
+ search grid wordsToSearchFor |> should equal expected
31
141
 
32
142
  [<Fact(Skip = "Remove to run test")>]
33
- let ``Should find vertical words written top-to-bottom`` () =
34
- let actual = find puzzle "ecmascript"
35
- actual |> should equal <| Some ((10, 1), (10, 10))
143
+ let ``Should locate multiple words written in different horizontal directions`` () =
144
+ let grid =
145
+ [ "jefblpepre";
146
+ "camdcimgtc";
147
+ "oivokprjsm";
148
+ "pbwasqroua";
149
+ "rixilelhrs";
150
+ "wolcqlirpc";
151
+ "screeaumgr";
152
+ "alxhpburyi";
153
+ "jalaycalmp";
154
+ "clojurermt" ]
155
+ let wordsToSearchFor = ["elixir"; "clojure"]
156
+ let expected =
157
+ [ ("clojure", Some (((1, 10), (7, 10))));
158
+ ("elixir", Some (((6, 5), (1, 5)))) ]
159
+ |> Map.ofList
160
+ search grid wordsToSearchFor |> should equal expected
36
161
 
37
162
  [<Fact(Skip = "Remove to run test")>]
38
- let ``Should find vertical words written bottom-to-top`` () =
39
- let actual = find puzzle "rust"
40
- actual |> should equal <| Some ((9, 5), (9, 2))
163
+ let ``Should locate words written top to bottom`` () =
164
+ let grid =
165
+ [ "jefblpepre";
166
+ "camdcimgtc";
167
+ "oivokprjsm";
168
+ "pbwasqroua";
169
+ "rixilelhrs";
170
+ "wolcqlirpc";
171
+ "screeaumgr";
172
+ "alxhpburyi";
173
+ "jalaycalmp";
174
+ "clojurermt" ]
175
+ let wordsToSearchFor = ["clojure"; "elixir"; "ecmascript"]
176
+ let expected =
177
+ [ ("clojure", Some (((1, 10), (7, 10))));
178
+ ("elixir", Some (((6, 5), (1, 5))));
179
+ ("ecmascript", Some (((10, 1), (10, 10)))) ]
180
+ |> Map.ofList
181
+ search grid wordsToSearchFor |> should equal expected
41
182
 
42
183
  [<Fact(Skip = "Remove to run test")>]
43
- let ``Should find diagonal words written top-left-to-bottom-right`` () =
44
- let actual = find puzzle "java"
45
- actual |> should equal <| Some ((1, 1), (4, 4))
184
+ let ``Should locate words written bottom to top`` () =
185
+ let grid =
186
+ [ "jefblpepre";
187
+ "camdcimgtc";
188
+ "oivokprjsm";
189
+ "pbwasqroua";
190
+ "rixilelhrs";
191
+ "wolcqlirpc";
192
+ "screeaumgr";
193
+ "alxhpburyi";
194
+ "jalaycalmp";
195
+ "clojurermt" ]
196
+ let wordsToSearchFor = ["clojure"; "elixir"; "ecmascript"; "rust"]
197
+ let expected =
198
+ [ ("clojure", Some (((1, 10), (7, 10))));
199
+ ("elixir", Some (((6, 5), (1, 5))));
200
+ ("ecmascript", Some (((10, 1), (10, 10))));
201
+ ("rust", Some (((9, 5), (9, 2)))) ]
202
+ |> Map.ofList
203
+ search grid wordsToSearchFor |> should equal expected
46
204
 
47
205
  [<Fact(Skip = "Remove to run test")>]
48
- let ``Should find diagonal upper written bottom-right-to-top-left`` () =
49
- let actual = find puzzle "lua"
50
- actual |> should equal <| Some ((8, 9), (6, 7))
206
+ let ``Should locate words written top left to bottom right`` () =
207
+ let grid =
208
+ [ "jefblpepre";
209
+ "camdcimgtc";
210
+ "oivokprjsm";
211
+ "pbwasqroua";
212
+ "rixilelhrs";
213
+ "wolcqlirpc";
214
+ "screeaumgr";
215
+ "alxhpburyi";
216
+ "jalaycalmp";
217
+ "clojurermt" ]
218
+ let wordsToSearchFor = ["clojure"; "elixir"; "ecmascript"; "rust"; "java"]
219
+ let expected =
220
+ [ ("clojure", Some (((1, 10), (7, 10))));
221
+ ("elixir", Some (((6, 5), (1, 5))));
222
+ ("ecmascript", Some (((10, 1), (10, 10))));
223
+ ("rust", Some (((9, 5), (9, 2))));
224
+ ("java", Some (((1, 1), (4, 4)))) ]
225
+ |> Map.ofList
226
+ search grid wordsToSearchFor |> should equal expected
51
227
 
52
228
  [<Fact(Skip = "Remove to run test")>]
53
- let ``Should find diagonal upper written bottom-left-to-top-right`` () =
54
- let actual = find puzzle "lisp"
55
- actual |> should equal <| Some ((3, 6), (6, 3))
229
+ let ``Should locate words written bottom right to top left`` () =
230
+ let grid =
231
+ [ "jefblpepre";
232
+ "camdcimgtc";
233
+ "oivokprjsm";
234
+ "pbwasqroua";
235
+ "rixilelhrs";
236
+ "wolcqlirpc";
237
+ "screeaumgr";
238
+ "alxhpburyi";
239
+ "jalaycalmp";
240
+ "clojurermt" ]
241
+ let wordsToSearchFor = ["clojure"; "elixir"; "ecmascript"; "rust"; "java"; "lua"]
242
+ let expected =
243
+ [ ("clojure", Some (((1, 10), (7, 10))));
244
+ ("elixir", Some (((6, 5), (1, 5))));
245
+ ("ecmascript", Some (((10, 1), (10, 10))));
246
+ ("rust", Some (((9, 5), (9, 2))));
247
+ ("java", Some (((1, 1), (4, 4))));
248
+ ("lua", Some (((8, 9), (6, 7)))) ]
249
+ |> Map.ofList
250
+ search grid wordsToSearchFor |> should equal expected
56
251
 
57
252
  [<Fact(Skip = "Remove to run test")>]
58
- let ``Should find diagonal upper written top-right-to-bottom-left`` () =
59
- let actual = find puzzle "ruby"
60
- actual |> should equal <| Some ((8, 6), (5, 9))
253
+ let ``Should locate words written bottom left to top right`` () =
254
+ let grid =
255
+ [ "jefblpepre";
256
+ "camdcimgtc";
257
+ "oivokprjsm";
258
+ "pbwasqroua";
259
+ "rixilelhrs";
260
+ "wolcqlirpc";
261
+ "screeaumgr";
262
+ "alxhpburyi";
263
+ "jalaycalmp";
264
+ "clojurermt" ]
265
+ let wordsToSearchFor = ["clojure"; "elixir"; "ecmascript"; "rust"; "java"; "lua"; "lisp"]
266
+ let expected =
267
+ [ ("clojure", Some (((1, 10), (7, 10))));
268
+ ("elixir", Some (((6, 5), (1, 5))));
269
+ ("ecmascript", Some (((10, 1), (10, 10))));
270
+ ("rust", Some (((9, 5), (9, 2))));
271
+ ("java", Some (((1, 1), (4, 4))));
272
+ ("lua", Some (((8, 9), (6, 7))));
273
+ ("lisp", Some (((3, 6), (6, 3)))) ]
274
+ |> Map.ofList
275
+ search grid wordsToSearchFor |> should equal expected
61
276
 
62
277
  [<Fact(Skip = "Remove to run test")>]
63
- let ``Should not find words that are not in the puzzle`` () =
64
- let actual = find puzzle "haskell"
65
- actual |> should equal None
278
+ let ``Should locate words written top right to bottom left`` () =
279
+ let grid =
280
+ [ "jefblpepre";
281
+ "camdcimgtc";
282
+ "oivokprjsm";
283
+ "pbwasqroua";
284
+ "rixilelhrs";
285
+ "wolcqlirpc";
286
+ "screeaumgr";
287
+ "alxhpburyi";
288
+ "jalaycalmp";
289
+ "clojurermt" ]
290
+ let wordsToSearchFor = ["clojure"; "elixir"; "ecmascript"; "rust"; "java"; "lua"; "lisp"; "ruby"]
291
+ let expected =
292
+ [ ("clojure", Some (((1, 10), (7, 10))));
293
+ ("elixir", Some (((6, 5), (1, 5))));
294
+ ("ecmascript", Some (((10, 1), (10, 10))));
295
+ ("rust", Some (((9, 5), (9, 2))));
296
+ ("java", Some (((1, 1), (4, 4))));
297
+ ("lua", Some (((8, 9), (6, 7))));
298
+ ("lisp", Some (((3, 6), (6, 3))));
299
+ ("ruby", Some (((8, 6), (5, 9)))) ]
300
+ |> Map.ofList
301
+ search grid wordsToSearchFor |> should equal expected
66
302
 
67
303
  [<Fact(Skip = "Remove to run test")>]
68
- let ``Should be able to search differently-sized puzzles`` () =
69
- let differentSizePuzzle =
70
- ["qwertyuiopz";
71
- "luamsicrexe";
72
- "abcdefghijk"]
304
+ let ``Should fail to locate a word that is not in the puzzle`` () =
305
+ let grid =
306
+ [ "jefblpepre";
307
+ "camdcimgtc";
308
+ "oivokprjsm";
309
+ "pbwasqroua";
310
+ "rixilelhrs";
311
+ "wolcqlirpc";
312
+ "screeaumgr";
313
+ "alxhpburyi";
314
+ "jalaycalmp";
315
+ "clojurermt" ]
316
+ let wordsToSearchFor = ["clojure"; "elixir"; "ecmascript"; "rust"; "java"; "lua"; "lisp"; "ruby";
317
+ "haskell"]
318
+ let expected =
319
+ [ ("clojure", Some (((1, 10), (7, 10))));
320
+ ("elixir", Some (((6, 5), (1, 5))));
321
+ ("ecmascript", Some (((10, 1), (10, 10))));
322
+ ("rust", Some (((9, 5), (9, 2))));
323
+ ("java", Some (((1, 1), (4, 4))));
324
+ ("lua", Some (((8, 9), (6, 7))));
325
+ ("lisp", Some (((3, 6), (6, 3))));
326
+ ("ruby", Some (((8, 6), (5, 9))));
327
+ ("haskell", Option<((int * int) * (int * int))>.None) ]
328
+ |> Map.ofList
329
+ search grid wordsToSearchFor |> should equal expected
73
330
 
74
- let actual = find differentSizePuzzle "exercism"
75
- actual |> should equal <| Some ((11, 2), (4, 2))
@@ -44,6 +44,8 @@ let formatDateTime (dateTime: DateTime) =
44
44
  let formatTimeSpan (timeSpan: TimeSpan) =
45
45
  sprintf "TimeSpan(%d, %d, %d)" timeSpan.Hours timeSpan.Minutes timeSpan.Seconds
46
46
 
47
+ let isInt (jToken: JToken) = jToken.Value<int64>() <= int64 Int32.MaxValue
48
+
47
49
  let rec normalizeJArray (jArray: JArray): obj list =
48
50
  let toBoxedList seq =
49
51
  seq
@@ -52,8 +54,10 @@ let rec normalizeJArray (jArray: JArray): obj list =
52
54
 
53
55
  if jArray.Count = 0 then
54
56
  []
55
- else if jArray.Children() |> Seq.forall (fun x -> x.Type = JTokenType.Integer) then
57
+ else if jArray.Children() |> Seq.forall (fun x -> x.Type = JTokenType.Integer && isInt x) then
56
58
  jArray.Values<int>() |> toBoxedList
59
+ else if jArray.Children() |> Seq.forall (fun x -> x.Type = JTokenType.Integer) then
60
+ jArray.Values<int64>() |> toBoxedList
57
61
  else if jArray.Children() |> Seq.forall (fun x -> x.Type = JTokenType.Float) then
58
62
  jArray.Values<float>() |> toBoxedList
59
63
  else if jArray.Children() |> Seq.forall (fun x -> x.Type = JTokenType.Boolean) then
@@ -73,7 +77,8 @@ let rec normalizeJArray (jArray: JArray): obj list =
73
77
 
74
78
  let formatToken (jToken: JToken) =
75
79
  match jToken.Type with
76
- | JTokenType.Integer -> jToken.ToObject<int>() |> string
80
+ | JTokenType.Integer when isInt jToken -> jToken.ToObject<int>() |> string
81
+ | JTokenType.Integer -> jToken.ToObject<int64>() |> string
77
82
  | JTokenType.Float -> jToken.ToObject<float>() |> string
78
83
  | JTokenType.Boolean -> jToken.ToObject<bool>() |> formatBool
79
84
  | JTokenType.String -> jToken.ToObject<string>() |> formatString
@@ -292,7 +292,7 @@ type ComplexNumbers() =
292
292
  | :? JArray as jArray ->
293
293
  let renderAssertion testedFunction expected =
294
294
  { Sut = sprintf "%s sut" testedFunction; Expected = expected }
295
- |> renderInlineTemplate "{{ Sut }} |> should (equalWithin 0.000000001) {{ Expected }}"
295
+ |> renderPartialTemplate "AssertEqualWithin"
296
296
 
297
297
  [ renderAssertion "real" (renderNumber jArray.[0])
298
298
  renderAssertion "imaginary" (renderNumber jArray.[1]) |> indent 1 ]
@@ -933,6 +933,19 @@ type RailFenceCipher() =
933
933
  type Raindrops() =
934
934
  inherit GeneratorExercise()
935
935
 
936
+ type RationalNumbers() =
937
+ inherit GeneratorExercise()
938
+
939
+ override __.RenderValue (canonicalDataCase, key, value) =
940
+ match value with
941
+ | :? JArray as jArray -> sprintf "(create %d %d)" (jArray.[0].Value<int>()) (jArray.[1].Value<int>())
942
+ | _ -> base.RenderValue (canonicalDataCase, key, value)
943
+
944
+ override __.TestMethodBodyAssertTemplate canonicalDataCase =
945
+ match canonicalDataCase.Expected with
946
+ | :? double -> "AssertEqualWithin"
947
+ | _ -> base.TestMethodBodyAssertTemplate(canonicalDataCase)
948
+
936
949
  type React() =
937
950
  inherit GeneratorExercise()
938
951
 
@@ -1248,13 +1261,58 @@ type Triangle() =
1248
1261
  value :?> JArray
1249
1262
  |> normalizeJArray
1250
1263
  |> Seq.map formatFloat
1251
- |> formatList
1264
+ |> formatList
1265
+
1266
+ type TwoBucket() =
1267
+ inherit GeneratorExercise()
1268
+
1269
+ let renderBucket (value: obj) =
1270
+ value |> string |> String.upperCaseFirst |> sprintf "Bucket.%s"
1271
+
1272
+ override this.PropertiesWithIdentifier canonicalDataCase = this.Properties canonicalDataCase
1273
+
1274
+ override __.RenderInput (canonicalDataCase, key, value) =
1275
+ match key with
1276
+ | "startBucket" -> renderBucket value
1277
+ | _ -> base.RenderInput (canonicalDataCase, key, value)
1278
+
1279
+ override __.RenderExpected (_, _, value) =
1280
+ let jObject = value :?> JObject
1281
+ let moves = jObject.Value<int>("moves")
1282
+ let goalBucket = jObject.Value<string>("goalBucket") |> renderBucket
1283
+ let otherBucket = jObject.Value<int>("otherBucket")
1284
+ sprintf "{ Moves = %d; GoalBucket = %s; OtherBucket = %d }" moves goalBucket otherBucket
1252
1285
 
1253
1286
  type TwoFer() =
1254
1287
  inherit GeneratorExercise()
1255
1288
 
1256
1289
  override __.RenderInput (_, _, value) =
1257
1290
  value |> Option.ofObj |> formatValue |> parenthesizeOption
1291
+
1292
+ type VariableLengthQuantity() =
1293
+ inherit GeneratorExercise()
1294
+
1295
+ let formatUnsignedByteList (value: obj) =
1296
+ value :?> JArray
1297
+ |> Seq.map (fun x -> x.Value<byte>() |> sprintf "0x%xuy")
1298
+ |> formatList
1299
+
1300
+ let formatUnsignedIntList (value: obj) =
1301
+ value :?> JArray
1302
+ |> Seq.map (fun x -> x.Value<uint32>() |> sprintf "0x%xu")
1303
+ |> formatList
1304
+
1305
+ override __.RenderInput (canonicalDataCase, key, value) =
1306
+ match canonicalDataCase.Property with
1307
+ | "encode" -> value |> formatUnsignedIntList
1308
+ | "decode" -> value |> formatUnsignedByteList
1309
+ | _ -> base.RenderInput (canonicalDataCase, key, value)
1310
+
1311
+ override __.RenderExpected (canonicalDataCase, key, value) =
1312
+ match canonicalDataCase.Property with
1313
+ | "encode" -> value |> formatUnsignedByteList
1314
+ | "decode" -> value |> Option.ofObj |> Option.map formatUnsignedIntList |> formatOption |> parenthesizeOption
1315
+ | _ -> base.RenderExpected (canonicalDataCase, key, value)
1258
1316
 
1259
1317
  type WordCount() =
1260
1318
  inherit GeneratorExercise()
@@ -1275,6 +1333,43 @@ type WordCount() =
1275
1333
 
1276
1334
  override __.PropertiesWithIdentifier _ = ["expected"]
1277
1335
 
1336
+ type WordSearch() =
1337
+ inherit GeneratorExercise()
1338
+
1339
+ let toCoordinates (value: JToken) = value.Value<int>("column"), value.Value<int>("row")
1340
+
1341
+ let renderExpectedCoordinates (value: JObject) =
1342
+ formatTuple (value.Item("start") |> toCoordinates, value.Item("end") |> toCoordinates)
1343
+
1344
+ let renderExpectedValue (value: JObject) =
1345
+ match isNull value with
1346
+ | true -> "Option<((int * int) * (int * int))>.None"
1347
+ | false -> sprintf "Some (%s)" (renderExpectedCoordinates value)
1348
+
1349
+ override __.RenderExpected (_, _, value) =
1350
+ let input = value :?> JObject
1351
+ let formattedList =
1352
+ input.ToObject<Collections.Generic.Dictionary<string, JObject>>()
1353
+ |> Seq.map (fun kv -> sprintf "(%s, %s)" (formatValue kv.Key) (renderExpectedValue kv.Value))
1354
+ |> formatMultiLineList
1355
+
1356
+ if (formattedList.Contains("\n")) then
1357
+ sprintf "%s\n%s" formattedList (indent 2 "|> Map.ofList")
1358
+ else
1359
+ sprintf "%s |> Map.ofList" formattedList
1360
+
1361
+ override __.RenderInput (canonicalDataCase, key, value) =
1362
+ match key with
1363
+ | "grid" ->
1364
+ value :?> JArray
1365
+ |> normalizeJArray
1366
+ |> Seq.map formatValue
1367
+ |> formatMultiLineList
1368
+ | _ ->
1369
+ base.RenderInput(canonicalDataCase, key, value)
1370
+
1371
+ override this.PropertiesWithIdentifier canonicalDataCase = this.Properties canonicalDataCase
1372
+
1278
1373
  type Wordy() =
1279
1374
  inherit GeneratorExercise()
1280
1375