trackler 2.2.1.47 → 2.2.1.48

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 (277) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/exercises/pangram/canonical-data.json +3 -3
  4. data/tracks/common-lisp/.travis.yml +2 -9
  5. data/tracks/common-lisp/docs/TESTS.md +43 -9
  6. data/tracks/delphi/exercises/nucleotide-count/uNucleotideCountTest.pas +2 -2
  7. data/tracks/elixir/.travis.yml +4 -7
  8. data/tracks/elixir/README.md +2 -6
  9. data/tracks/elixir/bin/dialyzer_check.sh +2 -13
  10. data/tracks/elixir/exercises/allergies/example.exs +3 -2
  11. data/tracks/elixir/exercises/atbash-cipher/example.exs +5 -5
  12. data/tracks/elixir/exercises/bank-account/example.exs +11 -11
  13. data/tracks/elixir/exercises/bob/example.exs +4 -4
  14. data/tracks/elixir/exercises/forth/example.exs +66 -48
  15. data/tracks/elixir/exercises/minesweeper/example.exs +31 -18
  16. data/tracks/elixir/exercises/pangram/example.exs +4 -4
  17. data/tracks/elixir/exercises/queen-attack/queen_attack_test.exs +68 -53
  18. data/tracks/elixir/exercises/say/example.exs +33 -31
  19. data/tracks/elixir/exercises/scrabble-score/example.exs +12 -11
  20. data/tracks/elixir/mix.exs +10 -7
  21. data/tracks/elixir/mix.lock +4 -1
  22. data/tracks/erlang/README.md +2 -0
  23. data/tracks/fsharp/exercises/nth-prime/Example.fs +4 -1
  24. data/tracks/fsharp/exercises/nth-prime/NthPrime.fs +1 -1
  25. data/tracks/fsharp/exercises/nth-prime/NthPrimeTest.fs +12 -32
  26. data/tracks/fsharp/exercises/pangram/PangramTest.fs +3 -3
  27. data/tracks/fsharp/exercises/perfect-numbers/Example.fs +9 -6
  28. data/tracks/fsharp/exercises/perfect-numbers/PerfectNumbers.fs +1 -1
  29. data/tracks/fsharp/exercises/perfect-numbers/PerfectNumbersTest.fs +55 -21
  30. data/tracks/fsharp/generators/Generators.fs +18 -0
  31. data/tracks/gnu-apl/config.json +21 -0
  32. data/tracks/gnu-apl/exercises/hamming/README.md +42 -0
  33. data/tracks/gnu-apl/exercises/hamming/hamming-example.apl +5 -0
  34. data/tracks/gnu-apl/exercises/hamming/hamming.tc +75 -0
  35. data/tracks/gnu-apl/exercises/hello-world/README.md +17 -1
  36. data/tracks/gnu-apl/exercises/leap/README.md +33 -0
  37. data/tracks/gnu-apl/exercises/raindrops/README.md +24 -0
  38. data/tracks/gnu-apl/exercises/raindrops/raindrops-example.apl +8 -0
  39. data/tracks/gnu-apl/exercises/raindrops/raindrops.tc +60 -0
  40. data/tracks/gnu-apl/exercises/rna-transcription/README.md +25 -0
  41. data/tracks/gnu-apl/exercises/rna-transcription/rna-transcription-example.apl +7 -0
  42. data/tracks/gnu-apl/exercises/rna-transcription/rna-transcription.tc +41 -0
  43. data/tracks/gnu-apl/test.apl +13 -0
  44. data/tracks/haskell/config.json +9 -0
  45. data/tracks/haskell/exercises/rotational-cipher/README.md +91 -0
  46. data/tracks/haskell/exercises/rotational-cipher/examples/success-standard/package.yaml +16 -0
  47. data/tracks/haskell/exercises/rotational-cipher/examples/success-standard/src/RotationalCipher.hs +9 -0
  48. data/tracks/haskell/exercises/rotational-cipher/package.yaml +20 -0
  49. data/tracks/haskell/exercises/rotational-cipher/src/RotationalCipher.hs +4 -0
  50. data/tracks/haskell/exercises/rotational-cipher/stack.yaml +1 -0
  51. data/tracks/haskell/exercises/rotational-cipher/test/Tests.hs +77 -0
  52. data/tracks/java/config.json +23 -14
  53. data/tracks/java/config/exercise-readme-insert.md +3 -3
  54. data/tracks/java/config/exercise_readme.go.tmpl +3 -0
  55. data/tracks/java/exercises/accumulate/README.md +4 -3
  56. data/tracks/java/exercises/acronym/.meta/{.version → version} +0 -0
  57. data/tracks/java/exercises/acronym/README.md +4 -3
  58. data/tracks/java/exercises/all-your-base/.meta/{.version → version} +0 -0
  59. data/tracks/java/exercises/all-your-base/README.md +4 -3
  60. data/tracks/java/exercises/allergies/README.md +4 -3
  61. data/tracks/java/exercises/anagram/README.md +4 -3
  62. data/tracks/java/exercises/atbash-cipher/README.md +4 -3
  63. data/tracks/java/exercises/bank-account/README.md +6 -3
  64. data/tracks/java/exercises/beer-song/README.md +4 -3
  65. data/tracks/java/exercises/binary-search-tree/.meta/src/reference/java/BinarySearchTree.java +38 -44
  66. data/tracks/java/exercises/binary-search-tree/README.md +4 -3
  67. data/tracks/java/exercises/binary-search-tree/src/main/java/BinarySearchTree.java +35 -0
  68. data/tracks/java/exercises/binary-search-tree/src/test/java/BinarySearchTreeTest.java +46 -40
  69. data/tracks/java/exercises/binary-search/.meta/hints.md +25 -0
  70. data/tracks/java/exercises/binary-search/.meta/src/reference/java/BinarySearch.java +3 -7
  71. data/tracks/java/exercises/binary-search/README.md +33 -3
  72. data/tracks/java/exercises/binary-search/src/test/java/BinarySearchTest.java +11 -11
  73. data/tracks/java/exercises/binary/README.md +4 -3
  74. data/tracks/java/exercises/bob/README.md +4 -3
  75. data/tracks/java/exercises/book-store/README.md +4 -3
  76. data/tracks/java/exercises/bowling/README.md +4 -3
  77. data/tracks/java/exercises/bracket-push/README.md +4 -3
  78. data/tracks/java/exercises/change/.meta/{.version → version} +0 -0
  79. data/tracks/java/exercises/change/README.md +4 -3
  80. data/tracks/java/exercises/circular-buffer/README.md +4 -3
  81. data/tracks/java/exercises/clock/.meta/{.version → version} +0 -0
  82. data/tracks/java/exercises/clock/README.md +6 -3
  83. data/tracks/java/exercises/collatz-conjecture/.meta/{.version → version} +0 -0
  84. data/tracks/java/exercises/collatz-conjecture/README.md +4 -3
  85. data/tracks/java/exercises/complex-numbers/README.md +4 -3
  86. data/tracks/java/exercises/crypto-square/README.md +4 -3
  87. data/tracks/java/exercises/{rna-transcription/.meta/.version → custom-set/.meta/version} +0 -0
  88. data/tracks/java/exercises/custom-set/README.md +4 -3
  89. data/tracks/java/exercises/custom-set/src/test/java/CustomSetTest.java +103 -251
  90. data/tracks/java/exercises/diamond/.meta/{.version → version} +0 -0
  91. data/tracks/java/exercises/diamond/README.md +4 -3
  92. data/tracks/java/exercises/difference-of-squares/.meta/{.version → version} +0 -0
  93. data/tracks/java/exercises/difference-of-squares/README.md +4 -3
  94. data/tracks/java/exercises/etl/README.md +4 -3
  95. data/tracks/java/exercises/flatten-array/.meta/{.version → version} +0 -0
  96. data/tracks/java/exercises/flatten-array/README.md +4 -3
  97. data/tracks/java/exercises/food-chain/README.md +4 -3
  98. data/tracks/java/exercises/forth/.meta/{.version → version} +0 -0
  99. data/tracks/java/exercises/forth/README.md +3 -3
  100. data/tracks/java/exercises/gigasecond/README.md +4 -3
  101. data/tracks/java/exercises/grade-school/README.md +4 -3
  102. data/tracks/java/exercises/hamming/.meta/{.version → version} +0 -0
  103. data/tracks/java/exercises/hamming/README.md +6 -3
  104. data/tracks/java/exercises/hello-world/README.md +6 -3
  105. data/tracks/java/exercises/hexadecimal/README.md +4 -3
  106. data/tracks/java/exercises/house/README.md +4 -3
  107. data/tracks/java/exercises/isogram/README.md +6 -3
  108. data/tracks/java/exercises/kindergarten-garden/README.md +4 -3
  109. data/tracks/java/exercises/largest-series-product/README.md +4 -3
  110. data/tracks/java/exercises/linked-list/README.md +4 -3
  111. data/tracks/java/exercises/list-ops/.meta/{.version → version} +0 -0
  112. data/tracks/java/exercises/list-ops/README.md +6 -3
  113. data/tracks/java/exercises/luhn/README.md +4 -3
  114. data/tracks/java/exercises/matrix/README.md +4 -3
  115. data/tracks/java/exercises/meetup/README.md +4 -3
  116. data/tracks/java/exercises/minesweeper/.meta/{.version → version} +0 -0
  117. data/tracks/java/exercises/minesweeper/README.md +4 -3
  118. data/tracks/java/exercises/nth-prime/README.md +4 -3
  119. data/tracks/java/exercises/nucleotide-count/README.md +4 -3
  120. data/tracks/java/exercises/ocr-numbers/README.md +4 -3
  121. data/tracks/java/exercises/octal/README.md +4 -3
  122. data/tracks/java/exercises/palindrome-products/README.md +4 -3
  123. data/tracks/java/exercises/pangram/.meta/{.version → version} +0 -0
  124. data/tracks/java/exercises/pangram/README.md +4 -3
  125. data/tracks/java/exercises/pascals-triangle/.meta/{.version → version} +0 -0
  126. data/tracks/java/exercises/pascals-triangle/README.md +4 -3
  127. data/tracks/java/exercises/perfect-numbers/.meta/{.version → version} +0 -0
  128. data/tracks/java/exercises/perfect-numbers/README.md +4 -3
  129. data/tracks/java/exercises/phone-number/README.md +4 -3
  130. data/tracks/java/exercises/pig-latin/README.md +4 -3
  131. data/tracks/java/exercises/poker/README.md +4 -3
  132. data/tracks/java/exercises/prime-factors/README.md +4 -3
  133. data/tracks/java/exercises/pythagorean-triplet/README.md +4 -3
  134. data/tracks/java/exercises/queen-attack/README.md +4 -3
  135. data/tracks/java/exercises/raindrops/README.md +4 -3
  136. data/tracks/java/exercises/rectangles/README.md +4 -3
  137. data/tracks/java/exercises/rna-transcription/.meta/version +1 -0
  138. data/tracks/java/exercises/rna-transcription/README.md +4 -3
  139. data/tracks/java/exercises/robot-name/README.md +4 -3
  140. data/tracks/java/exercises/robot-simulator/README.md +4 -3
  141. data/tracks/java/exercises/roman-numerals/README.md +4 -3
  142. data/tracks/java/exercises/rotational-cipher/README.md +4 -3
  143. data/tracks/java/exercises/run-length-encoding/README.md +4 -3
  144. data/tracks/java/exercises/saddle-points/.meta/{.version → version} +0 -0
  145. data/tracks/java/exercises/saddle-points/README.md +4 -3
  146. data/tracks/java/exercises/scrabble-score/.meta/{.version → version} +0 -0
  147. data/tracks/java/exercises/scrabble-score/README.md +4 -3
  148. data/tracks/java/exercises/secret-handshake/README.md +4 -3
  149. data/tracks/java/exercises/series/README.md +4 -3
  150. data/tracks/java/exercises/sieve/README.md +4 -3
  151. data/tracks/java/exercises/simple-cipher/README.md +6 -3
  152. data/tracks/java/exercises/simple-linked-list/README.md +4 -3
  153. data/tracks/java/exercises/space-age/README.md +4 -3
  154. data/tracks/java/exercises/spiral-matrix/.meta/{.version → version} +0 -0
  155. data/tracks/java/exercises/spiral-matrix/README.md +4 -3
  156. data/tracks/java/exercises/strain/README.md +4 -3
  157. data/tracks/java/exercises/sublist/README.md +4 -3
  158. data/tracks/java/exercises/sum-of-multiples/README.md +4 -3
  159. data/tracks/java/exercises/tournament/README.md +4 -3
  160. data/tracks/java/exercises/transpose/README.md +4 -3
  161. data/tracks/java/exercises/triangle/.meta/{.version → version} +0 -0
  162. data/tracks/java/exercises/triangle/README.md +4 -3
  163. data/tracks/java/exercises/trinary/README.md +4 -3
  164. data/tracks/java/exercises/twelve-days/README.md +4 -3
  165. data/tracks/java/exercises/two-fer/README.md +6 -3
  166. data/tracks/java/exercises/word-count/README.md +4 -3
  167. data/tracks/java/exercises/word-search/.meta/{.version → version} +0 -0
  168. data/tracks/java/exercises/word-search/README.md +4 -3
  169. data/tracks/java/exercises/wordy/README.md +4 -3
  170. data/tracks/julia/config.json +13 -0
  171. data/tracks/julia/exercises/phone-number/README.md +36 -0
  172. data/tracks/julia/exercises/phone-number/example.jl +18 -0
  173. data/tracks/julia/exercises/phone-number/phone-number.jl +3 -0
  174. data/tracks/julia/exercises/phone-number/runtests.jl +49 -0
  175. data/tracks/lua/config.json +505 -494
  176. data/tracks/lua/config/maintainers.json +16 -16
  177. data/tracks/lua/exercises/acronym/README.md +0 -1
  178. data/tracks/lua/exercises/all-your-base/README.md +1 -1
  179. data/tracks/lua/exercises/allergies/README.md +0 -1
  180. data/tracks/lua/exercises/alphametics/README.md +2 -2
  181. data/tracks/lua/exercises/atbash-cipher/README.md +2 -1
  182. data/tracks/lua/exercises/beer-song/README.md +1 -1
  183. data/tracks/lua/exercises/binary/README.md +2 -0
  184. data/tracks/lua/exercises/bowling/README.md +20 -6
  185. data/tracks/lua/exercises/change/README.md +1 -1
  186. data/tracks/lua/exercises/circular-buffer/README.md +13 -6
  187. data/tracks/lua/exercises/crypto-square/README.md +4 -4
  188. data/tracks/lua/exercises/diamond/README.md +6 -6
  189. data/tracks/lua/exercises/etl/README.md +2 -0
  190. data/tracks/lua/exercises/flatten-array/README.md +1 -2
  191. data/tracks/lua/exercises/food-chain/README.md +1 -1
  192. data/tracks/lua/exercises/grade-school/README.md +0 -1
  193. data/tracks/lua/exercises/grains/README.md +0 -1
  194. data/tracks/lua/exercises/house/README.md +1 -2
  195. data/tracks/lua/exercises/isogram/README.md +2 -1
  196. data/tracks/lua/exercises/kindergarten-garden/README.md +13 -13
  197. data/tracks/lua/exercises/leap/README.md +1 -1
  198. data/tracks/lua/exercises/linked-list/README.md +10 -10
  199. data/tracks/lua/exercises/luhn/README.md +7 -7
  200. data/tracks/lua/exercises/matrix/README.md +6 -4
  201. data/tracks/lua/exercises/meetup/README.md +1 -2
  202. data/tracks/lua/exercises/nucleotide-count/README.md +8 -22
  203. data/tracks/lua/exercises/ocr-numbers/README.md +5 -5
  204. data/tracks/lua/exercises/octal/README.md +6 -2
  205. data/tracks/lua/exercises/pangram/README.md +1 -1
  206. data/tracks/lua/exercises/pascals-triangle/README.md +1 -1
  207. data/tracks/lua/exercises/perfect-numbers/README.md +2 -2
  208. data/tracks/lua/exercises/phone-number/README.md +3 -2
  209. data/tracks/lua/exercises/pov/README.md +2 -2
  210. data/tracks/lua/exercises/protein-translation/README.md +4 -5
  211. data/tracks/lua/exercises/pythagorean-triplet/README.md +3 -3
  212. data/tracks/lua/exercises/rail-fence-cipher/README.md +12 -7
  213. data/tracks/lua/exercises/react/README.md +29 -0
  214. data/tracks/lua/exercises/react/example.lua +108 -0
  215. data/tracks/lua/exercises/react/react_spec.lua +160 -0
  216. data/tracks/lua/exercises/rectangles/README.md +7 -7
  217. data/tracks/lua/exercises/roman-numerals/README.md +1 -1
  218. data/tracks/lua/exercises/run-length-encoding/README.md +4 -4
  219. data/tracks/lua/exercises/scrabble-score/README.md +3 -1
  220. data/tracks/lua/exercises/secret-handshake/README.md +1 -1
  221. data/tracks/lua/exercises/space-age/README.md +2 -1
  222. data/tracks/lua/exercises/sum-of-multiples/README.md +0 -3
  223. data/tracks/lua/exercises/tournament/README.md +5 -5
  224. data/tracks/lua/exercises/transpose/README.md +7 -7
  225. data/tracks/lua/exercises/triangle/README.md +9 -6
  226. data/tracks/lua/exercises/variable-length-quantity/README.md +6 -7
  227. data/tracks/lua/exercises/word-count/README.md +1 -2
  228. data/tracks/lua/exercises/word-search/README.md +1 -1
  229. data/tracks/perl6/exercises/leap/Example.pm6 +1 -1
  230. data/tracks/perl6/exercises/leap/Leap.pm6 +1 -1
  231. data/tracks/perl6/exercises/leap/example.yaml +1 -1
  232. data/tracks/perl6/exercises/leap/leap.t +3 -3
  233. data/tracks/php/exercises/transpose/example.php +37 -15
  234. data/tracks/php/exercises/transpose/transpose_test.php +205 -45
  235. data/tracks/purescript/config.json +11 -0
  236. data/tracks/purescript/exercises/collatz-conjecture/README.md +33 -0
  237. data/tracks/purescript/exercises/collatz-conjecture/bower.json +26 -0
  238. data/tracks/purescript/exercises/collatz-conjecture/examples/src/CollatzConjecture.purs +15 -0
  239. data/tracks/purescript/exercises/collatz-conjecture/src/CollatzConjecture.purs +3 -0
  240. data/tracks/purescript/exercises/collatz-conjecture/test/Main.purs +43 -0
  241. data/tracks/python/config.json +10 -2
  242. data/tracks/racket/README.md +38 -33
  243. data/tracks/racket/config.json +10 -0
  244. data/tracks/racket/exercises/collatz-conjecture/README.md +58 -0
  245. data/tracks/racket/exercises/collatz-conjecture/collatz-conjecture-test.rkt +34 -0
  246. data/tracks/racket/exercises/collatz-conjecture/collatz-conjecture.rkt +6 -0
  247. data/tracks/racket/exercises/collatz-conjecture/example.rkt +20 -0
  248. data/tracks/ruby/exercises/allergies/.meta/.version +1 -0
  249. data/tracks/ruby/exercises/allergies/.meta/generator/allergies_case.rb +33 -0
  250. data/tracks/ruby/exercises/allergies/.meta/solutions/allergies.rb +4 -0
  251. data/tracks/ruby/exercises/allergies/allergies_test.rb +42 -9
  252. data/tracks/typescript/config.json +46 -0
  253. data/tracks/typescript/exercises/circular-buffer/README.md +74 -0
  254. data/tracks/typescript/exercises/circular-buffer/circular-buffer.example.ts +51 -0
  255. data/tracks/typescript/exercises/circular-buffer/circular-buffer.test.ts +103 -0
  256. data/tracks/typescript/exercises/circular-buffer/circular-buffer.ts +0 -0
  257. data/tracks/typescript/exercises/circular-buffer/package.json +36 -0
  258. data/tracks/typescript/exercises/circular-buffer/tsconfig.json +22 -0
  259. data/tracks/typescript/exercises/circular-buffer/tslint.json +127 -0
  260. data/tracks/typescript/exercises/circular-buffer/yarn.lock +2305 -0
  261. data/tracks/typescript/exercises/largest-series-product/README.md +51 -0
  262. data/tracks/typescript/exercises/largest-series-product/largest-series-product.example.ts +52 -0
  263. data/tracks/typescript/exercises/largest-series-product/largest-series-product.test.ts +68 -0
  264. data/tracks/typescript/exercises/largest-series-product/largest-series-product.ts +0 -0
  265. data/tracks/typescript/exercises/largest-series-product/package.json +36 -0
  266. data/tracks/typescript/exercises/largest-series-product/tsconfig.json +22 -0
  267. data/tracks/typescript/exercises/largest-series-product/tslint.json +127 -0
  268. data/tracks/typescript/exercises/largest-series-product/yarn.lock +2305 -0
  269. data/tracks/typescript/exercises/robot-simulator/README.md +58 -0
  270. data/tracks/typescript/exercises/robot-simulator/package.json +36 -0
  271. data/tracks/typescript/exercises/robot-simulator/robot-simulator.example.ts +74 -0
  272. data/tracks/typescript/exercises/robot-simulator/robot-simulator.test.ts +150 -0
  273. data/tracks/typescript/exercises/robot-simulator/robot-simulator.ts +0 -0
  274. data/tracks/typescript/exercises/robot-simulator/tsconfig.json +22 -0
  275. data/tracks/typescript/exercises/robot-simulator/tslint.json +127 -0
  276. data/tracks/typescript/exercises/robot-simulator/yarn.lock +2305 -0
  277. metadata +85 -23
