trackler 2.2.1.54 → 2.2.1.55

Sign up to get free protection for your applications and to get access to all the features.
Files changed (280) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/dominoes/description.md +3 -3
  4. data/problem-specifications/exercises/two-fer/description.md +0 -28
  5. data/tracks/c/config.json +12 -0
  6. data/tracks/c/exercises/queen-attack/README.md +65 -0
  7. data/tracks/c/exercises/queen-attack/makefile +15 -0
  8. data/tracks/c/exercises/queen-attack/src/example.c +25 -0
  9. data/tracks/c/exercises/queen-attack/src/queen_attack.h +19 -0
  10. data/tracks/c/exercises/queen-attack/test/test_queen_attack.c +190 -0
  11. data/tracks/c/exercises/queen-attack/test/vendor/unity.c +1300 -0
  12. data/tracks/c/exercises/queen-attack/test/vendor/unity.h +274 -0
  13. data/tracks/c/exercises/queen-attack/test/vendor/unity_internals.h +701 -0
  14. data/tracks/common-lisp/exercises/acronym/README.md +1 -1
  15. data/tracks/delphi/exercises/two-fer/README.md +0 -28
  16. data/tracks/ecmascript/config.json +41 -0
  17. data/tracks/ecmascript/exercises/accumulate/package.json +5 -3
  18. data/tracks/ecmascript/exercises/acronym/package.json +5 -3
  19. data/tracks/ecmascript/exercises/all-your-base/package.json +5 -3
  20. data/tracks/ecmascript/exercises/allergies/package.json +5 -3
  21. data/tracks/ecmascript/exercises/alphametics/package.json +5 -3
  22. data/tracks/ecmascript/exercises/anagram/package.json +5 -3
  23. data/tracks/ecmascript/exercises/atbash-cipher/package.json +5 -3
  24. data/tracks/ecmascript/exercises/beer-song/package.json +5 -3
  25. data/tracks/ecmascript/exercises/binary-search-tree/package.json +5 -3
  26. data/tracks/ecmascript/exercises/binary-search/package.json +5 -3
  27. data/tracks/ecmascript/exercises/binary/package.json +5 -3
  28. data/tracks/ecmascript/exercises/bob/package.json +5 -3
  29. data/tracks/ecmascript/exercises/bowling/package.json +2 -2
  30. data/tracks/ecmascript/exercises/bracket-push/package.json +5 -3
  31. data/tracks/ecmascript/exercises/change/README.md +44 -0
  32. data/tracks/ecmascript/exercises/change/change.spec.js +80 -0
  33. data/tracks/ecmascript/exercises/change/example.js +120 -0
  34. data/tracks/ecmascript/exercises/change/package.json +69 -0
  35. data/tracks/ecmascript/exercises/circular-buffer/package.json +5 -3
  36. data/tracks/ecmascript/exercises/clock/package.json +5 -3
  37. data/tracks/ecmascript/exercises/collatz-conjecture/package.json +6 -4
  38. data/tracks/ecmascript/exercises/connect/package.json +5 -3
  39. data/tracks/ecmascript/exercises/crypto-square/package.json +5 -3
  40. data/tracks/ecmascript/exercises/custom-set/package.json +5 -3
  41. data/tracks/ecmascript/exercises/diamond/package.json +5 -3
  42. data/tracks/ecmascript/exercises/difference-of-squares/package.json +5 -3
  43. data/tracks/ecmascript/exercises/diffie-hellman/package.json +5 -3
  44. data/tracks/ecmascript/exercises/etl/package.json +5 -3
  45. data/tracks/ecmascript/exercises/flatten-array/package.json +5 -3
  46. data/tracks/ecmascript/exercises/food-chain/package.json +5 -3
  47. data/tracks/ecmascript/exercises/gigasecond/package.json +5 -3
  48. data/tracks/ecmascript/exercises/grade-school/package.json +5 -3
  49. data/tracks/ecmascript/exercises/grains/package.json +5 -3
  50. data/tracks/ecmascript/exercises/hamming/package.json +5 -3
  51. data/tracks/ecmascript/exercises/hello-world/package.json +5 -3
  52. data/tracks/ecmascript/exercises/hexadecimal/package.json +5 -3
  53. data/tracks/ecmascript/exercises/isbn-verifier/README.md +62 -0
  54. data/tracks/ecmascript/exercises/isbn-verifier/example.js +17 -0
  55. data/tracks/ecmascript/exercises/isbn-verifier/isbn-verifier.spec.js +81 -0
  56. data/tracks/ecmascript/exercises/isbn-verifier/package.json +71 -0
  57. data/tracks/ecmascript/exercises/isogram/package.json +5 -3
  58. data/tracks/ecmascript/exercises/kindergarten-garden/package.json +5 -3
  59. data/tracks/ecmascript/exercises/largest-series-product/package.json +5 -3
  60. data/tracks/ecmascript/exercises/leap/package.json +5 -3
  61. data/tracks/ecmascript/exercises/linked-list/package.json +5 -3
  62. data/tracks/ecmascript/exercises/list-ops/package.json +5 -3
  63. data/tracks/ecmascript/exercises/luhn/package.json +5 -3
  64. data/tracks/ecmascript/exercises/matrix/package.json +5 -3
  65. data/tracks/ecmascript/exercises/meetup/package.json +5 -3
  66. data/tracks/ecmascript/exercises/minesweeper/package.json +5 -3
  67. data/tracks/ecmascript/exercises/nth-prime/package.json +5 -3
  68. data/tracks/ecmascript/exercises/ocr-numbers/package.json +5 -3
  69. data/tracks/ecmascript/exercises/octal/package.json +5 -3
  70. data/tracks/ecmascript/exercises/palindrome-products/package.json +5 -3
  71. data/tracks/ecmascript/exercises/pangram/package.json +5 -3
  72. data/tracks/ecmascript/exercises/pascals-triangle/package.json +5 -3
  73. data/tracks/ecmascript/exercises/perfect-numbers/package.json +5 -3
  74. data/tracks/ecmascript/exercises/phone-number/package.json +5 -3
  75. data/tracks/ecmascript/exercises/pig-latin/package.json +5 -3
  76. data/tracks/ecmascript/exercises/prime-factors/package.json +5 -3
  77. data/tracks/ecmascript/exercises/proverb/package.json +5 -3
  78. data/tracks/ecmascript/exercises/pythagorean-triplet/package.json +5 -3
  79. data/tracks/ecmascript/exercises/queen-attack/package.json +5 -3
  80. data/tracks/ecmascript/exercises/raindrops/package.json +5 -3
  81. data/tracks/ecmascript/exercises/rna-transcription/package.json +5 -3
  82. data/tracks/ecmascript/exercises/robot-name/package.json +5 -3
  83. data/tracks/ecmascript/exercises/robot-simulator/package.json +5 -3
  84. data/tracks/ecmascript/exercises/roman-numerals/package.json +5 -3
  85. data/tracks/ecmascript/exercises/run-length-encoding/package.json +5 -3
  86. data/tracks/ecmascript/exercises/saddle-points/package.json +5 -3
  87. data/tracks/ecmascript/exercises/say/package.json +5 -3
  88. data/tracks/ecmascript/exercises/scrabble-score/package.json +5 -3
  89. data/tracks/ecmascript/exercises/secret-handshake/package.json +5 -3
  90. data/tracks/ecmascript/exercises/series/package.json +5 -3
  91. data/tracks/ecmascript/exercises/sieve/package.json +5 -3
  92. data/tracks/ecmascript/exercises/simple-cipher/package.json +5 -3
  93. data/tracks/ecmascript/exercises/simple-linked-list/package.json +5 -3
  94. data/tracks/ecmascript/exercises/space-age/package.json +5 -3
  95. data/tracks/ecmascript/exercises/strain/package.json +5 -3
  96. data/tracks/ecmascript/exercises/sublist/package.json +5 -3
  97. data/tracks/ecmascript/exercises/sum-of-multiples/package.json +5 -3
  98. data/tracks/ecmascript/exercises/transpose/README.md +94 -0
  99. data/tracks/ecmascript/exercises/transpose/example.js +12 -0
  100. data/tracks/ecmascript/exercises/transpose/package.json +71 -0
  101. data/tracks/ecmascript/exercises/transpose/transpose.spec.js +67 -0
  102. data/tracks/ecmascript/exercises/triangle/package.json +5 -3
  103. data/tracks/ecmascript/exercises/trinary/package.json +5 -3
  104. data/tracks/ecmascript/exercises/twelve-days/package.json +5 -3
  105. data/tracks/ecmascript/exercises/two-bucket/package.json +5 -3
  106. data/tracks/ecmascript/exercises/two-fer/package.json +5 -3
  107. data/tracks/ecmascript/exercises/word-count/package.json +5 -3
  108. data/tracks/ecmascript/exercises/word-search/package.json +5 -3
  109. data/tracks/ecmascript/exercises/wordy/package.json +5 -3
  110. data/tracks/ecmascript/package-lock.json +6219 -0
  111. data/tracks/ecmascript/package.json +5 -3
  112. data/tracks/erlang/exercises/collatz-conjecture/src/collatz_conjecture.erl +3 -4
  113. data/tracks/erlang/exercises/collatz-conjecture/src/example.erl +3 -3
  114. data/tracks/erlang/exercises/collatz-conjecture/test/collatz_conjecture_tests.erl +13 -9
  115. data/tracks/erlang/exercises/hello-world/src/hello_world.erl +2 -2
  116. data/tracks/erlang/exercises/leap/src/example.erl +1 -1
  117. data/tracks/erlang/exercises/leap/src/leap.erl +3 -3
  118. data/tracks/erlang/exercises/leap/test/leap_tests.erl +9 -9
  119. data/tracks/erlang/testgen/src/testgen.erl +16 -13
  120. data/tracks/erlang/testgen/src/tgen.erl +65 -38
  121. data/tracks/erlang/testgen/src/tgen_collatz-conjecture.erl +38 -0
  122. data/tracks/erlang/testgen/src/tgen_hello-world.erl +11 -19
  123. data/tracks/erlang/testgen/src/tgen_leap.erl +31 -0
  124. data/tracks/erlang/testgen/src/tgs.erl +80 -0
  125. data/tracks/fsharp/exercises/alphametics/AlphameticsTest.fs +78 -23
  126. data/tracks/fsharp/exercises/anagram/AnagramTest.fs +66 -34
  127. data/tracks/fsharp/exercises/connect/ConnectTest.fs +81 -68
  128. data/tracks/fsharp/exercises/connect/Example.fs +9 -5
  129. data/tracks/fsharp/exercises/food-chain/Example.fs +5 -9
  130. data/tracks/fsharp/exercises/food-chain/FoodChain.fs +2 -2
  131. data/tracks/fsharp/exercises/food-chain/FoodChainTest.fs +143 -75
  132. data/tracks/fsharp/exercises/hamming/Example.fs +8 -4
  133. data/tracks/fsharp/exercises/hamming/Hamming.fs +1 -1
  134. data/tracks/fsharp/exercises/hamming/HammingTest.fs +53 -13
  135. data/tracks/fsharp/exercises/house/Example.fs +5 -6
  136. data/tracks/fsharp/exercises/house/House.fs +3 -1
  137. data/tracks/fsharp/exercises/house/HouseTest.fs +272 -96
  138. data/tracks/fsharp/exercises/meetup/Example.fs +1 -1
  139. data/tracks/fsharp/exercises/meetup/Meetup.fs +1 -1
  140. data/tracks/fsharp/exercises/meetup/MeetupTest.fs +384 -73
  141. data/tracks/fsharp/exercises/ocr-numbers/Example.fs +43 -35
  142. data/tracks/fsharp/exercises/ocr-numbers/OcrNumbersTest.fs +160 -125
  143. data/tracks/fsharp/exercises/two-fer/Example.fs +4 -2
  144. data/tracks/fsharp/exercises/two-fer/TwoFer.fs +1 -1
  145. data/tracks/fsharp/exercises/two-fer/TwoFerTest.fs +7 -4
  146. data/tracks/fsharp/generators/Common.fs +6 -2
  147. data/tracks/fsharp/generators/Exercise.fs +14 -13
  148. data/tracks/fsharp/generators/Generators.fs +145 -2
  149. data/tracks/fsharp/generators/Options.fs +4 -6
  150. data/tracks/fsharp/generators/Output.fs +2 -2
  151. data/tracks/fsharp/generators/Program.fs +4 -3
  152. data/tracks/java/exercises/saddle-points/README.md +1 -1
  153. data/tracks/java/exercises/two-fer/README.md +0 -28
  154. data/tracks/javascript/exercises/beer-song/example.js +18 -14
  155. data/tracks/kotlin/exercises/saddle-points/README.md +1 -1
  156. data/tracks/kotlin/exercises/two-fer/README.md +0 -28
  157. data/tracks/lua/config.json +12 -0
  158. data/tracks/lua/exercises/collatz-conjecture/README.md +43 -0
  159. data/tracks/lua/exercises/collatz-conjecture/collatz-conjecture_spec.lua +33 -0
  160. data/tracks/lua/exercises/collatz-conjecture/example.lua +16 -0
  161. data/tracks/python/config.json +4 -1
  162. data/tracks/python/exercises/binary-search/binary_search_test.py +2 -0
  163. data/tracks/python/exercises/change/change_test.py +2 -0
  164. data/tracks/python/exercises/circular-buffer/circular_buffer_test.py +56 -50
  165. data/tracks/python/exercises/forth/example.py +3 -1
  166. data/tracks/python/exercises/forth/forth_test.py +43 -26
  167. data/tracks/python/exercises/nth-prime/nth_prime.py +1 -1
  168. data/tracks/python/exercises/rna-transcription/README.md +5 -0
  169. data/tracks/python/exercises/rna-transcription/example.py +1 -1
  170. data/tracks/python/exercises/rna-transcription/rna_transcription_test.py +7 -4
  171. data/tracks/python/exercises/robot-simulator/robot_simulator_test.py +9 -7
  172. data/tracks/python/exercises/saddle-points/saddle_points_test.py +15 -5
  173. data/tracks/python/exercises/simple-cipher/simple_cipher.py +7 -1
  174. data/tracks/python/exercises/word-count/example.py +6 -4
  175. data/tracks/python/exercises/word-count/word_count_test.py +49 -22
  176. data/tracks/python/exercises/word-search/word_search_test.py +104 -12
  177. data/tracks/rust/.travis.yml +2 -0
  178. data/tracks/rust/README.md +5 -0
  179. data/tracks/rust/_test/check-exercises.sh +0 -6
  180. data/tracks/rust/_test/ensure-lib-src-rs-exist.sh +19 -0
  181. data/tracks/rust/_test/ensure-stubs-compile.sh +26 -0
  182. data/tracks/rust/config.json +12 -0
  183. data/tracks/rust/config/exercise-readme-insert.md +3 -2
  184. data/tracks/rust/docs/ABOUT.md +2 -2
  185. data/tracks/rust/docs/LEARNING.md +1 -1
  186. data/tracks/rust/docs/RESOURCES.md +1 -1
  187. data/tracks/rust/docs/TESTS.md +2 -2
  188. data/tracks/rust/exercises/accumulate/README.md +3 -2
  189. data/tracks/rust/exercises/acronym/README.md +3 -2
  190. data/tracks/rust/exercises/all-your-base/README.md +3 -2
  191. data/tracks/rust/exercises/allergies/README.md +3 -2
  192. data/tracks/rust/exercises/alphametics/README.md +3 -2
  193. data/tracks/rust/exercises/anagram/README.md +3 -2
  194. data/tracks/rust/exercises/atbash-cipher/README.md +3 -2
  195. data/tracks/rust/exercises/beer-song/README.md +3 -2
  196. data/tracks/rust/exercises/beer-song/src/lib.rs +2 -2
  197. data/tracks/rust/exercises/binary-search/README.md +3 -2
  198. data/tracks/rust/exercises/bob/README.md +3 -2
  199. data/tracks/rust/exercises/bob/src/lib.rs +1 -1
  200. data/tracks/rust/exercises/bowling/README.md +3 -2
  201. data/tracks/rust/exercises/bracket-push/HINTS.md +1 -1
  202. data/tracks/rust/exercises/bracket-push/README.md +4 -3
  203. data/tracks/rust/exercises/circular-buffer/README.md +3 -2
  204. data/tracks/rust/exercises/clock/README.md +3 -2
  205. data/tracks/rust/exercises/collatz-conjecture/README.md +3 -2
  206. data/tracks/rust/exercises/collatz-conjecture/src/lib.rs +1 -1
  207. data/tracks/rust/exercises/crypto-square/README.md +3 -2
  208. data/tracks/rust/exercises/custom-set/README.md +3 -2
  209. data/tracks/rust/exercises/decimal/.meta/ALLOWED_TO_NOT_COMPILE +2 -0
  210. data/tracks/rust/exercises/decimal/README.md +3 -2
  211. data/tracks/rust/exercises/difference-of-squares/README.md +3 -2
  212. data/tracks/rust/exercises/difference-of-squares/src/lib.rs +3 -3
  213. data/tracks/rust/exercises/dominoes/README.md +3 -2
  214. data/tracks/rust/exercises/etl/README.md +3 -2
  215. data/tracks/rust/exercises/forth/README.md +3 -2
  216. data/tracks/rust/exercises/forth/src/lib.rs +3 -0
  217. data/tracks/rust/exercises/gigasecond/README.md +3 -2
  218. data/tracks/rust/exercises/grade-school/README.md +3 -2
  219. data/tracks/rust/exercises/grains/README.md +3 -2
  220. data/tracks/rust/exercises/hamming/README.md +3 -2
  221. data/tracks/rust/exercises/hello-world/GETTING_STARTED.md +1 -1
  222. data/tracks/rust/exercises/hello-world/README.md +3 -2
  223. data/tracks/rust/exercises/hexadecimal/README.md +3 -2
  224. data/tracks/rust/exercises/isogram/.gitignore +8 -0
  225. data/tracks/rust/exercises/isogram/Cargo.toml +3 -0
  226. data/tracks/rust/exercises/isogram/README.md +52 -0
  227. data/tracks/rust/exercises/isogram/example.rs +12 -0
  228. data/tracks/rust/exercises/isogram/src/lib.rs +0 -0
  229. data/tracks/rust/exercises/isogram/tests/isogram.rs +72 -0
  230. data/tracks/rust/exercises/largest-series-product/README.md +3 -2
  231. data/tracks/rust/exercises/leap/README.md +3 -2
  232. data/tracks/rust/exercises/leap/src/lib.rs +1 -1
  233. data/tracks/rust/exercises/luhn-from/README.md +3 -2
  234. data/tracks/rust/exercises/luhn-trait/.meta/description.md +2 -2
  235. data/tracks/rust/exercises/luhn-trait/README.md +5 -4
  236. data/tracks/rust/exercises/luhn/README.md +3 -2
  237. data/tracks/rust/exercises/minesweeper/README.md +3 -2
  238. data/tracks/rust/exercises/nth-prime/README.md +3 -2
  239. data/tracks/rust/exercises/nucleotide-codons/README.md +3 -2
  240. data/tracks/rust/exercises/nucleotide-count/README.md +3 -2
  241. data/tracks/rust/exercises/ocr-numbers/README.md +3 -2
  242. data/tracks/rust/exercises/pangram/README.md +3 -2
  243. data/tracks/rust/exercises/parallel-letter-frequency/HINTS.md +1 -1
  244. data/tracks/rust/exercises/parallel-letter-frequency/README.md +4 -3
  245. data/tracks/rust/exercises/pascals-triangle/README.md +3 -2
  246. data/tracks/rust/exercises/perfect-numbers/README.md +3 -2
  247. data/tracks/rust/exercises/phone-number/README.md +3 -2
  248. data/tracks/rust/exercises/pig-latin/README.md +3 -2
  249. data/tracks/rust/exercises/poker/README.md +3 -2
  250. data/tracks/rust/exercises/prime-factors/README.md +3 -2
  251. data/tracks/rust/exercises/protein-translation/README.md +3 -2
  252. data/tracks/rust/exercises/proverb/README.md +3 -2
  253. data/tracks/rust/exercises/proverb/src/lib.rs +1 -1
  254. data/tracks/rust/exercises/pythagorean-triplet/README.md +3 -2
  255. data/tracks/rust/exercises/queen-attack/README.md +3 -2
  256. data/tracks/rust/exercises/raindrops/README.md +3 -2
  257. data/tracks/rust/exercises/raindrops/src/lib.rs +1 -1
  258. data/tracks/rust/exercises/react/README.md +3 -2
  259. data/tracks/rust/exercises/rectangles/README.md +3 -2
  260. data/tracks/rust/exercises/rna-transcription/README.md +3 -2
  261. data/tracks/rust/exercises/robot-name/README.md +3 -2
  262. data/tracks/rust/exercises/robot-simulator/README.md +3 -2
  263. data/tracks/rust/exercises/roman-numerals/README.md +3 -2
  264. data/tracks/rust/exercises/rotational-cipher/README.md +3 -2
  265. data/tracks/rust/exercises/run-length-encoding/README.md +3 -2
  266. data/tracks/rust/exercises/say/README.md +3 -2
  267. data/tracks/rust/exercises/scrabble-score/README.md +3 -2
  268. data/tracks/rust/exercises/sieve/README.md +3 -2
  269. data/tracks/rust/exercises/space-age/README.md +3 -2
  270. data/tracks/rust/exercises/sublist/README.md +3 -2
  271. data/tracks/rust/exercises/sum-of-multiples/README.md +3 -2
  272. data/tracks/rust/exercises/sum-of-multiples/src/lib.rs +1 -1
  273. data/tracks/rust/exercises/tournament/README.md +3 -2
  274. data/tracks/rust/exercises/triangle/HINTS.md +2 -2
  275. data/tracks/rust/exercises/triangle/README.md +5 -4
  276. data/tracks/rust/exercises/variable-length-quantity/README.md +3 -2
  277. data/tracks/rust/exercises/word-count/README.md +3 -2
  278. data/tracks/rust/exercises/wordy/README.md +3 -2
  279. metadata +38 -3
  280. data/tracks/ecmascript/yarn.lock +0 -3144
