trackler 2.2.1.105 → 2.2.1.106
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/.travis.yml +1 -41
- data/problem-specifications/exercises/bowling/canonical-data.json +17 -1
- data/problem-specifications/exercises/circular-buffer/canonical-data.json +317 -278
- data/problem-specifications/exercises/forth/canonical-data.json +155 -67
- data/problem-specifications/exercises/grains/canonical-data.json +32 -11
- data/problem-specifications/exercises/grep/canonical-data.json +106 -64
- data/problem-specifications/exercises/house/canonical-data.json +57 -29
- data/problem-specifications/exercises/isogram/canonical-data.json +28 -10
- data/problem-specifications/exercises/list-ops/canonical-data.json +77 -39
- data/problem-specifications/exercises/pov/canonical-data.json +386 -355
- data/problem-specifications/exercises/trinary/canonical-data.json +34 -12
- data/problem-specifications/exercises/two-bucket/description.md +1 -1
- data/problem-specifications/exercises/word-search/canonical-data.json +309 -269
- data/problem-specifications/exercises/zipper/canonical-data.json +337 -311
- data/tracks/bash/docs/ABOUT.md +22 -2
- data/tracks/c/exercises/bob/README.md +2 -0
- data/tracks/c/exercises/bob/src/example.c +4 -2
- data/tracks/c/exercises/bob/test/test_bob.c +82 -12
- data/tracks/c/exercises/palindrome-products/src/example.c +100 -27
- data/tracks/c/exercises/palindrome-products/src/example.h +19 -4
- data/tracks/c/exercises/palindrome-products/test/test_palindrome_products.c +178 -10
- data/tracks/common-lisp/exercises/bob/README.md +2 -0
- data/tracks/common-lisp/exercises/bob/bob-test.lisp +45 -8
- data/tracks/common-lisp/exercises/bob/example.lisp +11 -7
- data/tracks/cpp/docs/INSTALLATION.md +1 -1
- data/tracks/cpp/exercises/leap/leap_test.cpp +1 -1
- data/tracks/elixir/exercises/pig-latin/example.exs +1 -2
- data/tracks/elixir/exercises/pig-latin/pig_latin_test.exs +13 -4
- data/tracks/elm/config.json +4 -4
- data/tracks/elm/exercises/bob/Bob.example.elm +3 -1
- data/tracks/elm/exercises/bob/README.md +2 -0
- data/tracks/elm/exercises/bob/tests/Tests.elm +1 -1
- data/tracks/elm/exercises/phone-number/PhoneNumber.example.elm +33 -18
- data/tracks/elm/exercises/phone-number/tests/Tests.elm +40 -19
- data/tracks/elm/exercises/space-age/tests/Tests.elm +8 -8
- data/tracks/fsharp/exercises/all-your-base/AllYourBaseTest.fs +2 -2
- data/tracks/fsharp/exercises/binary-search-tree/BinarySearchTree.fs +3 -7
- data/tracks/fsharp/exercises/binary-search-tree/BinarySearchTreeTest.fs +63 -37
- data/tracks/fsharp/exercises/binary-search-tree/Example.fs +5 -5
- data/tracks/fsharp/exercises/circular-buffer/CircularBufferTest.fs +0 -13
- data/tracks/fsharp/exercises/complex-numbers/ComplexNumbersTest.fs +7 -1
- data/tracks/fsharp/exercises/react/ReactTest.fs +0 -12
- data/tracks/fsharp/exercises/scale-generator/Example.fs +11 -7
- data/tracks/fsharp/exercises/scale-generator/ScaleGenerator.fs +1 -1
- data/tracks/fsharp/exercises/scale-generator/ScaleGeneratorTest.fs +34 -49
- data/tracks/fsharp/generators/Common.fs +1 -1
- data/tracks/fsharp/generators/Exercise.fs +3 -2
- data/tracks/fsharp/generators/Generators.fs +95 -29
- data/tracks/fsharp/generators/Templates/_TestFunction.liquid +1 -1
- data/tracks/fsharp/generators/Templates/_TestFunctionBody.liquid +3 -1
- data/tracks/fsharp/generators/Templates/_TestMember.liquid +1 -1
- data/tracks/fsharp/generators/Templates/_TestMemberBody.liquid +3 -1
- data/tracks/go/exercises/simple-linked-list/linked_list_test.go +17 -13
- data/tracks/haskell/config.json +10 -0
- data/tracks/haskell/exercises/all-your-base/package.yaml +1 -1
- data/tracks/haskell/exercises/all-your-base/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/bowling/package.yaml +1 -1
- data/tracks/haskell/exercises/bowling/test/Tests.hs +8 -0
- data/tracks/haskell/exercises/complex-numbers/package.yaml +1 -1
- data/tracks/haskell/exercises/diamond/examples/success-standard/src/Diamond.hs +2 -2
- data/tracks/haskell/exercises/diamond/package.yaml +1 -1
- data/tracks/haskell/exercises/diamond/src/Diamond.hs +1 -1
- data/tracks/haskell/exercises/diamond/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/forth/package.yaml +1 -1
- data/tracks/haskell/exercises/grains/package.yaml +1 -1
- data/tracks/haskell/exercises/isogram/package.yaml +1 -1
- data/tracks/haskell/exercises/list-ops/package.yaml +1 -1
- data/tracks/haskell/exercises/list-ops/test/Tests.hs +81 -76
- data/tracks/haskell/exercises/pov/package.yaml +1 -1
- data/tracks/haskell/exercises/protein-translation/README.md +102 -0
- data/tracks/haskell/exercises/protein-translation/examples/success-standard/package.yaml +17 -0
- data/tracks/haskell/exercises/protein-translation/examples/success-standard/src/ProteinTranslation.hs +24 -0
- data/tracks/haskell/exercises/protein-translation/package.yaml +20 -0
- data/tracks/haskell/exercises/protein-translation/src/ProteinTranslation.hs +4 -0
- data/tracks/haskell/exercises/protein-translation/stack.yaml +1 -0
- data/tracks/haskell/exercises/protein-translation/test/Tests.hs +119 -0
- data/tracks/haskell/exercises/zipper/package.yaml +1 -1
- data/tracks/java/.github/PULL_REQUEST_TEMPLATE.md +1 -1
- data/tracks/java/config.json +13 -0
- data/tracks/java/exercises/atbash-cipher/src/test/java/AtbashTest.java +78 -62
- data/tracks/java/exercises/binary/.meta/version +1 -0
- data/tracks/java/exercises/binary/src/test/java/BinaryTest.java +97 -32
- data/tracks/java/exercises/bracket-push/.meta/version +1 -1
- data/tracks/java/exercises/isbn-verifier/.meta/version +1 -1
- data/tracks/java/exercises/isbn-verifier/src/test/java/IsbnVerifierTest.java +6 -0
- data/tracks/java/exercises/matrix/.meta/src/reference/java/Matrix.java +0 -8
- data/tracks/java/exercises/matrix/.meta/version +2 -0
- data/tracks/java/exercises/matrix/src/test/java/MatrixTest.java +95 -193
- data/tracks/java/exercises/octal/src/test/java/OctalTest.java +81 -32
- data/tracks/java/exercises/pascals-triangle/.meta/version +1 -1
- data/tracks/java/exercises/phone-number/.meta/version +1 -1
- data/tracks/java/exercises/pig-latin/.meta/version +1 -1
- data/tracks/java/exercises/pig-latin/src/test/java/PigLatinTranslatorTest.java +116 -55
- data/tracks/java/exercises/prime-factors/src/test/java/PrimeFactorsCalculatorTest.java +42 -24
- data/tracks/java/exercises/raindrops/.meta/version +1 -1
- data/tracks/java/exercises/raindrops/src/test/java/RaindropConverterTest.java +97 -41
- data/tracks/java/exercises/reverse-string/.meta/version +1 -1
- data/tracks/java/exercises/roman-numerals/src/test/java/RomanNumeralsTest.java +118 -37
- data/tracks/java/exercises/run-length-encoding/.meta/version +1 -0
- data/tracks/java/exercises/scrabble-score/src/test/java/ScrabbleScoreTest.java +71 -29
- data/tracks/java/exercises/settings.gradle +1 -0
- data/tracks/java/exercises/two-bucket/.meta/src/reference/java/TwoBucket.java +145 -0
- data/tracks/java/exercises/two-bucket/.meta/version +1 -0
- data/tracks/java/exercises/two-bucket/README.md +48 -0
- data/tracks/java/exercises/two-bucket/build.gradle +18 -0
- data/{problem-specifications/exercises/circular-buffer/USE_OLD_SCHEMA → tracks/java/exercises/two-bucket/src/main/java/.keep} +0 -0
- data/tracks/java/exercises/two-bucket/src/test/java/TwoBucketTest.java +77 -0
- data/tracks/javascript/.eslintignore +0 -9
- data/tracks/javascript/exercises/binary-search/example.js +1 -1
- data/tracks/javascript/exercises/binary-search-tree/example.js +2 -2
- data/tracks/javascript/exercises/bracket-push/example.js +1 -1
- data/tracks/javascript/exercises/leap/example.js +7 -3
- data/tracks/javascript/exercises/leap/leap.js +2 -2
- data/tracks/javascript/exercises/list-ops/example.js +1 -1
- data/tracks/javascript/exercises/luhn/example.js +2 -2
- data/tracks/javascript/exercises/pythagorean-triplet/example.js +2 -1
- data/tracks/javascript/exercises/roman-numerals/example.js +3 -2
- data/tracks/julia/config.json +13 -0
- data/tracks/julia/exercises/isbn-verifier/README.md +51 -0
- data/tracks/julia/exercises/isbn-verifier/example.jl +26 -0
- data/{problem-specifications/exercises/forth/USE_OLD_SCHEMA → tracks/julia/exercises/isbn-verifier/isbn-verifier.jl} +0 -0
- data/tracks/julia/exercises/isbn-verifier/runtests.jl +73 -0
- data/tracks/perl5/.travis.yml +8 -1
- data/tracks/perl5/README.md +9 -11
- data/tracks/perl5/bin/exercise-gen.pl +14 -29
- data/tracks/perl5/config.json +1 -0
- data/tracks/perl5/cpanfile +2 -1
- data/tracks/perl5/exercises/accumulate/{Example.pm → .meta/solutions/Accumulate.pm} +1 -1
- data/tracks/perl5/exercises/accumulate/.meta/solutions/accumulate.t +1 -0
- data/tracks/perl5/exercises/accumulate/accumulate.t +1 -1
- data/tracks/perl5/exercises/all-your-base/{Example.pm → .meta/solutions/AllYourBase.pm} +1 -1
- data/tracks/perl5/exercises/all-your-base/.meta/solutions/all-your-base.t +1 -0
- data/tracks/perl5/exercises/all-your-base/all-your-base.t +1 -1
- data/tracks/perl5/exercises/allergies/{Example.pm → .meta/solutions/Allergies.pm} +1 -1
- data/tracks/perl5/exercises/allergies/.meta/solutions/allergies.t +1 -0
- data/tracks/perl5/exercises/allergies/allergies.t +75 -8
- data/tracks/perl5/exercises/anagram/{Example.pm → .meta/solutions/Anagram.pm} +1 -1
- data/tracks/perl5/exercises/anagram/.meta/solutions/anagram.t +1 -0
- data/tracks/perl5/exercises/anagram/anagram.t +61 -8
- data/tracks/perl5/exercises/atbash-cipher/{Example.pm → .meta/solutions/Cipher.pm} +1 -1
- data/tracks/perl5/exercises/atbash-cipher/.meta/solutions/cipher.t +1 -0
- data/tracks/perl5/exercises/atbash-cipher/cipher.t +81 -8
- data/tracks/perl5/exercises/beer-song/{Example.pm → .meta/solutions/Beer.pm} +1 -1
- data/tracks/perl5/exercises/beer-song/.meta/solutions/beer.t +1 -0
- data/tracks/perl5/exercises/beer-song/beer.t +80 -7
- data/tracks/perl5/exercises/binary/{Example.pm → .meta/solutions/Binary.pm} +1 -1
- data/tracks/perl5/exercises/binary/.meta/solutions/binary.t +1 -0
- data/tracks/perl5/exercises/binary/binary.t +1 -1
- data/tracks/perl5/exercises/binary-search/{Example.pm → .meta/solutions/BinarySearch.pm} +1 -1
- data/tracks/perl5/exercises/binary-search/.meta/solutions/binary-search.t +1 -0
- data/tracks/perl5/exercises/binary-search/binary-search.t +1 -1
- data/tracks/perl5/exercises/binary-search-tree/{Example.pm → .meta/solutions/BinarySearchTree.pm} +1 -1
- data/tracks/perl5/exercises/binary-search-tree/.meta/solutions/binary_search_tree.t +1 -0
- data/tracks/perl5/exercises/binary-search-tree/binary_search_tree.t +1 -1
- data/tracks/perl5/exercises/bob/{example.yaml → .meta/exercise-data.yaml} +0 -1
- data/tracks/perl5/exercises/bob/{Example.pm → .meta/solutions/Bob.pm} +0 -0
- data/tracks/perl5/exercises/bob/.meta/solutions/bob.t +1 -0
- data/tracks/perl5/exercises/bob/bob.t +1 -2
- data/tracks/perl5/exercises/clock/{Example.pm → .meta/solutions/Clock.pm} +2 -2
- data/tracks/perl5/exercises/clock/.meta/solutions/clock.t +1 -0
- data/tracks/perl5/exercises/clock/clock.t +1 -1
- data/tracks/perl5/exercises/crypto-square/{Example.pm → .meta/solutions/Crypto.pm} +1 -1
- data/tracks/perl5/exercises/crypto-square/.meta/solutions/crypto.t +1 -0
- data/tracks/perl5/exercises/crypto-square/crypto.t +1 -1
- data/tracks/perl5/exercises/custom-set/{Example.pm → .meta/solutions/CustomSet.pm} +1 -1
- data/tracks/perl5/exercises/custom-set/.meta/solutions/custom-set.t +1 -0
- data/tracks/perl5/exercises/custom-set/custom-set.t +1 -1
- data/tracks/perl5/exercises/difference-of-squares/{Example.pm → .meta/solutions/Squares.pm} +1 -1
- data/tracks/perl5/exercises/difference-of-squares/.meta/solutions/difference_of_squares.t +1 -0
- data/tracks/perl5/exercises/difference-of-squares/difference_of_squares.t +1 -1
- data/tracks/perl5/exercises/etl/{Example.pm → .meta/solutions/ETL.pm} +1 -1
- data/tracks/perl5/exercises/etl/.meta/solutions/etl.t +1 -0
- data/tracks/perl5/exercises/etl/etl.t +1 -1
- data/tracks/perl5/exercises/food-chain/{Example.pm → .meta/solutions/FoodChainSong.pm} +1 -1
- data/tracks/perl5/exercises/food-chain/.meta/solutions/food_chain.t +1 -0
- data/tracks/perl5/exercises/food-chain/food_chain.t +1 -1
- data/tracks/perl5/exercises/gigasecond/{Example.pm → .meta/solutions/Gigasecond.pm} +1 -1
- data/tracks/perl5/exercises/gigasecond/.meta/solutions/gigasecond.t +1 -0
- data/tracks/perl5/exercises/gigasecond/gigasecond.t +1 -1
- data/tracks/perl5/exercises/grade-school/{Example.pm → .meta/solutions/GradeSchool.pm} +1 -1
- data/tracks/perl5/exercises/grade-school/.meta/solutions/grade_school.t +1 -0
- data/tracks/perl5/exercises/grade-school/grade_school.t +1 -1
- data/tracks/perl5/exercises/grains/{Example.pm → .meta/solutions/Grains.pm} +1 -1
- data/tracks/perl5/exercises/grains/.meta/solutions/grains.t +1 -0
- data/tracks/perl5/exercises/grains/grains.t +54 -6
- data/tracks/perl5/exercises/hamming/{Example.pm → .meta/solutions/Hamming.pm} +1 -1
- data/tracks/perl5/exercises/hamming/.meta/solutions/hamming.t +1 -0
- data/tracks/perl5/exercises/hamming/hamming.t +1 -1
- data/tracks/perl5/exercises/hello-world/{example.yaml → .meta/exercise-data.yaml} +0 -1
- data/tracks/perl5/exercises/hello-world/{Example.pm → .meta/solutions/HelloWorld.pm} +0 -0
- data/tracks/perl5/exercises/hello-world/.meta/solutions/hello-world.t +1 -0
- data/tracks/perl5/exercises/hello-world/hello-world.t +1 -2
- data/tracks/perl5/exercises/hexadecimal/{Example.pm → .meta/solutions/Hexadecimal.pm} +1 -1
- data/tracks/perl5/exercises/hexadecimal/.meta/solutions/hexadecimal.t +1 -0
- data/tracks/perl5/exercises/hexadecimal/hexadecimal.t +1 -1
- data/tracks/perl5/exercises/house/{Example.pm → .meta/solutions/House.pm} +1 -1
- data/tracks/perl5/exercises/house/.meta/solutions/house.t +1 -0
- data/tracks/perl5/exercises/house/house.t +1 -1
- data/tracks/perl5/exercises/kindergarten-garden/{Example.pm → .meta/solutions/Kindergarten.pm} +1 -1
- data/tracks/perl5/exercises/kindergarten-garden/.meta/solutions/kindergarten.t +1 -0
- data/tracks/perl5/exercises/kindergarten-garden/kindergarten.t +1 -1
- data/tracks/perl5/exercises/largest-series-product/{Example.pm → .meta/solutions/Series.pm} +1 -1
- data/tracks/perl5/exercises/largest-series-product/.meta/solutions/series_product.t +1 -0
- data/tracks/perl5/exercises/largest-series-product/series_product.t +1 -1
- data/tracks/perl5/exercises/leap/{example.yaml → .meta/exercise-data.yaml} +0 -1
- data/tracks/perl5/exercises/leap/{Example.pm → .meta/solutions/Leap.pm} +0 -0
- data/tracks/perl5/exercises/leap/.meta/solutions/leap.t +1 -0
- data/tracks/perl5/exercises/leap/leap.t +1 -2
- data/tracks/perl5/exercises/linked-list/{Example.pm → .meta/solutions/Deque.pm} +1 -1
- data/tracks/perl5/exercises/linked-list/.meta/solutions/deque.t +1 -0
- data/tracks/perl5/exercises/linked-list/deque.t +60 -7
- data/tracks/perl5/exercises/list-ops/{Example.pm → .meta/solutions/ListOps.pm} +1 -1
- data/tracks/perl5/exercises/list-ops/.meta/solutions/list-ops.t +1 -0
- data/tracks/perl5/exercises/list-ops/list-ops.t +1 -1
- data/tracks/perl5/exercises/luhn/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl5/exercises/luhn/{Example.pm → .meta/solutions/Luhn.pm} +0 -0
- data/tracks/perl5/exercises/luhn/.meta/solutions/luhn.t +1 -0
- data/tracks/perl5/exercises/luhn/luhn.t +1 -2
- data/tracks/perl5/exercises/matrix/{Example.pm → .meta/solutions/Matrix.pm} +1 -1
- data/tracks/perl5/exercises/matrix/.meta/solutions/matrix.t +1 -0
- data/tracks/perl5/exercises/matrix/matrix.t +1 -1
- data/tracks/perl5/exercises/meetup/{Example.pm → .meta/solutions/Meetup.pm} +1 -1
- data/tracks/perl5/exercises/meetup/.meta/solutions/meetup.t +1 -0
- data/tracks/perl5/exercises/meetup/meetup.t +1 -1
- data/tracks/perl5/exercises/minesweeper/{Example.pm → .meta/solutions/Minesweeper.pm} +1 -1
- data/tracks/perl5/exercises/minesweeper/.meta/solutions/minesweeper.t +1 -0
- data/tracks/perl5/exercises/minesweeper/minesweeper.t +1 -1
- data/tracks/perl5/exercises/nucleotide-count/{Example.pm → .meta/solutions/NucleotideCount.pm} +1 -1
- data/tracks/perl5/exercises/nucleotide-count/.meta/solutions/nucleotide_count.t +1 -0
- data/tracks/perl5/exercises/nucleotide-count/nucleotide_count.t +1 -1
- data/tracks/perl5/exercises/ocr-numbers/{Example.pm → .meta/solutions/OCR.pm} +1 -1
- data/tracks/perl5/exercises/ocr-numbers/.meta/solutions/ocr.t +1 -0
- data/tracks/perl5/exercises/ocr-numbers/ocr.t +1 -1
- data/tracks/perl5/exercises/palindrome-products/{Example.pm → .meta/solutions/Palindrome.pm} +1 -1
- data/tracks/perl5/exercises/palindrome-products/.meta/solutions/palindrome.t +1 -0
- data/tracks/perl5/exercises/palindrome-products/palindrome.t +1 -1
- data/tracks/perl5/exercises/pascals-triangle/{Example.pm → .meta/solutions/Triangle.pm} +1 -1
- data/tracks/perl5/exercises/pascals-triangle/.meta/solutions/triangle.t +1 -0
- data/tracks/perl5/exercises/pascals-triangle/triangle.t +51 -7
- data/tracks/perl5/exercises/phone-number/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl5/exercises/phone-number/{Example.pm → .meta/solutions/PhoneNumber.pm} +0 -0
- data/tracks/perl5/exercises/phone-number/.meta/solutions/phone-number.t +1 -0
- data/tracks/perl5/exercises/phone-number/phone-number.t +1 -2
- data/tracks/perl5/exercises/pig-latin/{Example.pm → .meta/solutions/PigLatin.pm} +1 -1
- data/tracks/perl5/exercises/pig-latin/.meta/solutions/piglatin.t +1 -0
- data/tracks/perl5/exercises/pig-latin/piglatin.t +1 -1
- data/tracks/perl5/exercises/point-mutations/{Example.pm → .meta/solutions/DNA.pm} +1 -1
- data/tracks/perl5/exercises/point-mutations/.meta/solutions/dna.t +1 -0
- data/tracks/perl5/exercises/point-mutations/dna.t +75 -7
- data/tracks/perl5/exercises/prime-factors/{Example.pm → .meta/solutions/Prime.pm} +1 -1
- data/tracks/perl5/exercises/prime-factors/.meta/solutions/prime.t +1 -0
- data/tracks/perl5/exercises/prime-factors/prime.t +63 -7
- data/tracks/perl5/exercises/proverb/{Example.pm → .meta/solutions/Proverb.pm} +1 -1
- data/tracks/perl5/exercises/proverb/.meta/solutions/proverb.t +1 -0
- data/tracks/perl5/exercises/proverb/proverb.t +58 -7
- data/tracks/perl5/exercises/pythagorean-triplet/{Example.pm → .meta/solutions/Triplet.pm} +2 -2
- data/tracks/perl5/exercises/pythagorean-triplet/.meta/solutions/triplet.t +1 -0
- data/tracks/perl5/exercises/pythagorean-triplet/triplet.t +1 -1
- data/tracks/perl5/exercises/queen-attack/{Example.pm → .meta/solutions/Queens.pm} +1 -1
- data/tracks/perl5/exercises/queen-attack/.meta/solutions/queen.t +1 -0
- data/tracks/perl5/exercises/queen-attack/queen.t +186 -8
- data/tracks/perl5/exercises/raindrops/{Example.pm → .meta/solutions/Raindrops.pm} +1 -1
- data/tracks/perl5/exercises/raindrops/.meta/solutions/raindrops.t +1 -0
- data/tracks/perl5/exercises/raindrops/raindrops.t +89 -7
- data/tracks/perl5/exercises/rna-transcription/{Example.pm → .meta/solutions/DNA.pm} +1 -1
- data/tracks/perl5/exercises/rna-transcription/.meta/solutions/rna.t +1 -0
- data/tracks/perl5/exercises/rna-transcription/rna.t +1 -1
- data/tracks/perl5/exercises/robot-name/{Example.pm → .meta/solutions/RobotName.pm} +1 -1
- data/tracks/perl5/exercises/robot-name/.meta/solutions/robot_name.t +1 -0
- data/tracks/perl5/exercises/robot-name/robot_name.t +1 -1
- data/tracks/perl5/exercises/robot-simulator/{Example.pm → .meta/solutions/Robot.pm} +1 -1
- data/tracks/perl5/exercises/robot-simulator/.meta/solutions/robot_simulator.t +1 -0
- data/tracks/perl5/exercises/robot-simulator/robot_simulator.t +1 -1
- data/tracks/perl5/exercises/roman-numerals/{Example.pm → .meta/solutions/Decimal.pm} +1 -1
- data/tracks/perl5/exercises/roman-numerals/.meta/solutions/roman.t +1 -0
- data/tracks/perl5/exercises/roman-numerals/roman.t +1 -1
- data/tracks/perl5/exercises/saddle-points/{Example.pm → .meta/solutions/Matrix.pm} +1 -1
- data/tracks/perl5/exercises/saddle-points/.meta/solutions/saddle_points.t +1 -0
- data/tracks/perl5/exercises/saddle-points/saddle_points.t +1 -1
- data/tracks/perl5/exercises/say/{Example.pm → .meta/solutions/Say.pm} +1 -1
- data/tracks/perl5/exercises/say/.meta/solutions/say.t +1 -0
- data/tracks/perl5/exercises/say/say.t +1 -1
- data/tracks/perl5/exercises/scrabble-score/{Example.pm → .meta/solutions/Word.pm} +1 -1
- data/tracks/perl5/exercises/scrabble-score/.meta/solutions/scrabble.t +1 -0
- data/tracks/perl5/exercises/scrabble-score/scrabble.t +1 -1
- data/tracks/perl5/exercises/secret-handshake/{Example.pm → .meta/solutions/SecretHandshake.pm} +1 -1
- data/tracks/perl5/exercises/secret-handshake/.meta/solutions/handshake.t +1 -0
- data/tracks/perl5/exercises/secret-handshake/handshake.t +1 -1
- data/tracks/perl5/exercises/series/{Example.pm → .meta/solutions/Series.pm} +1 -1
- data/tracks/perl5/exercises/series/.meta/solutions/series.t +1 -0
- data/tracks/perl5/exercises/series/series.t +1 -1
- data/tracks/perl5/exercises/sieve/{Example.pm → .meta/solutions/Sieve.pm} +1 -1
- data/tracks/perl5/exercises/sieve/.meta/solutions/sieve.t +1 -0
- data/tracks/perl5/exercises/sieve/sieve.t +1 -1
- data/tracks/perl5/exercises/simple-cipher/{Example.pm → .meta/solutions/Cipher.pm} +1 -1
- data/tracks/perl5/exercises/simple-cipher/.meta/solutions/cipher.t +1 -0
- data/tracks/perl5/exercises/simple-cipher/cipher.t +1 -1
- data/tracks/perl5/exercises/simple-linked-list/{Example.pm → .meta/solutions/LinkedList.pm} +1 -1
- data/tracks/perl5/exercises/simple-linked-list/.meta/solutions/simple_linked_list.t +1 -0
- data/tracks/perl5/exercises/simple-linked-list/simple_linked_list.t +1 -1
- data/tracks/perl5/exercises/space-age/{Example.pm → .meta/solutions/SpaceAge.pm} +1 -1
- data/tracks/perl5/exercises/space-age/.meta/solutions/space.t +1 -0
- data/tracks/perl5/exercises/space-age/space.t +1 -1
- data/tracks/perl5/exercises/strain/{Example.pm → .meta/solutions/Strain.pm} +1 -1
- data/tracks/perl5/exercises/strain/.meta/solutions/strain.t +1 -0
- data/tracks/perl5/exercises/strain/strain.t +1 -1
- data/tracks/perl5/exercises/sublist/{Example.pm → .meta/solutions/Sublist.pm} +1 -1
- data/tracks/perl5/exercises/sublist/.meta/solutions/sublist.t +1 -0
- data/tracks/perl5/exercises/sublist/sublist.t +1 -1
- data/tracks/perl5/exercises/sum-of-multiples/{Example.pm → .meta/solutions/SumOfMultiples.pm} +1 -1
- data/tracks/perl5/exercises/sum-of-multiples/.meta/solutions/sum_of_multiples.t +1 -0
- data/tracks/perl5/exercises/sum-of-multiples/sum_of_multiples.t +1 -1
- data/tracks/perl5/exercises/triangle/{Example.pm → .meta/solutions/Triangle.pm} +1 -1
- data/tracks/perl5/exercises/triangle/.meta/solutions/triangle.t +1 -0
- data/tracks/perl5/exercises/triangle/triangle.t +87 -8
- data/tracks/perl5/exercises/trinary/{Example.pm → .meta/solutions/Trinary.pm} +1 -1
- data/tracks/perl5/exercises/trinary/.meta/solutions/trinary.t +1 -0
- data/tracks/perl5/exercises/trinary/trinary.t +1 -1
- data/tracks/perl5/exercises/twelve-days/{Example.pm → .meta/solutions/TwelveDays.pm} +1 -1
- data/tracks/perl5/exercises/twelve-days/.meta/solutions/song.t +1 -0
- data/tracks/perl5/exercises/twelve-days/song.t +1 -1
- data/tracks/perl5/exercises/word-count/{Example.pm → .meta/solutions/Phrase.pm} +1 -1
- data/tracks/perl5/exercises/word-count/.meta/solutions/word_count.t +1 -0
- data/tracks/perl5/exercises/word-count/word_count.t +1 -1
- data/tracks/perl5/exercises/wordy/{Example.pm → .meta/solutions/Wordy.pm} +1 -1
- data/tracks/perl5/exercises/wordy/.meta/solutions/wordy.t +1 -0
- data/tracks/perl5/exercises/wordy/wordy.t +87 -9
- data/tracks/perl5/lib/Exercism/Generator.pm +48 -0
- data/tracks/perl5/t/generated-tests.t +26 -0
- data/tracks/perl5/templates/test.mustache +4 -17
- data/tracks/perl6/.proverc +1 -0
- data/tracks/perl6/.travis.yml +6 -10
- data/tracks/perl6/README.md +1 -3
- data/tracks/perl6/bin/exercise-gen.pl6 +2 -0
- data/tracks/perl6/exercises/accumulate/.meta/solutions/accumulate.t +1 -0
- data/tracks/perl6/exercises/acronym/.meta/solutions/acronym.t +1 -0
- data/tracks/perl6/exercises/all-your-base/.meta/solutions/all-your-base.t +1 -0
- data/tracks/perl6/exercises/allergies/.meta/solutions/allergies.t +1 -0
- data/tracks/perl6/exercises/anagram/.meta/solutions/anagram.t +1 -0
- data/tracks/perl6/exercises/atbash-cipher/.meta/solutions/atbash-cipher.t +1 -0
- data/tracks/perl6/exercises/bob/.meta/solutions/bob.t +1 -0
- data/tracks/perl6/exercises/clock/.meta/solutions/clock.t +1 -0
- data/tracks/perl6/exercises/etl/.meta/solutions/etl.t +1 -0
- data/tracks/perl6/exercises/flatten-array/.meta/solutions/flatten-array.t +1 -0
- data/tracks/perl6/exercises/grade-school/.meta/solutions/grade-school.t +1 -0
- data/tracks/perl6/exercises/grains/.meta/solutions/grains.t +1 -0
- data/tracks/perl6/exercises/hamming/.meta/solutions/hamming.t +1 -0
- data/tracks/perl6/exercises/hello-world/.meta/solutions/hello-world.t +1 -0
- data/tracks/perl6/exercises/leap/.meta/solutions/leap.t +1 -0
- data/tracks/perl6/exercises/linked-list/.meta/solutions/linked-list.t +1 -0
- data/tracks/perl6/exercises/luhn/.meta/solutions/luhn.t +1 -0
- data/tracks/perl6/exercises/meetup/.meta/solutions/meetup.t +1 -0
- data/tracks/perl6/exercises/nucleotide-count/.meta/solutions/nucleotide-count.t +1 -0
- data/tracks/perl6/exercises/pangram/.meta/solutions/pangram.t +1 -0
- data/tracks/perl6/exercises/phone-number/.meta/solutions/phone-number.t +1 -0
- data/tracks/perl6/exercises/raindrops/.meta/solutions/raindrops.t +1 -0
- data/tracks/perl6/exercises/rna-transcription/.meta/solutions/rna-transcription.t +1 -0
- data/tracks/perl6/exercises/robot-name/.meta/solutions/robot-name.t +1 -0
- data/tracks/perl6/exercises/roman-numerals/.meta/solutions/roman-numerals.t +1 -0
- data/tracks/perl6/exercises/scrabble-score/.meta/solutions/scrabble-score.t +1 -0
- data/tracks/perl6/exercises/space-age/.meta/solutions/space-age.t +1 -0
- data/tracks/perl6/exercises/two-fer/.meta/solutions/two-fer.t +1 -0
- data/tracks/perl6/exercises/word-count/.meta/solutions/word-count.t +1 -0
- data/tracks/perl6/exercises/wordy/.meta/solutions/wordy.t +1 -0
- data/tracks/python/config/exercise_readme.go.tmpl +23 -4
- data/tracks/python/exercises/accumulate/README.md +2 -3
- data/tracks/python/exercises/acronym/README.md +2 -3
- data/tracks/python/exercises/acronym/acronym_test.py +2 -5
- data/tracks/python/exercises/all-your-base/README.md +2 -4
- data/tracks/python/exercises/allergies/README.md +2 -3
- data/tracks/python/exercises/allergies/allergies_test.py +1 -1
- data/tracks/python/exercises/alphametics/README.md +2 -4
- data/tracks/python/exercises/anagram/README.md +2 -3
- data/tracks/python/exercises/anagram/anagram_test.py +2 -16
- data/tracks/python/exercises/armstrong-numbers/README.md +16 -2
- data/tracks/python/exercises/atbash-cipher/README.md +2 -3
- data/tracks/python/exercises/atbash-cipher/atbash_cipher_test.py +1 -1
- data/tracks/python/exercises/beer-song/README.md +2 -3
- data/tracks/python/exercises/binary/README.md +2 -3
- data/tracks/python/exercises/binary-search/README.md +2 -3
- data/tracks/python/exercises/binary-search-tree/README.md +2 -3
- data/tracks/python/exercises/bob/README.md +4 -3
- data/tracks/python/exercises/book-store/README.md +2 -3
- data/tracks/python/exercises/bowling/README.md +2 -3
- data/tracks/python/exercises/bracket-push/README.md +2 -3
- data/tracks/python/exercises/change/README.md +2 -3
- data/tracks/python/exercises/circular-buffer/README.md +2 -3
- data/tracks/python/exercises/clock/README.md +2 -3
- data/tracks/python/exercises/collatz-conjecture/README.md +2 -3
- data/tracks/python/exercises/complex-numbers/README.md +3 -3
- data/tracks/python/exercises/connect/README.md +2 -4
- data/tracks/python/exercises/crypto-square/README.md +2 -3
- data/tracks/python/exercises/crypto-square/crypto_square_test.py +1 -1
- data/tracks/python/exercises/custom-set/README.md +17 -3
- data/tracks/python/exercises/diamond/README.md +2 -3
- data/tracks/python/exercises/difference-of-squares/README.md +2 -3
- data/tracks/python/exercises/difference-of-squares/difference_of_squares_test.py +1 -1
- data/tracks/python/exercises/diffie-hellman/README.md +2 -3
- data/tracks/python/exercises/dominoes/README.md +2 -4
- data/tracks/python/exercises/dot-dsl/README.md +20 -5
- data/tracks/python/exercises/error-handling/README.md +2 -4
- data/tracks/python/exercises/etl/README.md +2 -3
- data/tracks/python/exercises/flatten-array/README.md +2 -3
- data/tracks/python/exercises/flatten-array/flatten_array_test.py +1 -1
- data/tracks/python/exercises/food-chain/README.md +2 -3
- data/tracks/python/exercises/forth/README.md +2 -4
- data/tracks/python/exercises/gigasecond/README.md +2 -3
- data/tracks/python/exercises/gigasecond/gigasecond_test.py +1 -2
- data/tracks/python/exercises/go-counting/README.md +2 -4
- data/tracks/python/exercises/grade-school/README.md +2 -3
- data/tracks/python/exercises/grains/README.md +2 -3
- data/tracks/python/exercises/grep/README.md +2 -3
- data/tracks/python/exercises/hamming/README.md +2 -3
- data/tracks/python/exercises/hamming/hamming_test.py +1 -1
- data/tracks/python/exercises/hello-world/README.md +2 -3
- data/tracks/python/exercises/hello-world/hello_world_test.py +1 -1
- data/tracks/python/exercises/hexadecimal/README.md +2 -3
- data/tracks/python/exercises/house/README.md +2 -3
- data/tracks/python/exercises/isbn-verifier/README.md +48 -20
- data/tracks/python/exercises/isogram/README.md +2 -3
- data/tracks/python/exercises/kindergarten-garden/README.md +2 -3
- data/tracks/python/exercises/kindergarten-garden/kindergarten_garden_test.py +1 -1
- data/tracks/python/exercises/largest-series-product/README.md +2 -3
- data/tracks/python/exercises/largest-series-product/largest_series_product_test.py +1 -1
- data/tracks/python/exercises/leap/README.md +2 -3
- data/tracks/python/exercises/leap/leap_test.py +1 -1
- data/tracks/python/exercises/linked-list/README.md +2 -3
- data/tracks/python/exercises/list-ops/README.md +2 -4
- data/tracks/python/exercises/luhn/README.md +2 -3
- data/tracks/python/exercises/markdown/README.md +2 -4
- data/tracks/python/exercises/matrix/README.md +2 -3
- data/tracks/python/exercises/matrix/example.py +6 -3
- data/tracks/python/exercises/matrix/matrix.py +6 -0
- data/tracks/python/exercises/matrix/matrix_test.py +25 -15
- data/tracks/python/exercises/meetup/README.md +2 -3
- data/tracks/python/exercises/meetup/meetup_test.py +1 -2
- data/tracks/python/exercises/minesweeper/README.md +2 -4
- data/tracks/python/exercises/nth-prime/README.md +2 -3
- data/tracks/python/exercises/nucleotide-count/README.md +2 -3
- data/tracks/python/exercises/ocr-numbers/README.md +2 -3
- data/tracks/python/exercises/octal/README.md +2 -3
- data/tracks/python/exercises/palindrome-products/README.md +2 -3
- data/tracks/python/exercises/pangram/README.md +2 -3
- data/tracks/python/exercises/pangram/pangram_test.py +1 -1
- data/tracks/python/exercises/parallel-letter-frequency/README.md +2 -4
- data/tracks/python/exercises/pascals-triangle/README.md +2 -3
- data/tracks/python/exercises/perfect-numbers/README.md +2 -3
- data/tracks/python/exercises/phone-number/README.md +2 -3
- data/tracks/python/exercises/pig-latin/README.md +2 -3
- data/tracks/python/exercises/pig-latin/pig_latin_test.py +1 -1
- data/tracks/python/exercises/point-mutations/README.md +2 -3
- data/tracks/python/exercises/poker/README.md +2 -3
- data/tracks/python/exercises/pov/README.md +2 -5
- data/tracks/python/exercises/prime-factors/README.md +2 -3
- data/tracks/python/exercises/prime-factors/prime_factors_test.py +1 -1
- data/tracks/python/exercises/protein-translation/README.md +4 -5
- data/tracks/python/exercises/proverb/README.md +2 -2
- data/tracks/python/exercises/pythagorean-triplet/README.md +2 -3
- data/tracks/python/exercises/queen-attack/README.md +2 -3
- data/tracks/python/exercises/rail-fence-cipher/README.md +2 -3
- data/tracks/python/exercises/rail-fence-cipher/rail_fence_cipher.py +2 -6
- data/tracks/python/exercises/raindrops/README.md +2 -3
- data/tracks/python/exercises/react/README.md +2 -4
- data/tracks/python/exercises/rectangles/README.md +2 -4
- data/tracks/python/exercises/reverse-string/README.md +28 -0
- data/tracks/python/exercises/reverse-string/reverse_string_test.py +1 -1
- data/tracks/python/exercises/rna-transcription/README.md +3 -4
- data/tracks/python/exercises/rna-transcription/rna_transcription_test.py +3 -25
- data/tracks/python/exercises/robot-name/README.md +2 -3
- data/tracks/python/exercises/robot-simulator/README.md +2 -3
- data/tracks/python/exercises/robot-simulator/robot_simulator_test.py +1 -1
- data/tracks/python/exercises/roman-numerals/README.md +2 -3
- data/tracks/python/exercises/rotational-cipher/README.md +2 -3
- data/tracks/python/exercises/rotational-cipher/rotational_cipher_test.py +1 -1
- data/tracks/python/exercises/run-length-encoding/README.md +2 -3
- data/tracks/python/exercises/saddle-points/README.md +2 -3
- data/tracks/python/exercises/say/README.md +2 -3
- data/tracks/python/exercises/say/say_test.py +1 -1
- data/tracks/python/exercises/scale-generator/README.md +2 -4
- data/tracks/python/exercises/scrabble-score/README.md +2 -3
- data/tracks/python/exercises/scrabble-score/scrabble_score_test.py +1 -1
- data/tracks/python/exercises/secret-handshake/README.md +3 -4
- data/tracks/python/exercises/series/README.md +2 -3
- data/tracks/python/exercises/sieve/README.md +2 -3
- data/tracks/python/exercises/sieve/sieve_test.py +1 -1
- data/tracks/python/exercises/simple-cipher/README.md +6 -9
- data/tracks/python/exercises/simple-linked-list/README.md +2 -3
- data/tracks/python/exercises/space-age/README.md +2 -3
- data/tracks/python/exercises/space-age/space_age_test.py +1 -1
- data/tracks/python/exercises/spiral-matrix/README.md +20 -8
- data/tracks/python/exercises/strain/README.md +2 -3
- data/tracks/python/exercises/sublist/README.md +2 -4
- data/tracks/python/exercises/sublist/sublist_test.py +1 -1
- data/tracks/python/exercises/sum-of-multiples/README.md +2 -3
- data/tracks/python/exercises/sum-of-multiples/sum_of_multiples_test.py +1 -1
- data/tracks/python/exercises/tournament/README.md +2 -4
- data/tracks/python/exercises/transpose/README.md +2 -3
- data/tracks/python/exercises/tree-building/README.md +2 -4
- data/tracks/python/exercises/triangle/README.md +2 -3
- data/tracks/python/exercises/trinary/README.md +2 -3
- data/tracks/python/exercises/twelve-days/README.md +2 -3
- data/tracks/python/exercises/two-bucket/README.md +2 -3
- data/tracks/python/exercises/two-fer/README.md +3 -4
- data/tracks/python/exercises/variable-length-quantity/README.md +2 -3
- data/tracks/python/exercises/word-count/README.md +2 -3
- data/tracks/python/exercises/word-search/README.md +2 -4
- data/tracks/python/exercises/wordy/README.md +2 -3
- data/tracks/python/exercises/zebra-puzzle/README.md +2 -3
- data/tracks/python/exercises/zipper/README.md +2 -4
- data/tracks/ruby/docs/24pullrequests.md +1 -1
- data/tracks/rust/exercises/robot-name/Cargo-example.toml +6 -0
- data/tracks/rust/exercises/robot-name/Cargo.toml +0 -1
- data/tracks/scala/exercises/beer-song/example.scala +3 -3
- data/tracks/scala/exercises/beer-song/src/test/scala/BeerSongTest.scala +29 -30
- data/tracks/scala/exercises/binary-search/src/test/scala/BinarySearchTest.scala +3 -3
- data/tracks/scala/exercises/book-store/example.scala +1 -1
- data/tracks/scala/exercises/book-store/src/test/scala/BookStoreTest.scala +19 -15
- data/tracks/scala/testgen/src/main/scala/BeerSongTestGenerator.scala +21 -3
- data/tracks/scala/testgen/src/main/scala/BinarySearchTestGenerator.scala +3 -5
- data/tracks/scala/testgen/src/main/scala/BookStoreTestGenerator.scala +3 -3
- data/tracks/swift/.travis.yml +2 -2
- data/tracks/swift/config.json +12 -0
- data/tracks/swift/exercises/scale-generator/Package.swift +5 -0
- data/tracks/swift/exercises/scale-generator/README.md +65 -0
- data/tracks/swift/exercises/scale-generator/Sources/ScaleGenerator.swift +1 -0
- data/tracks/swift/exercises/scale-generator/Sources/ScaleGeneratorExample.swift +78 -0
- data/tracks/swift/exercises/scale-generator/Tests/LinuxMain.swift +6 -0
- data/tracks/swift/exercises/scale-generator/Tests/ScaleGeneratorTests/ScaleGeneratorTests.swift +116 -0
- metadata +197 -101
- data/problem-specifications/exercises/grains/USE_OLD_SCHEMA +0 -0
- data/problem-specifications/exercises/grep/USE_OLD_SCHEMA +0 -0
- data/problem-specifications/exercises/house/USE_OLD_SCHEMA +0 -0
- data/problem-specifications/exercises/isogram/USE_OLD_SCHEMA +0 -0
- data/problem-specifications/exercises/list-ops/USE_OLD_SCHEMA +0 -0
- data/problem-specifications/exercises/pov/USE_OLD_SCHEMA +0 -0
- data/problem-specifications/exercises/trinary/USE_OLD_SCHEMA +0 -0
- data/problem-specifications/exercises/word-search/USE_OLD_SCHEMA +0 -0
- data/problem-specifications/exercises/zipper/USE_OLD_SCHEMA +0 -0
- data/problem-specifications/old-schema.json +0 -137
- data/tracks/c/exercises/bob/.meta/description.md +0 -10
- data/tracks/elm/exercises/bob/.meta/description.md +0 -10
- data/tracks/perl5/exercises/allergies/cases.json +0 -69
- data/tracks/perl5/exercises/anagram/cases.json +0 -56
- data/tracks/perl5/exercises/atbash-cipher/cases.json +0 -75
- data/tracks/perl5/exercises/beer-song/cases.json +0 -74
- data/tracks/perl5/exercises/grains/cases.json +0 -49
- data/tracks/perl5/exercises/linked-list/cases.json +0 -54
- data/tracks/perl5/exercises/pascals-triangle/cases.json +0 -45
- data/tracks/perl5/exercises/point-mutations/cases.json +0 -69
- data/tracks/perl5/exercises/prime-factors/cases.json +0 -57
- data/tracks/perl5/exercises/proverb/cases.json +0 -52
- data/tracks/perl5/exercises/queen-attack/cases.json +0 -182
- data/tracks/perl5/exercises/raindrops/cases.json +0 -83
- data/tracks/perl5/exercises/triangle/cases.json +0 -82
- data/tracks/perl5/exercises/wordy/cases.json +0 -82
- data/tracks/python/docs/EXERCISE_README_INSERT.md +0 -23
|
@@ -6,15 +6,19 @@
|
|
|
6
6
|
|
|
7
7
|
(defun contains-alpha-chars-p (msg)
|
|
8
8
|
(some #'(lambda (c) (char-not-greaterp #\a c #\z))
|
|
9
|
-
|
|
9
|
+
(coerce msg 'list)))
|
|
10
10
|
|
|
11
|
-
(defun silence-p (msg) (equal "" (string-trim '(#\Space) msg)))
|
|
11
|
+
(defun silence-p (msg) (equal "" (string-trim '(#\Space #\Newline #\Tab #\Page) msg)))
|
|
12
12
|
(defun shouting-p (msg) (and (contains-alpha-chars-p msg)
|
|
13
|
-
|
|
14
|
-
(defun questioning-p (msg)
|
|
13
|
+
(equal msg (string-upcase msg))))
|
|
14
|
+
(defun questioning-p (msg)
|
|
15
|
+
(let ((msg (string-trim '(#\Space #\Newline #\Tab #\Page) msg)))
|
|
16
|
+
(equal #\? (char msg (1- (length msg))))))
|
|
15
17
|
|
|
16
18
|
(defun response-for (msg)
|
|
17
19
|
(cond ((silence-p msg) "Fine. Be that way!")
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
((and (shouting-p msg)
|
|
21
|
+
(questioning-p msg)) "Calm down, I know what I'm doing!")
|
|
22
|
+
((shouting-p msg) "Whoa, chill out!")
|
|
23
|
+
((questioning-p msg) "Sure.")
|
|
24
|
+
(t "Whatever.")))
|
|
@@ -15,7 +15,7 @@ as separate command-line tools.
|
|
|
15
15
|
### Prerequisite: A Modern C++11 Compiler
|
|
16
16
|
|
|
17
17
|
This language track requires a compiler with [C++11](http://en.wikipedia.org/wiki/C%2B%2B11)
|
|
18
|
-
support, which was
|
|
18
|
+
support, which was released in 2011. All major compilers released in the last few years should
|
|
19
19
|
be compatible, so as long as you are on a fairly recent version you should be fine.
|
|
20
20
|
Specifically, GCC version 5.1 or later, Clang version 3.8 or later, or Visual
|
|
21
21
|
Studio 2015 or later.
|
|
@@ -32,7 +32,7 @@ defmodule PigLatin do
|
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
defp consonant_prefix_and_rest(word) do
|
|
35
|
-
if Regex.match?(~r/^
|
|
35
|
+
if Regex.match?(~r/^[yx][bcdfghjklmnpqrstvwxy]+/, word) do
|
|
36
36
|
["", word]
|
|
37
37
|
else
|
|
38
38
|
~r/^(s?qu|(?:[^aeiou]*))?([aeiou].*)$/
|
|
@@ -40,4 +40,3 @@ defmodule PigLatin do
|
|
|
40
40
|
end
|
|
41
41
|
end
|
|
42
42
|
end
|
|
43
|
-
|
|
@@ -82,7 +82,7 @@ defmodule PigLatinTest do
|
|
|
82
82
|
end
|
|
83
83
|
end
|
|
84
84
|
|
|
85
|
-
describe "
|
|
85
|
+
describe "consecutive consonants are treated like a single consonant" do
|
|
86
86
|
@tag :pending
|
|
87
87
|
test "word beginning with ch" do
|
|
88
88
|
assert PigLatin.translate("chair") == "airchay"
|
|
@@ -114,16 +114,26 @@ defmodule PigLatinTest do
|
|
|
114
114
|
end
|
|
115
115
|
end
|
|
116
116
|
|
|
117
|
-
describe "
|
|
117
|
+
describe "'x' and 'y', when followed by a consonant, are treated like a vowel" do
|
|
118
118
|
@tag :pending
|
|
119
|
-
test "word beginning with
|
|
119
|
+
test "word beginning with y, followed by a consonant" do
|
|
120
120
|
assert PigLatin.translate("yttria") == "yttriaay"
|
|
121
121
|
end
|
|
122
122
|
|
|
123
|
+
@tag :pending
|
|
124
|
+
test "word beginning with y, followed by another consonant" do
|
|
125
|
+
assert PigLatin.translate("yddria") == "yddriaay"
|
|
126
|
+
end
|
|
127
|
+
|
|
123
128
|
@tag :pending
|
|
124
129
|
test "word beginning with xr" do
|
|
125
130
|
assert PigLatin.translate("xray") == "xrayay"
|
|
126
131
|
end
|
|
132
|
+
|
|
133
|
+
@tag :pending
|
|
134
|
+
test "word beginning with xb" do
|
|
135
|
+
assert PigLatin.translate("xbot") == "xbotay"
|
|
136
|
+
end
|
|
127
137
|
end
|
|
128
138
|
|
|
129
139
|
describe "phrases are translated" do
|
|
@@ -133,4 +143,3 @@ defmodule PigLatinTest do
|
|
|
133
143
|
end
|
|
134
144
|
end
|
|
135
145
|
end
|
|
136
|
-
|
data/tracks/elm/config.json
CHANGED
|
@@ -323,7 +323,7 @@
|
|
|
323
323
|
]
|
|
324
324
|
},
|
|
325
325
|
{
|
|
326
|
-
"uuid": "
|
|
326
|
+
"uuid": "0edd5fa2-f1db-4572-9810-55a2c6729753",
|
|
327
327
|
"slug": "collatz-conjecture",
|
|
328
328
|
"core": false,
|
|
329
329
|
"unlocked_by": null,
|
|
@@ -333,7 +333,7 @@
|
|
|
333
333
|
]
|
|
334
334
|
},
|
|
335
335
|
{
|
|
336
|
-
"uuid": "
|
|
336
|
+
"uuid": "bdb8364b-d8b2-4d58-a824-1035cddedb42",
|
|
337
337
|
"slug": "all-your-base",
|
|
338
338
|
"core": false,
|
|
339
339
|
"unlocked_by": null,
|
|
@@ -343,7 +343,7 @@
|
|
|
343
343
|
]
|
|
344
344
|
},
|
|
345
345
|
{
|
|
346
|
-
"uuid": "
|
|
346
|
+
"uuid": "b7e456d7-e383-4e03-9126-c9b57c1287e1",
|
|
347
347
|
"slug": "pascals-triangle",
|
|
348
348
|
"core": false,
|
|
349
349
|
"unlocked_by": null,
|
|
@@ -354,7 +354,7 @@
|
|
|
354
354
|
]
|
|
355
355
|
},
|
|
356
356
|
{
|
|
357
|
-
"uuid": "
|
|
357
|
+
"uuid": "6b6e9f4d-9c45-4d8c-9e8e-b2144204d2da",
|
|
358
358
|
"slug": "isogram",
|
|
359
359
|
"core": false,
|
|
360
360
|
"unlocked_by": null,
|
|
@@ -6,7 +6,9 @@ import String
|
|
|
6
6
|
|
|
7
7
|
hey : String -> String
|
|
8
8
|
hey remark =
|
|
9
|
-
if isShouting remark then
|
|
9
|
+
if isShouting remark && isQuestion remark then
|
|
10
|
+
"Calm down, I know what I'm doing!"
|
|
11
|
+
else if isShouting remark then
|
|
10
12
|
"Whoa, chill out!"
|
|
11
13
|
else if isQuestion remark then
|
|
12
14
|
"Sure."
|
|
@@ -6,6 +6,8 @@ Bob answers 'Sure.' if you ask him a question.
|
|
|
6
6
|
|
|
7
7
|
He answers 'Whoa, chill out!' if you yell at him.
|
|
8
8
|
|
|
9
|
+
He answers 'Calm down, I know what I'm doing!' if you yell a question at him.
|
|
10
|
+
|
|
9
11
|
He says 'Fine. Be that way!' if you address him without actually saying
|
|
10
12
|
anything.
|
|
11
13
|
|
|
@@ -1,28 +1,43 @@
|
|
|
1
1
|
module PhoneNumber exposing (..)
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import List exposing (head, map)
|
|
4
|
+
import Maybe exposing (andThen)
|
|
5
|
+
import Regex exposing (HowMany(..), Regex, find, regex)
|
|
6
|
+
import String exposing (concat, length, slice, startsWith)
|
|
4
7
|
|
|
5
8
|
|
|
6
|
-
|
|
7
|
-
|
|
9
|
+
matchesFormat : Regex -> String -> Bool
|
|
10
|
+
matchesFormat regex string =
|
|
11
|
+
case find (AtMost 1) regex string |> head of
|
|
12
|
+
Just found ->
|
|
13
|
+
True
|
|
8
14
|
|
|
15
|
+
Nothing ->
|
|
16
|
+
False
|
|
9
17
|
|
|
10
|
-
getNumber : String -> Maybe String
|
|
11
|
-
getNumber text =
|
|
12
|
-
getValidNum (String.filter isDigit text)
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
isDigit : Char -> Bool
|
|
16
|
-
isDigit char =
|
|
17
|
-
List.any (\n -> n == char) nums
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
19
|
+
getNumber : String -> Maybe String
|
|
20
|
+
getNumber phoneNumber =
|
|
21
|
+
let
|
|
22
|
+
numberFormat =
|
|
23
|
+
regex "^\\D*(\\+?1\\s*[\\-\\.]?\\s*)?((\\([2-9]\\d{2}\\))|([2-9]\\d{2}))\\s*[\\-\\.]?\\s*[2-9]\\d{2}\\s*[\\-\\.]?\\s*\\d{4}\\D*$"
|
|
24
|
+
|
|
25
|
+
numbers =
|
|
26
|
+
regex "\\d"
|
|
27
|
+
|
|
28
|
+
dropCountryCode matchedNumbers =
|
|
29
|
+
case matchedNumbers of
|
|
30
|
+
"1" :: nums ->
|
|
31
|
+
nums
|
|
32
|
+
|
|
33
|
+
_ ->
|
|
34
|
+
matchedNumbers
|
|
35
|
+
|
|
36
|
+
stripNumber =
|
|
37
|
+
concat << dropCountryCode << map .match << find All numbers
|
|
38
|
+
in
|
|
39
|
+
if phoneNumber |> matchesFormat numberFormat then
|
|
40
|
+
Just <| stripNumber <| phoneNumber
|
|
26
41
|
else
|
|
27
42
|
Nothing
|
|
28
43
|
|
|
@@ -9,38 +9,59 @@ tests : Test
|
|
|
9
9
|
tests =
|
|
10
10
|
describe "PhoneNumber"
|
|
11
11
|
[ test "cleans number" <|
|
|
12
|
-
\() -> Expect.equal (Just "
|
|
12
|
+
\() -> Expect.equal (Just "2234567890") (getNumber "(223) 456-7890")
|
|
13
|
+
, skip <|
|
|
14
|
+
test "invalid when empty" <|
|
|
15
|
+
\() -> Expect.equal Nothing (getNumber "")
|
|
13
16
|
, skip <|
|
|
14
17
|
test "cleans number with dots" <|
|
|
15
|
-
\() -> Expect.equal (Just "
|
|
18
|
+
\() -> Expect.equal (Just "2234567890") (getNumber "223.456.7890")
|
|
19
|
+
, skip <|
|
|
20
|
+
test "invalid when 9 digits" <|
|
|
21
|
+
\() -> Expect.equal Nothing (getNumber "223456789")
|
|
22
|
+
, skip <|
|
|
23
|
+
test "cleans number with multiple spaces" <|
|
|
24
|
+
\() -> Expect.equal (Just "2234567890") (getNumber "223 456 7890")
|
|
25
|
+
, skip <|
|
|
26
|
+
test "invalid when 12 digits" <|
|
|
27
|
+
\() -> Expect.equal Nothing (getNumber "223456789012")
|
|
16
28
|
, skip <|
|
|
17
29
|
test "valid when 11 digits and first is 1" <|
|
|
18
|
-
\() -> Expect.equal (Just "
|
|
30
|
+
\() -> Expect.equal (Just "2234567890") (getNumber "12234567890")
|
|
19
31
|
, skip <|
|
|
20
|
-
test "invalid when 11 digits" <|
|
|
21
|
-
\() -> Expect.equal Nothing (getNumber "
|
|
32
|
+
test "invalid when 11 digits and first is not 1" <|
|
|
33
|
+
\() -> Expect.equal Nothing (getNumber "22234567890")
|
|
22
34
|
, skip <|
|
|
23
|
-
test "
|
|
24
|
-
\() -> Expect.equal
|
|
35
|
+
test "valid when 11 digits and first is 1 with punctuation" <|
|
|
36
|
+
\() -> Expect.equal (Just "2234567890") (getNumber "+1 (223) 456-7890")
|
|
25
37
|
, skip <|
|
|
26
|
-
test "invalid
|
|
27
|
-
\() -> Expect.equal Nothing (getNumber "
|
|
38
|
+
test "invalid with letters" <|
|
|
39
|
+
\() -> Expect.equal Nothing (getNumber "223-abc-789012")
|
|
28
40
|
, skip <|
|
|
29
|
-
test "invalid
|
|
30
|
-
\() -> Expect.equal Nothing (getNumber "")
|
|
41
|
+
test "invalid with multiple punctuation marks" <|
|
|
42
|
+
\() -> Expect.equal Nothing (getNumber "223-@:!-789012")
|
|
31
43
|
, skip <|
|
|
32
|
-
test "invalid when
|
|
33
|
-
\() -> Expect.equal Nothing (getNumber "
|
|
44
|
+
test "invalid when area code starts with 1" <|
|
|
45
|
+
\() -> Expect.equal Nothing (getNumber "(123) 456-7890")
|
|
46
|
+
, skip <|
|
|
47
|
+
test "invalid when area code starts with 0" <|
|
|
48
|
+
\() -> Expect.equal Nothing (getNumber "(023) 456-7890")
|
|
34
49
|
, skip <|
|
|
35
|
-
test "
|
|
36
|
-
\() -> Expect.equal
|
|
50
|
+
test "invalid when exchange code starts with 1" <|
|
|
51
|
+
\() -> Expect.equal Nothing (getNumber "(223) 156-7890")
|
|
37
52
|
, skip <|
|
|
38
|
-
test "
|
|
39
|
-
\() -> Expect.equal
|
|
53
|
+
test "invalid when exchange code starts with 0" <|
|
|
54
|
+
\() -> Expect.equal Nothing (getNumber "(223) 056-7890")
|
|
55
|
+
, skip <|
|
|
56
|
+
test "invalid when N in exchange code is 1" <|
|
|
57
|
+
\() -> Expect.equal Nothing (getNumber "2341567890")
|
|
58
|
+
, skip <|
|
|
59
|
+
test "invalid when no digits present" <|
|
|
60
|
+
\() -> Expect.equal Nothing (getNumber " (-) ")
|
|
40
61
|
, skip <|
|
|
41
62
|
test "pretty print" <|
|
|
42
|
-
\() -> Expect.equal (Just "(
|
|
63
|
+
\() -> Expect.equal (Just "(223) 456-7890") (prettyPrint "2234567890")
|
|
43
64
|
, skip <|
|
|
44
65
|
test "pretty print with full us phone number" <|
|
|
45
|
-
\() -> Expect.equal (Just "(
|
|
66
|
+
\() -> Expect.equal (Just "(223) 456-7890") (prettyPrint "12234567890")
|
|
46
67
|
]
|
|
@@ -9,26 +9,26 @@ tests : Test
|
|
|
9
9
|
tests =
|
|
10
10
|
describe "SpaceAge"
|
|
11
11
|
[ test "age in earth years" <|
|
|
12
|
-
\() -> Expect.equal 32 (round (ageOn Earth 1000000000))
|
|
12
|
+
\() -> Expect.equal 32 (round (ageOn Earth 1000000000.0))
|
|
13
13
|
, skip <|
|
|
14
14
|
test "age in mercury years" <|
|
|
15
|
-
\() -> Expect.equal 281 (round (ageOn Mercury 2134835688))
|
|
15
|
+
\() -> Expect.equal 281 (round (ageOn Mercury 2134835688.0))
|
|
16
16
|
, skip <|
|
|
17
17
|
test "age in venus years" <|
|
|
18
|
-
\() -> Expect.equal 10 (round (ageOn Venus 189839836))
|
|
18
|
+
\() -> Expect.equal 10 (round (ageOn Venus 189839836.0))
|
|
19
19
|
, skip <|
|
|
20
20
|
test "age on mars" <|
|
|
21
|
-
\() -> Expect.equal 39 (round (ageOn Mars 2329871239))
|
|
21
|
+
\() -> Expect.equal 39 (round (ageOn Mars 2329871239.0))
|
|
22
22
|
, skip <|
|
|
23
23
|
test "age on jupiter" <|
|
|
24
|
-
\() -> Expect.equal 2 (round (ageOn Jupiter 901876382))
|
|
24
|
+
\() -> Expect.equal 2 (round (ageOn Jupiter 901876382.0))
|
|
25
25
|
, skip <|
|
|
26
26
|
test "age on saturn" <|
|
|
27
|
-
\() -> Expect.equal 3 (round (ageOn Saturn 3000000000))
|
|
27
|
+
\() -> Expect.equal 3 (round (ageOn Saturn 3000000000.0))
|
|
28
28
|
, skip <|
|
|
29
29
|
test "age on uranus" <|
|
|
30
|
-
\() -> Expect.equal 1 (round (ageOn Uranus 3210123456))
|
|
30
|
+
\() -> Expect.equal 1 (round (ageOn Uranus 3210123456.0))
|
|
31
31
|
, skip <|
|
|
32
32
|
test "age on neptune" <|
|
|
33
|
-
\() -> Expect.equal 2 (round (ageOn Neptune 8210123456))
|
|
33
|
+
\() -> Expect.equal 2 (round (ageOn Neptune 8210123456.0))
|
|
34
34
|
]
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// This file was auto-generated based on version 2.
|
|
1
|
+
// This file was auto-generated based on version 2.3.0 of the canonical data.
|
|
2
2
|
|
|
3
3
|
module AllYourBaseTest
|
|
4
4
|
|
|
@@ -105,7 +105,7 @@ let ``Leading zeros`` () =
|
|
|
105
105
|
|
|
106
106
|
[<Fact(Skip = "Remove to run test")>]
|
|
107
107
|
let ``Input base is one`` () =
|
|
108
|
-
let digits = []
|
|
108
|
+
let digits = [0]
|
|
109
109
|
let inputBase = 1
|
|
110
110
|
let outputBase = 10
|
|
111
111
|
let expected = None
|
|
@@ -4,12 +4,8 @@ let left node = failwith "You need to implement this function."
|
|
|
4
4
|
|
|
5
5
|
let right node = failwith "You need to implement this function."
|
|
6
6
|
|
|
7
|
-
let
|
|
7
|
+
let data node = failwith "You need to implement this function."
|
|
8
8
|
|
|
9
|
-
let
|
|
9
|
+
let create items = failwith "You need to implement this function."
|
|
10
10
|
|
|
11
|
-
let
|
|
12
|
-
|
|
13
|
-
let toList tree = failwith "You need to implement this function."
|
|
14
|
-
|
|
15
|
-
let fromList xs = failwith "You need to implement this function."
|
|
11
|
+
let sortedData node = failwith "You need to implement this function."
|
|
@@ -1,61 +1,87 @@
|
|
|
1
|
-
// This file was
|
|
1
|
+
// This file was auto-generated based on version 1.0.0 of the canonical data.
|
|
2
2
|
|
|
3
3
|
module BinarySearchTreeTest
|
|
4
4
|
|
|
5
|
-
open Xunit
|
|
6
5
|
open FsUnit.Xunit
|
|
6
|
+
open Xunit
|
|
7
|
+
|
|
7
8
|
open BinarySearchTree
|
|
8
9
|
|
|
9
10
|
[<Fact>]
|
|
10
11
|
let ``Data is retained`` () =
|
|
11
|
-
let
|
|
12
|
-
|
|
12
|
+
let treeData = create [4]
|
|
13
|
+
treeData |> data |> should equal 4
|
|
14
|
+
treeData |> left |> should equal None
|
|
15
|
+
treeData |> right |> should equal None
|
|
13
16
|
|
|
14
17
|
[<Fact(Skip = "Remove to run test")>]
|
|
15
|
-
let ``
|
|
16
|
-
let
|
|
17
|
-
|
|
18
|
-
|
|
18
|
+
let ``Can create complex tree`` () =
|
|
19
|
+
let treeData = create [4; 2; 6; 1; 3; 5; 7]
|
|
20
|
+
treeData |> data |> should equal 4
|
|
21
|
+
treeData |> left |> Option.map data |> should equal (Some 2)
|
|
22
|
+
treeData |> left |> Option.bind left |> Option.map data |> should equal (Some 1)
|
|
23
|
+
treeData |> left |> Option.bind left |> Option.bind left |> should equal None
|
|
24
|
+
treeData |> left |> Option.bind left |> Option.bind right |> should equal None
|
|
25
|
+
treeData |> left |> Option.bind right |> Option.map data |> should equal (Some 3)
|
|
26
|
+
treeData |> left |> Option.bind right |> Option.bind left |> should equal None
|
|
27
|
+
treeData |> left |> Option.bind right |> Option.bind right |> should equal None
|
|
28
|
+
treeData |> right |> Option.map data |> should equal (Some 6)
|
|
29
|
+
treeData |> right |> Option.bind left |> Option.map data |> should equal (Some 5)
|
|
30
|
+
treeData |> right |> Option.bind left |> Option.bind left |> should equal None
|
|
31
|
+
treeData |> right |> Option.bind left |> Option.bind right |> should equal None
|
|
32
|
+
treeData |> right |> Option.bind right |> Option.map data |> should equal (Some 7)
|
|
33
|
+
treeData |> right |> Option.bind right |> Option.bind left |> should equal None
|
|
34
|
+
treeData |> right |> Option.bind right |> Option.bind right |> should equal None
|
|
19
35
|
|
|
20
36
|
[<Fact(Skip = "Remove to run test")>]
|
|
21
|
-
let ``
|
|
22
|
-
let
|
|
23
|
-
|
|
24
|
-
|
|
37
|
+
let ``Smaller number at left node`` () =
|
|
38
|
+
let treeData = create [4; 2]
|
|
39
|
+
treeData |> data |> should equal 4
|
|
40
|
+
treeData |> left |> Option.map data |> should equal (Some 2)
|
|
41
|
+
treeData |> left |> Option.bind left |> should equal None
|
|
42
|
+
treeData |> left |> Option.bind right |> should equal None
|
|
43
|
+
treeData |> right |> should equal None
|
|
25
44
|
|
|
26
45
|
[<Fact(Skip = "Remove to run test")>]
|
|
27
|
-
let ``
|
|
28
|
-
let
|
|
29
|
-
|
|
30
|
-
|
|
46
|
+
let ``Same number at left node`` () =
|
|
47
|
+
let treeData = create [4; 4]
|
|
48
|
+
treeData |> data |> should equal 4
|
|
49
|
+
treeData |> left |> Option.map data |> should equal (Some 4)
|
|
50
|
+
treeData |> left |> Option.bind left |> should equal None
|
|
51
|
+
treeData |> left |> Option.bind right |> should equal None
|
|
52
|
+
treeData |> right |> should equal None
|
|
31
53
|
|
|
32
54
|
[<Fact(Skip = "Remove to run test")>]
|
|
33
|
-
let ``
|
|
34
|
-
let
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
tree |> right |> Option.bind (fun x -> x |> left) |> Option.bind value |> should equal <| Some 5
|
|
41
|
-
tree |> right |> Option.bind (fun x -> x |> right) |> Option.bind value |> should equal <| Some 7
|
|
55
|
+
let ``Greater number at right node`` () =
|
|
56
|
+
let treeData = create [4; 5]
|
|
57
|
+
treeData |> data |> should equal 4
|
|
58
|
+
treeData |> left |> should equal None
|
|
59
|
+
treeData |> right |> Option.map data |> should equal (Some 5)
|
|
60
|
+
treeData |> right |> Option.bind left |> should equal None
|
|
61
|
+
treeData |> right |> Option.bind right |> should equal None
|
|
42
62
|
|
|
43
63
|
[<Fact(Skip = "Remove to run test")>]
|
|
44
|
-
let ``
|
|
45
|
-
let
|
|
46
|
-
|
|
64
|
+
let ``Can sort single number`` () =
|
|
65
|
+
let treeData = create [2]
|
|
66
|
+
sortedData treeData |> should equal [2]
|
|
47
67
|
|
|
48
68
|
[<Fact(Skip = "Remove to run test")>]
|
|
49
|
-
let ``
|
|
50
|
-
let
|
|
51
|
-
|
|
69
|
+
let ``Can sort if second number is smaller than first`` () =
|
|
70
|
+
let treeData = create [2; 1]
|
|
71
|
+
sortedData treeData |> should equal [1; 2]
|
|
52
72
|
|
|
53
73
|
[<Fact(Skip = "Remove to run test")>]
|
|
54
|
-
let ``
|
|
55
|
-
let
|
|
56
|
-
|
|
74
|
+
let ``Can sort if second number is same as first`` () =
|
|
75
|
+
let treeData = create [2; 2]
|
|
76
|
+
sortedData treeData |> should equal [2; 2]
|
|
57
77
|
|
|
58
78
|
[<Fact(Skip = "Remove to run test")>]
|
|
59
|
-
let ``
|
|
60
|
-
let
|
|
61
|
-
|
|
79
|
+
let ``Can sort if second number is greater than first`` () =
|
|
80
|
+
let treeData = create [2; 3]
|
|
81
|
+
sortedData treeData |> should equal [2; 3]
|
|
82
|
+
|
|
83
|
+
[<Fact(Skip = "Remove to run test")>]
|
|
84
|
+
let ``Can sort complex tree`` () =
|
|
85
|
+
let treeData = create [2; 1; 3; 6; 7; 5]
|
|
86
|
+
sortedData treeData |> should equal [1; 2; 3; 5; 6; 7]
|
|
87
|
+
|
|
@@ -4,11 +4,11 @@ type Node = { left: Node option; value: int; right: Node option }
|
|
|
4
4
|
|
|
5
5
|
let left node = node.left
|
|
6
6
|
let right node = node.right
|
|
7
|
-
let
|
|
7
|
+
let data node = node.value
|
|
8
8
|
|
|
9
|
-
let singleton value = { left = None; right = None; value = value }
|
|
9
|
+
let private singleton value = { left = None; right = None; value = value }
|
|
10
10
|
|
|
11
|
-
let rec insert newValue (tree: Node) =
|
|
11
|
+
let rec private insert newValue (tree: Node) =
|
|
12
12
|
let loop newValue =
|
|
13
13
|
function
|
|
14
14
|
| Some x -> Some <| insert newValue x
|
|
@@ -20,7 +20,7 @@ let rec insert newValue (tree: Node) =
|
|
|
20
20
|
| _ ->
|
|
21
21
|
{ tree with right = loop newValue tree.right }
|
|
22
22
|
|
|
23
|
-
let
|
|
23
|
+
let sortedData tree =
|
|
24
24
|
let rec loop =
|
|
25
25
|
function
|
|
26
26
|
| Some node -> loop node.left @ [node.value] @ loop node.right
|
|
@@ -28,7 +28,7 @@ let toList tree =
|
|
|
28
28
|
|
|
29
29
|
loop <| Some tree
|
|
30
30
|
|
|
31
|
-
let
|
|
31
|
+
let create =
|
|
32
32
|
function
|
|
33
33
|
| [] -> failwith "Cannot create tree from empty list."
|
|
34
34
|
| x::xs -> List.fold (fun acc elem -> insert elem acc) (singleton x) xs
|
|
@@ -12,7 +12,6 @@ open CircularBuffer
|
|
|
12
12
|
let ``Reading empty buffer should fail`` () =
|
|
13
13
|
let buffer1 = mkCircularBuffer 1
|
|
14
14
|
(fun () -> read buffer1 |> ignore) |> should throw typeof<Exception>
|
|
15
|
-
|
|
16
15
|
|
|
17
16
|
[<Fact(Skip = "Remove to run test")>]
|
|
18
17
|
let ``Can read an item just written`` () =
|
|
@@ -20,7 +19,6 @@ let ``Can read an item just written`` () =
|
|
|
20
19
|
let buffer2 = write 1 buffer1
|
|
21
20
|
let (val3, _) = read buffer2
|
|
22
21
|
val3 |> should equal 1
|
|
23
|
-
|
|
24
22
|
|
|
25
23
|
[<Fact(Skip = "Remove to run test")>]
|
|
26
24
|
let ``Each item may only be read once`` () =
|
|
@@ -29,7 +27,6 @@ let ``Each item may only be read once`` () =
|
|
|
29
27
|
let (val3, buffer3) = read buffer2
|
|
30
28
|
val3 |> should equal 1
|
|
31
29
|
(fun () -> read buffer3 |> ignore) |> should throw typeof<Exception>
|
|
32
|
-
|
|
33
30
|
|
|
34
31
|
[<Fact(Skip = "Remove to run test")>]
|
|
35
32
|
let ``Items are read in the order they are written`` () =
|
|
@@ -40,14 +37,12 @@ let ``Items are read in the order they are written`` () =
|
|
|
40
37
|
val4 |> should equal 1
|
|
41
38
|
let (val5, _) = read buffer4
|
|
42
39
|
val5 |> should equal 2
|
|
43
|
-
|
|
44
40
|
|
|
45
41
|
[<Fact(Skip = "Remove to run test")>]
|
|
46
42
|
let ``Full buffer can't be written to`` () =
|
|
47
43
|
let buffer1 = mkCircularBuffer 1
|
|
48
44
|
let buffer2 = write 1 buffer1
|
|
49
45
|
(fun () -> write 2 buffer2 |> ignore) |> should throw typeof<Exception>
|
|
50
|
-
|
|
51
46
|
|
|
52
47
|
[<Fact(Skip = "Remove to run test")>]
|
|
53
48
|
let ``A read frees up capacity for another write`` () =
|
|
@@ -58,7 +53,6 @@ let ``A read frees up capacity for another write`` () =
|
|
|
58
53
|
let buffer4 = write 2 buffer3
|
|
59
54
|
let (val5, _) = read buffer4
|
|
60
55
|
val5 |> should equal 2
|
|
61
|
-
|
|
62
56
|
|
|
63
57
|
[<Fact(Skip = "Remove to run test")>]
|
|
64
58
|
let ``Read position is maintained even across multiple writes`` () =
|
|
@@ -72,7 +66,6 @@ let ``Read position is maintained even across multiple writes`` () =
|
|
|
72
66
|
val6 |> should equal 2
|
|
73
67
|
let (val7, _) = read buffer6
|
|
74
68
|
val7 |> should equal 3
|
|
75
|
-
|
|
76
69
|
|
|
77
70
|
[<Fact(Skip = "Remove to run test")>]
|
|
78
71
|
let ``Items cleared out of buffer can't be read`` () =
|
|
@@ -80,7 +73,6 @@ let ``Items cleared out of buffer can't be read`` () =
|
|
|
80
73
|
let buffer2 = write 1 buffer1
|
|
81
74
|
let buffer3 = clear buffer2
|
|
82
75
|
(fun () -> read buffer3 |> ignore) |> should throw typeof<Exception>
|
|
83
|
-
|
|
84
76
|
|
|
85
77
|
[<Fact(Skip = "Remove to run test")>]
|
|
86
78
|
let ``Clear frees up capacity for another write`` () =
|
|
@@ -90,7 +82,6 @@ let ``Clear frees up capacity for another write`` () =
|
|
|
90
82
|
let buffer4 = write 2 buffer3
|
|
91
83
|
let (val5, _) = read buffer4
|
|
92
84
|
val5 |> should equal 2
|
|
93
|
-
|
|
94
85
|
|
|
95
86
|
[<Fact(Skip = "Remove to run test")>]
|
|
96
87
|
let ``Clear does nothing on empty buffer`` () =
|
|
@@ -99,7 +90,6 @@ let ``Clear does nothing on empty buffer`` () =
|
|
|
99
90
|
let buffer3 = write 1 buffer2
|
|
100
91
|
let (val4, _) = read buffer3
|
|
101
92
|
val4 |> should equal 1
|
|
102
|
-
|
|
103
93
|
|
|
104
94
|
[<Fact(Skip = "Remove to run test")>]
|
|
105
95
|
let ``Overwrite acts like write on non-full buffer`` () =
|
|
@@ -110,7 +100,6 @@ let ``Overwrite acts like write on non-full buffer`` () =
|
|
|
110
100
|
val4 |> should equal 1
|
|
111
101
|
let (val5, _) = read buffer4
|
|
112
102
|
val5 |> should equal 2
|
|
113
|
-
|
|
114
103
|
|
|
115
104
|
[<Fact(Skip = "Remove to run test")>]
|
|
116
105
|
let ``Overwrite replaces the oldest item on full buffer`` () =
|
|
@@ -122,7 +111,6 @@ let ``Overwrite replaces the oldest item on full buffer`` () =
|
|
|
122
111
|
val5 |> should equal 2
|
|
123
112
|
let (val6, _) = read buffer5
|
|
124
113
|
val6 |> should equal 3
|
|
125
|
-
|
|
126
114
|
|
|
127
115
|
[<Fact(Skip = "Remove to run test")>]
|
|
128
116
|
let ``Overwrite replaces the oldest item remaining in buffer following a read`` () =
|
|
@@ -140,5 +128,4 @@ let ``Overwrite replaces the oldest item remaining in buffer following a read``
|
|
|
140
128
|
val9 |> should equal 4
|
|
141
129
|
let (val10, _) = read buffer9
|
|
142
130
|
val10 |> should equal 5
|
|
143
|
-
|
|
144
131
|
|