@@ -1,3 +1,7 @@
1
+ module BookKeeping
2
+ VERSION = 1
3
+ end
4
+
1
5
  class Allergies
2
6
  ALLERGENS = %w(eggs peanuts shellfish strawberries tomatoes chocolate pollen cats)
3
7
 
@@ -1,8 +1,10 @@
1
1
  require 'minitest/autorun'
2
2
  require_relative 'allergies'
3
3
 
4
+ # Common test data version: 1.0.0 879bc89
4
5
  class AllergiesTest < Minitest::Test
5
6
  def test_no_allergies_means_not_allergic
7
+ # skip
6
8
  allergies = Allergies.new(0)
7
9
  refute allergies.allergic_to?('peanuts')
8
10
  refute allergies.allergic_to?('cats')
@@ -26,19 +28,25 @@ class AllergiesTest < Minitest::Test
26
28
  def test_no_allergies_at_all
27
29
  skip
28
30
  allergies = Allergies.new(0)
29
- assert_equal [], allergies.list
31
+ assert_equal %w(), allergies.list
30
32
  end
31
33
 
32
34
  def test_allergic_to_just_eggs
33
35
  skip
34
36
  allergies = Allergies.new(1)
35
- assert_equal ['eggs'], allergies.list
37
+ assert_equal %w(eggs), allergies.list
36
38
  end