@@ -6,73 +6,73 @@ let characterHeight = 4
6
6
  let digitPatterns =
7
7
  Map.ofList
8
8
  [(
9
- [|" _ ";
9
+ [ " _ ";
10
10
  "| |";
11
11
  "|_|";
12
- " "|],
12
+ " " ],
13
13
  "0"
14
14
  );
15
15
  (
16
- [|" ";
16
+ [ " ";
17
17
  " |";
18
18
  " |";
19
- " "|],
19
+ " "],
20
20
  "1"
21
21
  );
22
22
  (
23
- [|" _ ";
23
+ [ " _ ";
24
24
  " _|";
25
25
  "|_ ";
26
- " "|],
26
+ " " ],
27
27
  "2"
28
28
  );
29
29
  (
30
- [|" _ ";
30
+ [ " _ ";
31
31
  " _|";
32
32
  " _|";
33
- " "|],
33
+ " " ],
34
34
  "3"
35
35
  );
36
36
  (
37
- [|" ";
37
+ [ " ";
38
38
  "|_|";
39
39
  " |";
40
- " "|],
40
+ " " ],
41
41
  "4"
42
42
  );
43
43
  (
44
- [|" _ ";
44
+ [ " _ ";
45
45
  "|_ ";
46
46
  " _|";
47
- " "|],
47
+ " " ],
48
48
  "5"
49
49
  );
50
50
  (
51
- [|" _ ";
51
+ [ " _ ";
52
52
  "|_ ";
53
53
  "|_|";
54
- " "|],
54
+ " " ],
55
55
  "6"
56
56
  );
57
57
  (
58
- [|" _ ";
58
+ [ " _ ";
59
59
  " |";
60
60
  " |";
61
- " "|],
61
+ " " ],
62
62
  "7"
63
63
  );
64
64
  (
65
- [|" _ ";
65
+ [ " _ ";
66
66
  "|_|";
67
67
  "|_|";
68
- " "|],
68
+ " " ],
69
69
  "8"
70
70
  );
71
71
  (
72
- [|" _ ";
72
+ [ " _ ";
73
73
  "|_|";
74
74
  " _|";
75
- " "|],
75
+ " " ],
76
76
  "9"
77
77
  )]
