trackler 2.2.1.47 → 2.2.1.48

Sign up to get free protection for your applications and to get access to all the features.
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
+ }