37
39
 
38
40
  def test_allergic_to_just_peanuts
39
41
  skip
40
42
  allergies = Allergies.new(2)
41
- assert_equal ['peanuts'], allergies.list
43
+ assert_equal %w(peanuts), allergies.list
44
+ end
45
+
46
+ def test_allergic_to_just_strawberries
47
+ skip
48
+ allergies = Allergies.new(8)
49
+ assert_equal %w(strawberries), allergies.list
42
50
  end
43
51
 
44
52
  def test_allergic_to_eggs_and_peanuts
@@ -47,24 +55,49 @@ class AllergiesTest < Minitest::Test
47
55
  assert_equal %w(eggs peanuts), allergies.list
48
56
  end
49
57
 
58
+ def test_allergic_to_more_than_eggs_but_not_peanuts
59
+ skip
60
+ allergies = Allergies.new(5)
61
+ assert_equal %w(eggs shellfish), allergies.list
62
+ end
63
+
50
64
  def test_allergic_to_lots_of_stuff
51
65
  skip
52
66
  allergies = Allergies.new(248)
53
- expected = %w(strawberries tomatoes chocolate pollen cats)
54
- assert_equal expected, allergies.list
67
+ assert_equal %w(strawberries tomatoes chocolate pollen cats), allergies.list
55
68
  end