78
78
 
@@ -81,25 +81,33 @@ let matchCharacter input =
81
81
  | Some x -> x
82
82
  | None -> "?"
83
83
 
84
- let rows (input:string) =
85
- input.Split('\n')
86
- |> Array.chunkBySize characterHeight
84
+ let rows (input:string list) = List.chunkBySize characterHeight input
87
85
 
88
- let rowToCharacters (row: string[]) =
89
- let chars = (row |> Array.head |> String.length) / characterWidth |> int
86
+ let rowToCharacters (row: string list) =
87
+ let chars = (row |> List.head |> String.length) / characterWidth |> int
90
88
  let char i (str: string) = str.Substring(i * characterWidth, characterWidth)
91
89
 
92
- Array.init chars (fun i -> Array.map (char i) row)
90
+ List.init chars (fun i -> List.map (char i) row)
93
91
 
94
- let characters input = input |> rows |> Array.map rowToCharacters
92
+ let characters input = input |> rows |> List.map rowToCharacters
95
93
 
96
- let rowToDigits (row: string[] []) =
94
+ let rowToDigits (row: string list list) =
97
95
  row
98
- |> Array.map matchCharacter
99
- |> Array.reduce (fun x y -> x + "" + y)
96
+ |> List.map matchCharacter
97
+ |> List.reduce (fun x y -> x + "" + y)
100
98
 
