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.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/problem-specifications/exercises/pangram/canonical-data.json +3 -3
- data/tracks/common-lisp/.travis.yml +2 -9
- data/tracks/common-lisp/docs/TESTS.md +43 -9
- data/tracks/delphi/exercises/nucleotide-count/uNucleotideCountTest.pas +2 -2
- data/tracks/elixir/.travis.yml +4 -7
- data/tracks/elixir/README.md +2 -6
- data/tracks/elixir/bin/dialyzer_check.sh +2 -13
- data/tracks/elixir/exercises/allergies/example.exs +3 -2
- data/tracks/elixir/exercises/atbash-cipher/example.exs +5 -5
- data/tracks/elixir/exercises/bank-account/example.exs +11 -11
- data/tracks/elixir/exercises/bob/example.exs +4 -4
- data/tracks/elixir/exercises/forth/example.exs +66 -48
- data/tracks/elixir/exercises/minesweeper/example.exs +31 -18
- data/tracks/elixir/exercises/pangram/example.exs +4 -4
- data/tracks/elixir/exercises/queen-attack/queen_attack_test.exs +68 -53
- data/tracks/elixir/exercises/say/example.exs +33 -31
- data/tracks/elixir/exercises/scrabble-score/example.exs +12 -11
- data/tracks/elixir/mix.exs +10 -7
- data/tracks/elixir/mix.lock +4 -1
- data/tracks/erlang/README.md +2 -0
- data/tracks/fsharp/exercises/nth-prime/Example.fs +4 -1
- data/tracks/fsharp/exercises/nth-prime/NthPrime.fs +1 -1
- data/tracks/fsharp/exercises/nth-prime/NthPrimeTest.fs +12 -32
- data/tracks/fsharp/exercises/pangram/PangramTest.fs +3 -3
- data/tracks/fsharp/exercises/perfect-numbers/Example.fs +9 -6
- data/tracks/fsharp/exercises/perfect-numbers/PerfectNumbers.fs +1 -1
- data/tracks/fsharp/exercises/perfect-numbers/PerfectNumbersTest.fs +55 -21
- data/tracks/fsharp/generators/Generators.fs +18 -0
- data/tracks/gnu-apl/config.json +21 -0
- data/tracks/gnu-apl/exercises/hamming/README.md +42 -0
- data/tracks/gnu-apl/exercises/hamming/hamming-example.apl +5 -0
- data/tracks/gnu-apl/exercises/hamming/hamming.tc +75 -0
- data/tracks/gnu-apl/exercises/hello-world/README.md +17 -1
- data/tracks/gnu-apl/exercises/leap/README.md +33 -0
- data/tracks/gnu-apl/exercises/raindrops/README.md +24 -0
- data/tracks/gnu-apl/exercises/raindrops/raindrops-example.apl +8 -0
- data/tracks/gnu-apl/exercises/raindrops/raindrops.tc +60 -0
- data/tracks/gnu-apl/exercises/rna-transcription/README.md +25 -0
- data/tracks/gnu-apl/exercises/rna-transcription/rna-transcription-example.apl +7 -0
- data/tracks/gnu-apl/exercises/rna-transcription/rna-transcription.tc +41 -0
- data/tracks/gnu-apl/test.apl +13 -0
- data/tracks/haskell/config.json +9 -0
- data/tracks/haskell/exercises/rotational-cipher/README.md +91 -0
- data/tracks/haskell/exercises/rotational-cipher/examples/success-standard/package.yaml +16 -0
- data/tracks/haskell/exercises/rotational-cipher/examples/success-standard/src/RotationalCipher.hs +9 -0
- data/tracks/haskell/exercises/rotational-cipher/package.yaml +20 -0
- data/tracks/haskell/exercises/rotational-cipher/src/RotationalCipher.hs +4 -0
- data/tracks/haskell/exercises/rotational-cipher/stack.yaml +1 -0
- data/tracks/haskell/exercises/rotational-cipher/test/Tests.hs +77 -0
- data/tracks/java/config.json +23 -14
- data/tracks/java/config/exercise-readme-insert.md +3 -3
- data/tracks/java/config/exercise_readme.go.tmpl +3 -0
- data/tracks/java/exercises/accumulate/README.md +4 -3
- data/tracks/java/exercises/acronym/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/acronym/README.md +4 -3
- data/tracks/java/exercises/all-your-base/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/all-your-base/README.md +4 -3
- data/tracks/java/exercises/allergies/README.md +4 -3
- data/tracks/java/exercises/anagram/README.md +4 -3
- data/tracks/java/exercises/atbash-cipher/README.md +4 -3
- data/tracks/java/exercises/bank-account/README.md +6 -3
- data/tracks/java/exercises/beer-song/README.md +4 -3
- data/tracks/java/exercises/binary-search-tree/.meta/src/reference/java/BinarySearchTree.java +38 -44
- data/tracks/java/exercises/binary-search-tree/README.md +4 -3
- data/tracks/java/exercises/binary-search-tree/src/main/java/BinarySearchTree.java +35 -0
- data/tracks/java/exercises/binary-search-tree/src/test/java/BinarySearchTreeTest.java +46 -40
- data/tracks/java/exercises/binary-search/.meta/hints.md +25 -0
- data/tracks/java/exercises/binary-search/.meta/src/reference/java/BinarySearch.java +3 -7
- data/tracks/java/exercises/binary-search/README.md +33 -3
- data/tracks/java/exercises/binary-search/src/test/java/BinarySearchTest.java +11 -11
- data/tracks/java/exercises/binary/README.md +4 -3
- data/tracks/java/exercises/bob/README.md +4 -3
- data/tracks/java/exercises/book-store/README.md +4 -3
- data/tracks/java/exercises/bowling/README.md +4 -3
- data/tracks/java/exercises/bracket-push/README.md +4 -3
- data/tracks/java/exercises/change/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/change/README.md +4 -3
- data/tracks/java/exercises/circular-buffer/README.md +4 -3
- data/tracks/java/exercises/clock/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/clock/README.md +6 -3
- data/tracks/java/exercises/collatz-conjecture/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/collatz-conjecture/README.md +4 -3
- data/tracks/java/exercises/complex-numbers/README.md +4 -3
- data/tracks/java/exercises/crypto-square/README.md +4 -3
- data/tracks/java/exercises/{rna-transcription/.meta/.version → custom-set/.meta/version} +0 -0
- data/tracks/java/exercises/custom-set/README.md +4 -3
- data/tracks/java/exercises/custom-set/src/test/java/CustomSetTest.java +103 -251
- data/tracks/java/exercises/diamond/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/diamond/README.md +4 -3
- data/tracks/java/exercises/difference-of-squares/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/difference-of-squares/README.md +4 -3
- data/tracks/java/exercises/etl/README.md +4 -3
- data/tracks/java/exercises/flatten-array/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/flatten-array/README.md +4 -3
- data/tracks/java/exercises/food-chain/README.md +4 -3
- data/tracks/java/exercises/forth/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/forth/README.md +3 -3
- data/tracks/java/exercises/gigasecond/README.md +4 -3
- data/tracks/java/exercises/grade-school/README.md +4 -3
- data/tracks/java/exercises/hamming/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/hamming/README.md +6 -3
- data/tracks/java/exercises/hello-world/README.md +6 -3
- data/tracks/java/exercises/hexadecimal/README.md +4 -3
- data/tracks/java/exercises/house/README.md +4 -3
- data/tracks/java/exercises/isogram/README.md +6 -3
- data/tracks/java/exercises/kindergarten-garden/README.md +4 -3
- data/tracks/java/exercises/largest-series-product/README.md +4 -3
- data/tracks/java/exercises/linked-list/README.md +4 -3
- data/tracks/java/exercises/list-ops/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/list-ops/README.md +6 -3
- data/tracks/java/exercises/luhn/README.md +4 -3
- data/tracks/java/exercises/matrix/README.md +4 -3
- data/tracks/java/exercises/meetup/README.md +4 -3
- data/tracks/java/exercises/minesweeper/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/minesweeper/README.md +4 -3
- data/tracks/java/exercises/nth-prime/README.md +4 -3
- data/tracks/java/exercises/nucleotide-count/README.md +4 -3
- data/tracks/java/exercises/ocr-numbers/README.md +4 -3
- data/tracks/java/exercises/octal/README.md +4 -3
- data/tracks/java/exercises/palindrome-products/README.md +4 -3
- data/tracks/java/exercises/pangram/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/pangram/README.md +4 -3
- data/tracks/java/exercises/pascals-triangle/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/pascals-triangle/README.md +4 -3
- data/tracks/java/exercises/perfect-numbers/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/perfect-numbers/README.md +4 -3
- data/tracks/java/exercises/phone-number/README.md +4 -3
- data/tracks/java/exercises/pig-latin/README.md +4 -3
- data/tracks/java/exercises/poker/README.md +4 -3
- data/tracks/java/exercises/prime-factors/README.md +4 -3
- data/tracks/java/exercises/pythagorean-triplet/README.md +4 -3
- data/tracks/java/exercises/queen-attack/README.md +4 -3
- data/tracks/java/exercises/raindrops/README.md +4 -3
- data/tracks/java/exercises/rectangles/README.md +4 -3
- data/tracks/java/exercises/rna-transcription/.meta/version +1 -0
- data/tracks/java/exercises/rna-transcription/README.md +4 -3
- data/tracks/java/exercises/robot-name/README.md +4 -3
- data/tracks/java/exercises/robot-simulator/README.md +4 -3
- data/tracks/java/exercises/roman-numerals/README.md +4 -3
- data/tracks/java/exercises/rotational-cipher/README.md +4 -3
- data/tracks/java/exercises/run-length-encoding/README.md +4 -3
- data/tracks/java/exercises/saddle-points/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/saddle-points/README.md +4 -3
- data/tracks/java/exercises/scrabble-score/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/scrabble-score/README.md +4 -3
- data/tracks/java/exercises/secret-handshake/README.md +4 -3
- data/tracks/java/exercises/series/README.md +4 -3
- data/tracks/java/exercises/sieve/README.md +4 -3
- data/tracks/java/exercises/simple-cipher/README.md +6 -3
- data/tracks/java/exercises/simple-linked-list/README.md +4 -3
- data/tracks/java/exercises/space-age/README.md +4 -3
- data/tracks/java/exercises/spiral-matrix/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/spiral-matrix/README.md +4 -3
- data/tracks/java/exercises/strain/README.md +4 -3
- data/tracks/java/exercises/sublist/README.md +4 -3
- data/tracks/java/exercises/sum-of-multiples/README.md +4 -3
- data/tracks/java/exercises/tournament/README.md +4 -3
- data/tracks/java/exercises/transpose/README.md +4 -3
- data/tracks/java/exercises/triangle/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/triangle/README.md +4 -3
- data/tracks/java/exercises/trinary/README.md +4 -3
- data/tracks/java/exercises/twelve-days/README.md +4 -3
- data/tracks/java/exercises/two-fer/README.md +6 -3
- data/tracks/java/exercises/word-count/README.md +4 -3
- data/tracks/java/exercises/word-search/.meta/{.version → version} +0 -0
- data/tracks/java/exercises/word-search/README.md +4 -3
- data/tracks/java/exercises/wordy/README.md +4 -3
- data/tracks/julia/config.json +13 -0
- data/tracks/julia/exercises/phone-number/README.md +36 -0
- data/tracks/julia/exercises/phone-number/example.jl +18 -0
- data/tracks/julia/exercises/phone-number/phone-number.jl +3 -0
- data/tracks/julia/exercises/phone-number/runtests.jl +49 -0
- data/tracks/lua/config.json +505 -494
- data/tracks/lua/config/maintainers.json +16 -16
- data/tracks/lua/exercises/acronym/README.md +0 -1
- data/tracks/lua/exercises/all-your-base/README.md +1 -1
- data/tracks/lua/exercises/allergies/README.md +0 -1
- data/tracks/lua/exercises/alphametics/README.md +2 -2
- data/tracks/lua/exercises/atbash-cipher/README.md +2 -1
- data/tracks/lua/exercises/beer-song/README.md +1 -1
- data/tracks/lua/exercises/binary/README.md +2 -0
- data/tracks/lua/exercises/bowling/README.md +20 -6
- data/tracks/lua/exercises/change/README.md +1 -1
- data/tracks/lua/exercises/circular-buffer/README.md +13 -6
- data/tracks/lua/exercises/crypto-square/README.md +4 -4
- data/tracks/lua/exercises/diamond/README.md +6 -6
- data/tracks/lua/exercises/etl/README.md +2 -0
- data/tracks/lua/exercises/flatten-array/README.md +1 -2
- data/tracks/lua/exercises/food-chain/README.md +1 -1
- data/tracks/lua/exercises/grade-school/README.md +0 -1
- data/tracks/lua/exercises/grains/README.md +0 -1
- data/tracks/lua/exercises/house/README.md +1 -2
- data/tracks/lua/exercises/isogram/README.md +2 -1
- data/tracks/lua/exercises/kindergarten-garden/README.md +13 -13
- data/tracks/lua/exercises/leap/README.md +1 -1
- data/tracks/lua/exercises/linked-list/README.md +10 -10
- data/tracks/lua/exercises/luhn/README.md +7 -7
- data/tracks/lua/exercises/matrix/README.md +6 -4
- data/tracks/lua/exercises/meetup/README.md +1 -2
- data/tracks/lua/exercises/nucleotide-count/README.md +8 -22
- data/tracks/lua/exercises/ocr-numbers/README.md +5 -5
- data/tracks/lua/exercises/octal/README.md +6 -2
- data/tracks/lua/exercises/pangram/README.md +1 -1
- data/tracks/lua/exercises/pascals-triangle/README.md +1 -1
- data/tracks/lua/exercises/perfect-numbers/README.md +2 -2
- data/tracks/lua/exercises/phone-number/README.md +3 -2
- data/tracks/lua/exercises/pov/README.md +2 -2
- data/tracks/lua/exercises/protein-translation/README.md +4 -5
- data/tracks/lua/exercises/pythagorean-triplet/README.md +3 -3
- data/tracks/lua/exercises/rail-fence-cipher/README.md +12 -7
- data/tracks/lua/exercises/react/README.md +29 -0
- data/tracks/lua/exercises/react/example.lua +108 -0
- data/tracks/lua/exercises/react/react_spec.lua +160 -0
- data/tracks/lua/exercises/rectangles/README.md +7 -7
- data/tracks/lua/exercises/roman-numerals/README.md +1 -1
- data/tracks/lua/exercises/run-length-encoding/README.md +4 -4
- data/tracks/lua/exercises/scrabble-score/README.md +3 -1
- data/tracks/lua/exercises/secret-handshake/README.md +1 -1
- data/tracks/lua/exercises/space-age/README.md +2 -1
- data/tracks/lua/exercises/sum-of-multiples/README.md +0 -3
- data/tracks/lua/exercises/tournament/README.md +5 -5
- data/tracks/lua/exercises/transpose/README.md +7 -7
- data/tracks/lua/exercises/triangle/README.md +9 -6
- data/tracks/lua/exercises/variable-length-quantity/README.md +6 -7
- data/tracks/lua/exercises/word-count/README.md +1 -2
- data/tracks/lua/exercises/word-search/README.md +1 -1
- data/tracks/perl6/exercises/leap/Example.pm6 +1 -1
- data/tracks/perl6/exercises/leap/Leap.pm6 +1 -1
- data/tracks/perl6/exercises/leap/example.yaml +1 -1
- data/tracks/perl6/exercises/leap/leap.t +3 -3
- data/tracks/php/exercises/transpose/example.php +37 -15
- data/tracks/php/exercises/transpose/transpose_test.php +205 -45
- data/tracks/purescript/config.json +11 -0
- data/tracks/purescript/exercises/collatz-conjecture/README.md +33 -0
- data/tracks/purescript/exercises/collatz-conjecture/bower.json +26 -0
- data/tracks/purescript/exercises/collatz-conjecture/examples/src/CollatzConjecture.purs +15 -0
- data/tracks/purescript/exercises/collatz-conjecture/src/CollatzConjecture.purs +3 -0
- data/tracks/purescript/exercises/collatz-conjecture/test/Main.purs +43 -0
- data/tracks/python/config.json +10 -2
- data/tracks/racket/README.md +38 -33
- data/tracks/racket/config.json +10 -0
- data/tracks/racket/exercises/collatz-conjecture/README.md +58 -0
- data/tracks/racket/exercises/collatz-conjecture/collatz-conjecture-test.rkt +34 -0
- data/tracks/racket/exercises/collatz-conjecture/collatz-conjecture.rkt +6 -0
- data/tracks/racket/exercises/collatz-conjecture/example.rkt +20 -0
- data/tracks/ruby/exercises/allergies/.meta/.version +1 -0
- data/tracks/ruby/exercises/allergies/.meta/generator/allergies_case.rb +33 -0
- data/tracks/ruby/exercises/allergies/.meta/solutions/allergies.rb +4 -0
- data/tracks/ruby/exercises/allergies/allergies_test.rb +42 -9
- data/tracks/typescript/config.json +46 -0
- data/tracks/typescript/exercises/circular-buffer/README.md +74 -0
- data/tracks/typescript/exercises/circular-buffer/circular-buffer.example.ts +51 -0
- data/tracks/typescript/exercises/circular-buffer/circular-buffer.test.ts +103 -0
- data/tracks/typescript/exercises/circular-buffer/circular-buffer.ts +0 -0
- data/tracks/typescript/exercises/circular-buffer/package.json +36 -0
- data/tracks/typescript/exercises/circular-buffer/tsconfig.json +22 -0
- data/tracks/typescript/exercises/circular-buffer/tslint.json +127 -0
- data/tracks/typescript/exercises/circular-buffer/yarn.lock +2305 -0
- data/tracks/typescript/exercises/largest-series-product/README.md +51 -0
- data/tracks/typescript/exercises/largest-series-product/largest-series-product.example.ts +52 -0
- data/tracks/typescript/exercises/largest-series-product/largest-series-product.test.ts +68 -0
- data/tracks/typescript/exercises/largest-series-product/largest-series-product.ts +0 -0
- data/tracks/typescript/exercises/largest-series-product/package.json +36 -0
- data/tracks/typescript/exercises/largest-series-product/tsconfig.json +22 -0
- data/tracks/typescript/exercises/largest-series-product/tslint.json +127 -0
- data/tracks/typescript/exercises/largest-series-product/yarn.lock +2305 -0
- data/tracks/typescript/exercises/robot-simulator/README.md +58 -0
- data/tracks/typescript/exercises/robot-simulator/package.json +36 -0
- data/tracks/typescript/exercises/robot-simulator/robot-simulator.example.ts +74 -0
- data/tracks/typescript/exercises/robot-simulator/robot-simulator.test.ts +150 -0
- data/tracks/typescript/exercises/robot-simulator/robot-simulator.ts +0 -0
- data/tracks/typescript/exercises/robot-simulator/tsconfig.json +22 -0
- data/tracks/typescript/exercises/robot-simulator/tslint.json +127 -0
- data/tracks/typescript/exercises/robot-simulator/yarn.lock +2305 -0
- metadata +85 -23
|
@@ -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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
68
|
-
|
|
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
|
+
})
|
|
File without changes
|
|
@@ -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
|
+
}
|