56
69
 
57
70
  def test_allergic_to_everything
58
71
  skip
59
72
  allergies = Allergies.new(255)
60
- expected = %w(eggs peanuts shellfish strawberries tomatoes chocolate pollen cats)
61
- assert_equal expected, allergies.list
73
+ assert_equal %w(eggs peanuts shellfish strawberries tomatoes chocolate pollen cats), allergies.list
62
74
  end
63
75
 
64
76
  def test_ignore_non_allergen_score_parts
65
77
  skip
66
78
  allergies = Allergies.new(509)
67
- expected = %w(eggs shellfish strawberries tomatoes chocolate pollen cats)
68
- assert_equal expected, allergies.list
79
+ assert_equal %w(eggs shellfish strawberries tomatoes chocolate pollen cats), allergies.list
80
+ end
81
+
82
+ # Problems in exercism evolve over time, as we find better ways to ask
83
+ # questions.
84
+ # The version number refers to the version of the problem you solved,
85
+ # not your solution.
86
+ #
87
+ # Define a constant named VERSION inside of the top level BookKeeping
88
+ # module, which may be placed near the end of your file.
89
+ #
90
+ # In your file, it will look like this:
91
+ #
92
+ # module BookKeeping
93
+ # VERSION = 1 # Where the version number matches the one in the test.
94
+ # end
95
+ #
96
+ # If you are curious, read more about constants on RubyDoc:
97
+ # http://ruby-doc.org/docs/ruby-doc-bundle/UsersGuide/rg/constants.html
98
+
99
+ def test_bookkeeping
100
+ skip
101
+ assert_equal 1, BookKeeping::VERSION
69
102
  end