101
- let convert (input: string) =
102
- input
103
- |> characters
104
- |> Array.map rowToDigits
105
- |> Array.reduce (fun x y -> x + "," + y)
99
+ let invalidNumberOfColumns row = String.length row % characterWidth <> 0
100
+
101
+ let invalidNumberOfRows rows = List.length rows % characterHeight <> 0
102
+
103
+ let isInvalid input = invalidNumberOfRows input || List.exists invalidNumberOfColumns input
104
+
105
+ let convert (input: string list) =
106
+ if isInvalid input then
107
+ None
108
+ else
109
+ input
110
+ |> characters
111
+ |> List.map rowToDigits
112
+ |> List.reduce (fun x y -> x + "," + y)
113
+ |> Some
@@ -1,134 +1,169 @@
1
+ // This file was auto-generated based on version 1.0.0 of the canonical data.
2
+
1
3
  module OcrNumbersTest
2
4
 
3
- open Xunit
4
5
  open FsUnit.Xunit
6
+ open Xunit
5
7
 
6
8
  open OcrNumbers
7
9
 
8
10
  [<Fact>]
9
- let ``Recognizes zero`` () =
10
- let converted = convert (" _ " + "\n" +
11
- "| |" + "\n" +
12
- "|_|" + "\n" +
13
- " ")
14
- converted |> should equal "0"
11
+ let ``Recognizes 0`` () =
12
+ let input =
13
+ [ " _ "
14
+ "| |"
15
+ "|_|"
16
+ " " ]
17
+ convert input |> should equal (Some "0")
18
+
19
+ [<Fact(Skip = "Remove to run test")>]
20
+ let ``Recognizes 1`` () =
21
+ let input =
22
+ [ " "
23
+ " |"
24
+ " |"
25
+ " " ]
26
+ convert input |> should equal (Some "1")
27
+
28
+ [<Fact(Skip = "Remove to run test")>]
29
+ let ``Unreadable but correctly sized inputs return ?`` () =
30
+ let input =
31
+ [ " "
32
+ " _"
33
+ " |"
34
+ " " ]
35
+ convert input |> should equal (Some "?")
36
+
37
+ [<Fact(Skip = "Remove to run test")>]
38
+ let ``Input with a number of lines that is not a multiple of four raises an error`` () =
39
+ let input =
40
+ [ " _ "
41
+ "| |"
42
+ " " ]
43
+ convert input |> should equal None
44
+
45
+ [<Fact(Skip = "Remove to run test")>]
46
+ let ``Input with a number of columns that is not a multiple of three raises an error`` () =
47
+ let input =
48
+ [ " "
49
+ " |"
50
+ " |"
51
+ " " ]
52
+ convert input |> should equal None
53
+
54
+ [<Fact(Skip = "Remove to run test")>]
55
+ let ``Recognizes 110101100`` () =
56
+ let input =
57
+ [ " _ _ _ _ "
58
+ " | || | || | | || || |"
59
+ " | ||_| ||_| | ||_||_|"
60
+ " " ]
61
+ convert input |> should equal (Some "110101100")
62
+
63
+ [<Fact(Skip = "Remove to run test")>]
64
+ let ``Garbled numbers in a string are replaced with ?`` () =
65
+ let input =
66
+ [ " _ _ _ "
67
+ " | || | || | || || |"
68
+ " | | _| ||_| | ||_||_|"
69
+ " " ]
70
+ convert input |> should equal (Some "11?10?1?0")
71
+
72
+ [<Fact(Skip = "Remove to run test")>]
73
+ let ``Recognizes 2`` () =
74
+ let input =
75
+ [ " _ "
76
+ " _|"
77
+ "|_ "
78
+ " " ]
79
+ convert input |> should equal (Some "2")
15
80
 