70
103
  end
@@ -200,6 +200,21 @@
200
200
  "Parsing"
201
201
  ]
202
202
  },
203
+ {
204
+ "uuid": "3cc210e8-b3bb-11e7-abc4-cec278b6b50a",
205
+ "slug": "circular-buffer",
206
+ "core": false,
207
+ "unlocked_by": "linked-list",
208
+ "difficulty": 8,
209
+ "topics": [
210
+ "Control-flow (conditionals)",
211
+ "Control-flow (loops)",
212
+ "Data structures",
213
+ "Lists",
214
+ "Arrays",
215
+ "Exception handling"
216
+ ]
217
+ },
203
218
  {
204
219
  "uuid": "9dfabc5c-d2a5-4896-9fc2-2b25b9a5f62f",
205
220
  "slug": "gigasecond",
@@ -436,6 +451,37 @@
436
451
  "Mathematics",
437
452
  "Iterators"
438
453
  ]
454
+ },
455
+ {
456
+ "uuid": "b646dc26-59c1-436e-883a-20290de7a526",
457
+ "slug": "largest-series-product",
458
+ "core": false,
459
+ "unlocked_by": "pangram",
460
+ "difficulty": 7,
461
+ "topics": [
462
+ "Control-flow (conditionals)",
463
+ "Control-flow (loops)",
464
+ "Mathematics",
465
+ "Integers",
466
+ "Strings",
467
+ "Exception handling",
468
+ "Regular expressions"
469
+ ]
470
+ },
471
+ {
472
+ "uuid": "abe907d0-7ca0-4fe5-83fd-72a4d2acab66",
473
+ "slug": "robot-simulator",
474
+ "core": false,
475
+ "unlocked_by": "wordy",
476
+ "difficulty": 5,
477
+ "topics": [
478
+ "Control-flow (conditionals)",
479
+ "Control-flow (loops)",
480
+ "Exception handling",
481
+ "Strings",
482
+ "Games",
483
+ "Parsing"
484
+ ]
439
485
  }