16
- [<Fact(Skip = "Remove to run test")>]
17
- let ``Recognizes one`` () =
18
- let converted = convert (" " + "\n" +
19
- " |" + "\n" +
20
- " |" + "\n" +
21
- " ")
22
- converted |> should equal "1"
81
+ [<Fact(Skip = "Remove to run test")>]
82
+ let ``Recognizes 3`` () =
83
+ let input =
84
+ [ " _ "
85
+ " _|"
86
+ " _|"
87
+ " " ]
88
+ convert input |> should equal (Some "3")
89
+
90
+ [<Fact(Skip = "Remove to run test")>]
91
+ let ``Recognizes 4`` () =
92
+ let input =
93
+ [ " "
94
+ "|_|"
95
+ " |"
96
+ " " ]
97
+ convert input |> should equal (Some "4")
98
+
99
+ [<Fact(Skip = "Remove to run test")>]
100
+ let ``Recognizes 5`` () =
101
+ let input =
102
+ [ " _ "
103
+ "|_ "
104
+ " _|"
105
+ " " ]
106
+ convert input |> should equal (Some "5")
107
+
108
+ [<Fact(Skip = "Remove to run test")>]
109
+ let ``Recognizes 6`` () =
110
+ let input =
111
+ [ " _ "
112
+ "|_ "
113
+ "|_|"
114
+ " " ]
115
+ convert input |> should equal (Some "6")
116
+
117
+ [<Fact(Skip = "Remove to run test")>]
118
+ let ``Recognizes 7`` () =
119
+ let input =
120
+ [ " _ "
121
+ " |"
122
+ " |"
123
+ " " ]
124
+ convert input |> should equal (Some "7")
125
+
126
+ [<Fact(Skip = "Remove to run test")>]
127
+ let ``Recognizes 8`` () =
128
+ let input =
129
+ [ " _ "
130
+ "|_|"
131
+ "|_|"
132
+ " " ]
133
+ convert input |> should equal (Some "8")
134
+
135
+ [<Fact(Skip = "Remove to run test")>]
136
+ let ``Recognizes 9`` () =
137
+ let input =
138
+ [ " _ "
139
+ "|_|"
140
+ " _|"
141
+ " " ]
142
+ convert input |> should equal (Some "9")
143
+
144
+ [<Fact(Skip = "Remove to run test")>]
145
+ let ``Recognizes string of decimal numbers`` () =
146
+ let input =
147
+ [ " _ _ _ _ _ _ _ _ "
148
+ " | _| _||_||_ |_ ||_||_|| |"
149
+ " ||_ _| | _||_| ||_| _||_|"
150
+ " " ]
151
+ convert input |> should equal (Some "1234567890")
152
+
153
+ [<Fact(Skip = "Remove to run test")>]
154
+ let ``Numbers separated by empty lines are recognized. Lines are joined by commas.`` () =
155
+ let input =
156
+ [ " _ _ "
157
+ " | _| _|"
158
+ " ||_ _|"
159
+ " "
160
+ " _ _ "
161
+ "|_||_ |_ "
162
+ " | _||_|"
163
+ " "
164
+ " _ _ _ "
165
+ " ||_||_|"
166
+ " ||_| _|"
167
+ " " ]
168
+ convert input |> should equal (Some "123,456,789")
23
169
 
24
- [<Fact(Skip = "Remove to run test")>]
25
- let ``Recognizes two`` () =
26
- let converted = convert (" _ " + "\n" +
27
- " _|" + "\n" +
28
- "|_ " + "\n" +
29
- " ")
30
- converted |> should equal "2"
31
-
32
- [<Fact(Skip = "Remove to run test")>]
33
- let ``Recognizes three`` () =
34
- let converted = convert (" _ " + "\n" +
35
- " _|" + "\n" +
36
- " _|" + "\n" +
37
- " ")
38
- converted |> should equal "3"
39
-
40
- [<Fact(Skip = "Remove to run test")>]
41
- let ``Recognizes four`` () =
42
- let converted = convert (" " + "\n" +
43
- "|_|" + "\n" +
44
- " |" + "\n" +
45
- " ")
46
- converted |> should equal "4"
47
-
48
- [<Fact(Skip = "Remove to run test")>]
49
- let ``Recognizes five`` () =
50
- let converted = convert (" _ " + "\n" +
51
- "|_ " + "\n" +
52
- " _|" + "\n" +
53
- " ")
54
- converted |> should equal "5"
55
-
56
- [<Fact(Skip = "Remove to run test")>]
57
- let ``Recognizes six`` () =
58
- let converted = convert (" _ " + "\n" +
59
- "|_ " + "\n" +
60
- "|_|" + "\n" +
61
- " ")
62
- converted |> should equal "6"
63
-
64
- [<Fact(Skip = "Remove to run test")>]
65
- let ``Recognizes seven`` () =
66
- let converted = convert (" _ " + "\n" +
67
- " |" + "\n" +
68
- " |" + "\n" +
69
- " ")
70
- converted |> should equal "7"
71
-
72
- [<Fact(Skip = "Remove to run test")>]
73
- let ``Recognizes eight`` () =
74
- let converted = convert (" _ " + "\n" +
75
- "|_|" + "\n" +
76
- "|_|" + "\n" +
77
- " ")
78
- converted |> should equal "8"
79
-
80
- [<Fact(Skip = "Remove to run test")>]
81
- let ``Recognizes nine`` () =
82
- let converted = convert (" _ " + "\n" +
83
- "|_|" + "\n" +
84
- " _|" + "\n" +
85
- " ")
86
- converted |> should equal "9"
87
-
88
- [<Fact(Skip = "Remove to run test")>]
89
- let ``Recognizes garble`` () =
90
- let converted = convert (" " + "\n" +
91
- "| |" + "\n" +
92
- "| |" + "\n" +
93
- " ")
94
- converted |> should equal "?"
95
-
96
- [<Fact(Skip = "Remove to run test")>]
97
- let ``Recognizes ten`` () =
98
- let converted = convert (" _ " + "\n" +
99
- " || |" + "\n" +
100
- " ||_|" + "\n" +
101
- " ")
102
- converted |> should equal "10"
103
-
104
- [<Fact(Skip = "Remove to run test")>]
105
- let ``Recognizes 110101100`` () =
106
- let converted = convert (" _ _ _ _ " + "\n" +
107
- " | || | || | | || || |" + "\n" +
108
- " | ||_| ||_| | ||_||_|" + "\n" +
109
- " ")
110
- converted |> should equal "110101100"
111
-
112
- [<Fact(Skip = "Remove to run test")>]
113
- let ``Recognizes numbers and garble`` () =
114
- let converted = convert (" _ _ _ " + "\n" +
115
- " | || | || | || || |" + "\n" +
116
- " | | _| ||_| | ||_||_|" + "\n" +
117
- " ")
118
- converted |> should equal "11?10?1?0"
119
-
120
- [<Fact(Skip = "Remove to run test")>]
121
- let ``Recognizes multiple rows`` () =
122
- let converted = convert (" _ _ " + "\n" +
123
- " | _| _|" + "\n" +
124
- " ||_ _|" + "\n" +
125
- " " + "\n" +
126
- " _ _ " + "\n" +
127
- "|_||_ |_ " + "\n" +
128
- " | _||_|" + "\n" +
129
- " " + "\n" +
130
- " _ _ _ " + "\n" +
131
- " ||_||_|" + "\n" +
132
- " ||_| _|" + "\n" +
133
- " ")
134
- converted |> should equal "123,456,789"
@@ -1,4 +1,6 @@
1
1
  module TwoFer
2
2
 
3
- let getResponse input =
4
- sprintf "One for %s, one for me." (defaultArg input "you")
3
+ let name input =
4
+ input
5
+ |> Option.defaultValue "you"
6
+ |> sprintf "One for %s, one for me."
@@ -1,3 +1,3 @@
1
1
  module TwoFer
2
2
 
3
- let getResponse (input: string option): string = failwith "You need to implement this function."
3
+ let name (input: string option): string = failwith "You need to implement this function."