440
486
  ],
441
487
  "foregone": []
@@ -0,0 +1,74 @@
1
+ # Circular Buffer
2
+
3
+ A circular buffer, cyclic buffer or ring buffer is a data structure that
4
+ uses a single, fixed-size buffer as if it were connected end-to-end.
5
+
6
+ A circular buffer first starts empty and of some predefined length. For
7
+ example, this is a 7-element buffer:
8
+
9
+ [ ][ ][ ][ ][ ][ ][ ]
10
+
11
+ Assume that a 1 is written into the middle of the buffer (exact starting
12
+ location does not matter in a circular buffer):
13
+
14
+ [ ][ ][ ][1][ ][ ][ ]
15
+
16
+ Then assume that two more elements are added — 2 & 3 — which get
17
+ appended after the 1:
18
+
19
+ [ ][ ][ ][1][2][3][ ]
20
+
21
+ If two elements are then removed from the buffer, the oldest values
22
+ inside the buffer are removed. The two elements removed, in this case,
23
+ are 1 & 2, leaving the buffer with just a 3:
24
+
25
+ [ ][ ][ ][ ][ ][3][ ]
26
+
27
+ If the buffer has 7 elements then it is completely full:
28
+
29
+ [6][7][8][9][3][4][5]
30
+
31
+ When the buffer is full an error will be raised, alerting the client
32
+ that further writes are blocked until a slot becomes free.
33
+
34
+ The client can opt to overwrite the oldest data with a forced write. In
35
+ this case, two more elements — A & B — are added and they overwrite the
36
+ 3 & 4:
37
+
38
+ [6][7][8][9][A][B][5]
39
+
40
+ Finally, if two elements are now removed then what would be returned is
41
+ not 3 & 4 but 5 & 6 because A & B overwrote the 3 & the 4 yielding the
42
+ buffer with:
43
+
44
+ [ ][7][8][9][A][B][ ]
45
+
46
+ ## Setup
47
+
48
+ Go through the setup instructions for TypeScript to
49
+ install the necessary dependencies:
50
+
51
+ http://exercism.io/languages/typescript
52
+
53
+ ## Requirements
54
+
55
+ Install assignment dependencies:
56
+
57
+ ```bash
58
+ $ yarn install
59
+ ```
60
+
61
+ ## Making the test suite pass
62
+
63
+ Execute the tests with:
64
+
65
+ ```bash
66
+ $ yarn test
67
+ ```
68
+
69
+ ## Source
70
+
71
+ Wikipedia [http://en.wikipedia.org/wiki/Binary_search_algorithm](http://en.wikipedia.org/wiki/Binary_search_algorithm)
72
+
73
+ ## Submitting Incomplete Solutions
74
+ It's possible to submit an incomplete solution so you can see how others have completed the exercise.
@@ -0,0 +1,51 @@
1
+ interface Buffer<T> {
2
+ read(): T | undefined
3
+ write(value: T): void
4
+ clear(): void
5
+ }
6
+
7
+ export class BufferOverflowError extends Error {
8
+ constructor() {
9
+ super("Buffer is full.")
10
+ }
11
+ }
12
+
13
+ export class BufferEmptyError extends Error {
14
+ constructor() {
15
+ super("Buffer is empty.")
16
+ }
17
+ }
18
+
19
+ export default class CircularBuffer<T> implements Buffer<T> {
20
+ private capacity: number
21
+ private buffer: T[] = []
22
+
23
+ constructor(capacity: number) {
24
+ this.capacity = capacity
25
+ }
26
+
27
+ public read() {
28
+ if (this.buffer.length === 0) {
29
+ throw new BufferEmptyError()
30
+ }
31
+ return this.buffer.shift()
32
+ }
33
+
34
+ public write(value: T) {
35
+ if (this.buffer.length + 1 > this.capacity) {
36
+ throw new BufferOverflowError()
37
+ }
38
+ this.buffer.push(value)
39
+ }
40
+
41
+ public forceWrite(value: T) {
42
+ if (this.buffer.length === this.capacity) {
43
+ this.read()
44
+ }
45
+ this.buffer.push(value)
46
+ }
47
+
48
+ public clear() {
49
+ this.buffer = []
50
+ }
51
+ }
@@ -0,0 +1,103 @@
1
+ import CircularBuffer, { BufferOverflowError, BufferEmptyError } from './circular-buffer'
2
+
3
+ describe('CircularBuffer', () => {
4
+ it('reading an empty buffer throws a BufferEmptyError', () => {
5
+ const buffer = new CircularBuffer<string>(1)
6
+ expect(() => buffer.read()).toThrow(BufferEmptyError)
7
+ })
8
+
9
+ it('write and read back one item', () => {
10
+ const buffer = new CircularBuffer<string>(1)
11
+ buffer.write('1')
12
+ expect(buffer.read()).toBe('1')
13
+ expect(() => buffer.read()).toThrow(BufferEmptyError)
14
+ })
15
+
16
+ it('write and read back multiple items', () => {
17
+ const buffer = new CircularBuffer<string>(2)
18
+ buffer.write('1')
19
+ buffer.write('2')
20
+ expect(buffer.read()).toBe('1')
21
+ expect(buffer.read()).toBe('2')
22
+ expect(() => buffer.read()).toThrow(BufferEmptyError)
23
+ })
24
+
25
+ it('clearing a buffer', () => {
26
+ const buffer = new CircularBuffer<string>(2)
27
+ buffer.write('1')
28
+ buffer.write('2')
29
+ buffer.clear()
30
+ expect(() => buffer.read()).toThrow(BufferEmptyError)
31
+ buffer.write('3')
32
+ buffer.write('4')
33
+ expect(buffer.read()).toBe('3')
34
+ expect(buffer.read()).toBe('4')
35
+ })
36
+
37
+ it('alternate write and read', () => {
38
+ const buffer = new CircularBuffer<string>(2)
39
+ buffer.write('1')
40
+ expect(buffer.read()).toBe('1')
41
+ buffer.write('2')
42
+ expect(buffer.read()).toBe('2')
43
+ })
44
+
45
+ it('reads back oldest item', () => {
46
+ const buffer = new CircularBuffer<string>(3)
47
+ buffer.write('1')
48
+ buffer.write('2')
49
+ buffer.read()
50
+ buffer.write('3')
51
+ expect(buffer.read()).toBe('2')
52
+ expect(buffer.read()).toBe('3')
53
+ })
54
+
55
+ it('writing to a full buffer throws a BufferOverflowError', () => {
56
+ const buffer = new CircularBuffer<string>(2)
57
+ buffer.write('1')
58
+ buffer.write('2')
59
+ expect(() => buffer.write('A')).toThrow(BufferOverflowError)
60
+ })
61
+
62
+ it('forced writes over write oldest item in a full buffer', () => {
63
+ const buffer = new CircularBuffer<string>(2)
64
+ buffer.write('1')
65
+ buffer.write('2')
66
+ buffer.forceWrite('A')
67
+ expect(buffer.read()).toBe('2')
68
+ expect(buffer.read()).toBe('A')
69
+ expect(() => buffer.read()).toThrow(BufferEmptyError)
70
+ })
71
+
72
+ it('forced writes act like write in a non-full buffer', () => {
73
+ const buffer = new CircularBuffer<string>(2)
74
+ buffer.write('1')
75
+ buffer.forceWrite('2')
76
+ expect(buffer.read()).toBe('1')
77
+ expect(buffer.read()).toBe('2')
78
+ expect(() => buffer.read()).toThrow(BufferEmptyError)
79
+ })
80
+
81
+ it('alternate force write and read into full buffer', () => {
82
+ const buffer = new CircularBuffer<string>(5)
83
+ buffer.write('1')
84
+ buffer.write('2')
85
+ buffer.write('3')
86
+ buffer.read()
87
+ buffer.read()
88
+ buffer.write('4')
89
+ buffer.read()
90
+ buffer.write('5')
91
+ buffer.write('6')
92
+ buffer.write('7')
93
+ buffer.write('8')
94
+ buffer.forceWrite('A')
95
+ buffer.forceWrite('B')
96
+ expect(buffer.read()).toBe('6')
97
+ expect(buffer.read()).toBe('7')
98
+ expect(buffer.read()).toBe('8')
99
+ expect(buffer.read()).toBe('A')
100
+ expect(buffer.read()).toBe('B')
101
+ expect(() => buffer.read()).toThrow(BufferEmptyError)
102
+ })
103
+ })
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "xtypescript",
3
+ "version": "1.0.0",
4
+ "description": "Exercism exercises in Typescript.",
5
+ "author": "",
6
+ "private": true,
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/exercism/xtypescript"
10
+ },
11
+ "devDependencies": {},
12
+ "scripts": {
13
+ "test": "tsc --noEmit -p . && jest --no-cache",
14
+ "lint": "tsc --noEmit -p . && tslint \"*.ts?(x)\"",
15
+ "lintci": "tslint \"*.ts?(x)\" --force"
16
+ },
17
+ "dependencies": {
18
+ "@types/jest": "^20.0.0",
19
+ "@types/node": "^7.0.5",
20
+ "jest": "^20.0.4",
21
+ "ts-jest": "^20.0.6",
22
+ "tslint": "^5.4.3",
23
+ "typescript": "^2.2.1"
24
+ },
25
+ "jest": {
26
+ "transform": {
27
+ ".(ts|tsx)": "<rootDir>/node_modules/ts-jest/preprocessor.js"
28
+ },
29
+ "testRegex": "(/__tests__/.*|\\.(test|spec))\\.(ts|tsx|js)$",
30
+ "moduleFileExtensions": [
31
+ "ts",
32
+ "tsx",
33
+ "js"
34
+ ]
35
+ }
36
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "es2017",
4
+ "module": "commonjs",
5
+ "alwaysStrict": true,
6
+ "noUnusedLocals": true,
7
+ "noUnusedParameters": true,
8
+ "noImplicitAny": true,
9
+ "strictNullChecks": true,
10
+ "preserveConstEnums": true,
11
+ "noFallthroughCasesInSwitch":true,
12
+ "noImplicitThis":true,
13
+ "noImplicitReturns":true,
14
+ "sourceMap": true,
15
+ "noEmitOnError": true,
16
+ "outDir": "./build"
17
+ },
18
+ "compileOnSave": true,
19
+ "exclude": [
20
+ "node_modules"
21
+ ]
22
+ }