trackler 2.2.1.45 → 2.2.1.46
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/complex-numbers/description.md +27 -0
- data/problem-specifications/exercises/crypto-square/canonical-data.json +39 -43
- data/problem-specifications/exercises/crypto-square/description.md +6 -4
- data/problem-specifications/exercises/hamming/canonical-data.json +5 -5
- data/problem-specifications/exercises/kindergarten-garden/description.md +10 -10
- data/problem-specifications/exercises/leap/canonical-data.json +2 -2
- data/problem-specifications/exercises/markdown/canonical-data.json +2 -2
- data/problem-specifications/exercises/nucleotide-count/canonical-data.json +12 -1
- data/problem-specifications/exercises/pangram/canonical-data.json +7 -1
- data/problem-specifications/exercises/queen-attack/canonical-data.json +83 -26
- data/problem-specifications/exercises/space-age/description.md +1 -2
- data/problem-specifications/exercises/zipper/canonical-data.json +671 -0
- data/tracks/bash/config.json +13 -1
- data/tracks/bash/exercises/atbash-cipher/README.md +45 -0
- data/tracks/bash/exercises/atbash-cipher/atbash_cipher_tests.sh +73 -0
- data/tracks/bash/exercises/atbash-cipher/example.sh +14 -0
- data/tracks/bash/exercises/gigasecond/.meta/hints.md +33 -0
- data/tracks/bash/exercises/two-fer/README.md +0 -22
- data/tracks/c/exercises/allergies/src/allergies.h +9 -9
- data/tracks/c/exercises/allergies/src/example.c +2 -2
- data/tracks/c/exercises/allergies/src/example.h +9 -9
- data/tracks/c/exercises/allergies/test/test_allergies.c +34 -34
- data/tracks/c/exercises/clock/test/test_clock.c +0 -52
- data/tracks/c/exercises/meetup/test/test_meetup.c +604 -114
- data/tracks/c/exercises/nucleotide-count/src/example.c +10 -10
- data/tracks/c/exercises/palindrome-products/src/example.c +8 -8
- data/tracks/c/exercises/palindrome-products/src/example.h +5 -5
- data/tracks/c/exercises/palindrome-products/test/test_palindrome_products.c +8 -6
- data/tracks/c/exercises/robot-simulator/src/example.c +19 -19
- data/tracks/c/exercises/robot-simulator/src/robot_simulator.h +24 -24
- data/tracks/c/exercises/robot-simulator/test/test_robot_simulator.c +35 -34
- data/tracks/c/exercises/series/src/example.c +10 -10
- data/tracks/c/exercises/series/src/series.h +5 -5
- data/tracks/c/exercises/series/test/test_series.c +77 -30
- data/tracks/c/exercises/sieve/src/example.c +17 -17
- data/tracks/c/exercises/sieve/src/sieve.h +2 -2
- data/tracks/c/exercises/sieve/test/test_sieve.c +6 -6
- data/tracks/c/exercises/space-age/src/example.c +1 -1
- data/tracks/c/exercises/space-age/src/example.h +3 -3
- data/tracks/c/exercises/space-age/test/test_space_age.c +2 -0
- data/tracks/c/exercises/sum-of-multiples/src/example.c +3 -1
- data/tracks/c/exercises/sum-of-multiples/test/test_sum_of_multiples.c +17 -0
- data/tracks/c/exercises/triangle/src/example.c +4 -4
- data/tracks/c/exercises/triangle/src/example.h +4 -4
- data/tracks/c/exercises/triangle/src/triangle.h +1 -1
- data/tracks/c/exercises/triangle/test/test_triangle.c +18 -16
- data/tracks/c/exercises/word-count/src/example.c +24 -24
- data/tracks/c/exercises/word-count/src/word_count.h +3 -3
- data/tracks/c/exercises/word-count/test/test_word_count.c +139 -139
- data/tracks/cfml/exercises/acronym/README.md +31 -0
- data/tracks/cfml/exercises/atbash-cipher/README.md +50 -0
- data/tracks/cfml/exercises/bob/README.md +34 -0
- data/tracks/cfml/exercises/diamond/README.md +75 -0
- data/tracks/cfml/exercises/difference-of-squares/README.md +35 -0
- data/tracks/cfml/exercises/flatten-array/README.md +34 -0
- data/tracks/cfml/exercises/gigasecond/README.md +27 -0
- data/tracks/cfml/exercises/grains/README.md +50 -0
- data/tracks/cfml/exercises/hamming/README.md +58 -0
- data/tracks/cfml/exercises/hello-world/README.md +37 -0
- data/tracks/cfml/exercises/isogram/README.md +35 -0
- data/tracks/cfml/exercises/largest-series-product/README.md +36 -0
- data/tracks/cfml/exercises/leap/README.md +16 -0
- data/tracks/cfml/exercises/luhn/README.md +87 -0
- data/tracks/cfml/exercises/markdown/README.md +34 -0
- data/tracks/cfml/exercises/nth-prime/README.md +31 -0
- data/tracks/cfml/exercises/pangram/README.md +31 -0
- data/tracks/cfml/exercises/pig-latin/README.md +40 -0
- data/tracks/cfml/exercises/raindrops/README.md +40 -0
- data/tracks/cfml/exercises/rna-transcription/README.md +41 -0
- data/tracks/cfml/exercises/saddle-points/README.md +49 -0
- data/tracks/cfml/exercises/scrabble-score/README.md +60 -0
- data/tracks/cfml/exercises/secret-handshake/README.md +51 -0
- data/tracks/cfml/exercises/space-age/README.md +41 -0
- data/tracks/cfml/exercises/sum-of-multiples/README.md +34 -0
- data/tracks/cfml/exercises/triangle/README.md +42 -0
- data/tracks/cfml/exercises/word-count/README.md +35 -0
- data/tracks/clojure/config.json +10 -0
- data/tracks/clojure/exercises/spiral-matrix/README.md +32 -0
- data/tracks/clojure/exercises/spiral-matrix/project.clj +4 -0
- data/tracks/clojure/exercises/spiral-matrix/src/example.clj +11 -0
- data/tracks/clojure/exercises/spiral-matrix/src/spiral_matrix.clj +3 -0
- data/tracks/clojure/exercises/spiral-matrix/test/spiral_matrix_test.clj +58 -0
- data/tracks/common-lisp/config.json +20 -0
- data/tracks/common-lisp/exercises/hello-world/README.md +68 -0
- data/tracks/common-lisp/exercises/hello-world/example.lisp +9 -0
- data/tracks/common-lisp/exercises/hello-world/hello-world-test.lisp +21 -0
- data/tracks/common-lisp/exercises/hello-world/hello-world.lisp +6 -0
- data/tracks/common-lisp/exercises/perfect-numbers/README.md +72 -0
- data/tracks/common-lisp/exercises/perfect-numbers/example.lisp +17 -0
- data/tracks/common-lisp/exercises/perfect-numbers/perfect-numbers-test.lisp +56 -0
- data/tracks/common-lisp/exercises/perfect-numbers/perfect-numbers.lisp +7 -0
- data/tracks/cpp/.travis.yml +34 -14
- data/tracks/cpp/docs/INSTALLATION.md +17 -28
- data/tracks/cpp/docs/TESTS.md +13 -21
- data/tracks/crystal/config.json +10 -0
- data/tracks/crystal/exercises/triangle/spec/triangle_spec.cr +60 -0
- data/tracks/crystal/exercises/triangle/src/example.cr +31 -0
- data/tracks/crystal/exercises/triangle/src/triangle.cr +1 -0
- data/tracks/crystal/generator/spec/remote_data_file_spec.cr +0 -1
- data/tracks/crystal/generator/src/generators/triangle.cr +38 -0
- data/tracks/crystal/generator/src/remote_data_file.cr +1 -1
- data/tracks/csharp/exercises/difference-of-squares/DifferenceOfSquares.cs +4 -4
- data/tracks/csharp/exercises/difference-of-squares/DifferenceOfSquaresTest.cs +22 -27
- data/tracks/csharp/exercises/difference-of-squares/Example.cs +5 -5
- data/tracks/csharp/exercises/error-handling/ErrorHandlingTest.cs +4 -4
- data/tracks/csharp/exercises/flatten-array/Example.cs +1 -1
- data/tracks/csharp/exercises/flatten-array/FlattenArray.cs +1 -1
- data/tracks/csharp/exercises/flatten-array/FlattenArrayTest.cs +106 -72
- data/tracks/csharp/exercises/largest-series-product/LargestSeriesProductTest.cs +24 -98
- data/tracks/csharp/exercises/minesweeper/Example.cs +3 -3
- data/tracks/csharp/exercises/minesweeper/Minesweeper.cs +1 -1
- data/tracks/csharp/exercises/minesweeper/MinesweeperTest.cs +155 -57
- data/tracks/csharp/generators/Exercises/DifferenceOfSquares.cs +25 -0
- data/tracks/csharp/generators/Exercises/FlattenArray.cs +36 -0
- data/tracks/csharp/generators/Exercises/LargestSeriesProduct.cs +18 -0
- data/tracks/csharp/generators/Exercises/Minesweeper.cs +32 -0
- data/tracks/d/docs/EXERCISE_README_INSERT.md +1 -1
- data/tracks/d/exercises/bob/README.md +1 -1
- data/tracks/d/exercises/circular-buffer/README.md +1 -1
- data/tracks/d/exercises/crypto-square/README.md +1 -1
- data/tracks/d/exercises/difference-of-squares/README.md +1 -1
- data/tracks/d/exercises/etl/README.md +1 -1
- data/tracks/d/exercises/gigasecond/README.md +1 -1
- data/tracks/d/exercises/hamming/README.md +1 -1
- data/tracks/d/exercises/hello-world/README.md +1 -1
- data/tracks/d/exercises/leap/README.md +1 -1
- data/tracks/d/exercises/nucleotide-count/README.md +1 -1
- data/tracks/d/exercises/pangram/README.md +1 -1
- data/tracks/d/exercises/raindrops/README.md +1 -1
- data/tracks/d/exercises/react/README.md +1 -1
- data/tracks/d/exercises/rna-transcription/README.md +1 -1
- data/tracks/d/exercises/robot-name/README.md +1 -1
- data/tracks/d/exercises/roman-numerals/README.md +1 -1
- data/tracks/d/exercises/series/README.md +1 -1
- data/tracks/d/exercises/triangle/README.md +1 -1
- data/tracks/dart/CONTRIBUTING.md +61 -0
- data/tracks/dart/README.md +10 -47
- data/tracks/dart/config.json +13 -1
- data/tracks/dart/exercises/anagram/README.md +10 -0
- data/tracks/dart/exercises/bob/README.md +11 -0
- data/tracks/dart/exercises/difference-of-squares/README.md +11 -0
- data/tracks/dart/exercises/gigasecond/README.md +11 -0
- data/tracks/dart/exercises/gigasecond/test/gigasecond_test.dart +56 -33
- data/tracks/dart/exercises/hamming/README.md +11 -0
- data/tracks/dart/exercises/hamming/lib/example.dart +2 -2
- data/tracks/dart/exercises/hamming/test/hamming_test.dart +41 -24
- data/tracks/dart/exercises/hello-world/README.md +11 -0
- data/tracks/dart/exercises/leap/README.md +12 -1
- data/tracks/dart/exercises/phone-number/README.md +56 -0
- data/tracks/dart/exercises/phone-number/lib/example.dart +45 -0
- data/tracks/dart/exercises/phone-number/lib/phone_number.dart +3 -0
- data/tracks/dart/exercises/phone-number/pubspec.lock +293 -0
- data/tracks/dart/exercises/phone-number/pubspec.yaml +3 -0
- data/tracks/dart/exercises/phone-number/test/phone_number_test.dart +66 -0
- data/tracks/dart/exercises/raindrops/README.md +35 -0
- data/tracks/dart/exercises/rna-transcription/README.md +11 -0
- data/tracks/dart/exercises/word-count/README.md +14 -3
- data/tracks/delphi/docs/RESOURCES.md +10 -11
- data/tracks/elixir/exercises/hello-world/hello_world.exs +1 -1
- data/tracks/elixir/exercises/secret-handshake/README.md +3 -5
- data/tracks/elm/exercises/isogram/Isogram.example.elm +4 -4
- data/tracks/erlang/config.json +10 -0
- data/tracks/erlang/exercises/sieve/README.md +88 -0
- data/tracks/erlang/exercises/sieve/include/exercism.hrl +11 -0
- data/tracks/erlang/exercises/sieve/rebar.config +30 -0
- data/tracks/erlang/exercises/sieve/src/example.erl +16 -0
- data/tracks/erlang/exercises/sieve/src/sieve.app.src +9 -0
- data/tracks/erlang/exercises/sieve/src/sieve.erl +8 -0
- data/tracks/erlang/exercises/sieve/test/sieve_tests.erl +38 -0
- data/tracks/fsharp/.gitignore +2 -1
- data/tracks/fsharp/exercises/crypto-square/CryptoSquareTest.fs +10 -6
- data/tracks/fsharp/exercises/leap/LeapTest.fs +2 -2
- data/tracks/fsharp/exercises/pangram/PangramTest.fs +5 -1
- data/tracks/fsharp/exercises/queen-attack/QueenAttackTest.fs +7 -7
- data/tracks/fsharp/exercises/run-length-encoding/Example.fs +2 -2
- data/tracks/fsharp/exercises/run-length-encoding/RunLengthEncodingTest.fs +42 -30
- data/tracks/fsharp/generators/Generators.fs +21 -8
- data/tracks/gnu-apl/test.apl +4 -4
- data/tracks/go/README.md +1 -2
- data/tracks/go/config/maintainers.json +5 -6
- data/tracks/groovy/config.json +23 -0
- data/tracks/groovy/exercises/binary-search/BinarySearch.groovy +14 -0
- data/tracks/groovy/exercises/binary-search/BinarySearchSpec.groovy +56 -0
- data/tracks/groovy/exercises/binary-search/Example.groovy +43 -0
- data/tracks/groovy/exercises/binary-search/README.md +59 -0
- data/tracks/groovy/exercises/triangle/Example.groovy +23 -0
- data/tracks/groovy/exercises/triangle/README.md +42 -0
- data/tracks/groovy/exercises/triangle/Triangle.groovy +15 -0
- data/tracks/groovy/exercises/triangle/TriangleSpec.groovy +66 -0
- data/tracks/haskell/config.json +9 -0
- data/tracks/haskell/exercises/all-your-base/package.yaml +1 -1
- data/tracks/haskell/exercises/all-your-base/test/Tests.hs +18 -18
- data/tracks/haskell/exercises/bowling/package.yaml +1 -1
- data/tracks/haskell/exercises/bowling/test/Tests.hs +9 -9
- data/tracks/haskell/exercises/change/package.yaml +1 -1
- data/tracks/haskell/exercises/change/test/Tests.hs +5 -0
- data/tracks/haskell/exercises/complex-numbers/README.md +92 -0
- data/tracks/haskell/exercises/complex-numbers/examples/success-standard/package.yaml +16 -0
- data/tracks/haskell/exercises/complex-numbers/examples/success-standard/src/ComplexNumbers.hs +50 -0
- data/tracks/haskell/exercises/complex-numbers/package.yaml +20 -0
- data/tracks/haskell/exercises/complex-numbers/src/ComplexNumbers.hs +45 -0
- data/tracks/haskell/exercises/complex-numbers/stack.yaml +1 -0
- data/tracks/haskell/exercises/complex-numbers/test/Tests.hs +194 -0
- data/tracks/haskell/exercises/crypto-square/package.yaml +1 -1
- data/tracks/haskell/exercises/crypto-square/test/Tests.hs +20 -12
- data/tracks/haskell/exercises/dominoes/package.yaml +1 -1
- data/tracks/haskell/exercises/forth/package.yaml +1 -1
- data/tracks/haskell/exercises/forth/test/Tests.hs +4 -3
- data/tracks/haskell/exercises/hamming/package.yaml +1 -1
- data/tracks/haskell/exercises/hamming/test/Tests.hs +6 -6
- data/tracks/haskell/exercises/isogram/package.yaml +1 -1
- data/tracks/haskell/exercises/isogram/test/Tests.hs +2 -2
- data/tracks/haskell/exercises/leap/package.yaml +1 -1
- data/tracks/haskell/exercises/leap/test/Tests.hs +1 -1
- data/tracks/haskell/exercises/pascals-triangle/package.yaml +1 -1
- data/tracks/haskell/exercises/pig-latin/examples/success-standard/src/PigLatin.hs +2 -0
- data/tracks/haskell/exercises/pig-latin/package.yaml +1 -1
- data/tracks/haskell/exercises/pig-latin/test/Tests.hs +8 -0
- data/tracks/haskell/exercises/queen-attack/package.yaml +1 -1
- data/tracks/haskell/exercises/rna-transcription/package.yaml +1 -1
- data/tracks/haskell/exercises/rna-transcription/test/Tests.hs +8 -8
- data/tracks/haskell/exercises/robot-simulator/package.yaml +1 -1
- data/tracks/haskell/exercises/secret-handshake/package.yaml +1 -1
- data/tracks/haskell/exercises/secret-handshake/test/Tests.hs +0 -3
- data/tracks/haskell/exercises/sum-of-multiples/package.yaml +1 -1
- data/tracks/haskell/exercises/sum-of-multiples/test/Tests.hs +4 -0
- data/tracks/haskell/exercises/zipper/package.yaml +1 -1
- data/tracks/haskell/exercises/zipper/test/Tests.hs +23 -0
- data/tracks/java/config.json +85 -13
- data/tracks/java/config/maintainers.json +1 -1
- data/tracks/java/exercises/accumulate/README.md +0 -3
- data/tracks/java/exercises/acronym/.meta/.version +1 -0
- data/tracks/java/exercises/acronym/README.md +0 -1
- data/tracks/java/exercises/acronym/src/test/java/AcronymTest.java +0 -3
- data/tracks/java/exercises/all-your-base/.meta/.version +1 -0
- data/tracks/java/exercises/all-your-base/README.md +1 -1
- data/tracks/java/exercises/all-your-base/src/test/java/BaseConverterTest.java +0 -3
- data/tracks/java/exercises/allergies/README.md +0 -1
- data/tracks/java/exercises/atbash-cipher/README.md +2 -1
- data/tracks/java/exercises/beer-song/README.md +1 -1
- data/tracks/java/exercises/binary/README.md +2 -0
- data/tracks/java/exercises/book-store/README.md +5 -5
- data/tracks/java/exercises/bowling/README.md +20 -6
- data/tracks/java/exercises/change/.meta/.version +1 -0
- data/tracks/java/exercises/change/README.md +1 -1
- data/tracks/java/exercises/change/src/test/java/ChangeCalculatorTest.java +0 -3
- data/tracks/java/exercises/circular-buffer/README.md +13 -6
- data/tracks/java/exercises/clock/.meta/.version +1 -0
- data/tracks/java/exercises/clock/src/test/java/ClockAddTest.java +0 -3
- data/tracks/java/exercises/clock/src/test/java/ClockCreationTest.java +0 -3
- data/tracks/java/exercises/clock/src/test/java/ClockEqualTest.java +0 -3
- data/tracks/java/exercises/collatz-conjecture/.meta/.version +1 -0
- data/tracks/java/exercises/collatz-conjecture/README.md +1 -1
- data/tracks/java/exercises/collatz-conjecture/src/test/java/CollatzCalculatorTest.java +0 -3
- data/tracks/java/exercises/complex-numbers/README.md +27 -0
- data/tracks/java/exercises/crypto-square/README.md +10 -8
- data/tracks/java/exercises/diamond/.meta/.version +1 -0
- data/tracks/java/exercises/diamond/README.md +6 -6
- data/tracks/java/exercises/diamond/src/test/java/DiamondPrinterTest.java +0 -3
- data/tracks/java/exercises/difference-of-squares/.meta/.version +1 -0
- data/tracks/java/exercises/difference-of-squares/src/test/java/DifferenceOfSquaresCalculatorTest.java +0 -3
- data/tracks/java/exercises/etl/README.md +2 -0
- data/tracks/java/exercises/flatten-array/.meta/.version +1 -0
- data/tracks/java/exercises/flatten-array/README.md +1 -2
- data/tracks/java/exercises/flatten-array/src/test/java/FlattenerTest.java +0 -3
- data/tracks/java/exercises/food-chain/README.md +1 -1
- data/tracks/java/exercises/forth/.meta/.version +1 -0
- data/tracks/java/exercises/forth/src/test/java/ForthEvaluatorTest.java +0 -3
- data/tracks/java/exercises/grade-school/README.md +0 -1
- data/tracks/java/exercises/hamming/.meta/.version +1 -0
- data/tracks/java/exercises/hamming/src/test/java/HammingTest.java +0 -3
- data/tracks/java/exercises/house/README.md +1 -2
- data/tracks/java/exercises/isogram/README.md +2 -1
- data/tracks/java/exercises/kindergarten-garden/README.md +13 -13
- data/tracks/java/exercises/linked-list/README.md +10 -10
- data/tracks/java/exercises/list-ops/.meta/.version +1 -0
- data/tracks/java/exercises/list-ops/README.md +4 -0
- data/tracks/java/exercises/list-ops/src/test/java/ListOpsTest.java +0 -3
- data/tracks/java/exercises/luhn/README.md +7 -7
- data/tracks/java/exercises/matrix/README.md +6 -4
- data/tracks/java/exercises/meetup/README.md +1 -2
- data/tracks/java/exercises/minesweeper/.meta/.version +1 -0
- data/tracks/java/exercises/minesweeper/src/test/java/MinesweeperBoardTest.java +0 -3
- data/tracks/java/exercises/nucleotide-count/README.md +8 -22
- data/tracks/java/exercises/ocr-numbers/README.md +5 -5
- data/tracks/java/exercises/octal/README.md +6 -2
- data/tracks/java/exercises/palindrome-products/README.md +15 -16
- data/tracks/java/exercises/pangram/.meta/.version +1 -0
- data/tracks/java/exercises/pangram/README.md +1 -1
- data/tracks/java/exercises/pangram/src/test/java/PangramCheckerTest.java +0 -3
- data/tracks/java/exercises/pascals-triangle/.meta/.version +1 -0
- data/tracks/java/exercises/pascals-triangle/README.md +1 -1
- data/tracks/java/exercises/pascals-triangle/src/test/java/PascalsTriangleGeneratorTest.java +0 -3
- data/tracks/java/exercises/perfect-numbers/.meta/.version +1 -0
- data/tracks/java/exercises/perfect-numbers/README.md +2 -2
- data/tracks/java/exercises/perfect-numbers/src/test/java/NaturalNumberTest.java +0 -3
- data/tracks/java/exercises/phone-number/README.md +3 -2
- data/tracks/java/exercises/pythagorean-triplet/README.md +3 -3
- data/tracks/java/exercises/queen-attack/README.md +1 -1
- data/tracks/java/exercises/rectangles/README.md +7 -7
- data/tracks/java/exercises/rna-transcription/.meta/.version +1 -0
- data/tracks/java/exercises/rna-transcription/src/test/java/RnaTranscriptionTest.java +0 -3
- data/tracks/java/exercises/roman-numerals/README.md +1 -1
- data/tracks/java/exercises/rotational-cipher/README.md +2 -1
- data/tracks/java/exercises/run-length-encoding/README.md +4 -4
- data/tracks/java/exercises/saddle-points/.meta/.version +1 -0
- data/tracks/java/exercises/saddle-points/README.md +1 -1
- data/tracks/java/exercises/saddle-points/src/test/java/MatrixTest.java +0 -3
- data/tracks/java/exercises/scrabble-score/.meta/.version +1 -0
- data/tracks/java/exercises/scrabble-score/README.md +3 -1
- data/tracks/java/exercises/scrabble-score/src/test/java/ScrabbleScoreTest.java +0 -3
- data/tracks/java/exercises/secret-handshake/README.md +1 -1
- data/tracks/java/exercises/simple-cipher/README.md +1 -1
- data/tracks/java/exercises/simple-linked-list/src/test/java/SimpleLinkedListTest.java +25 -25
- data/tracks/java/exercises/space-age/README.md +1 -1
- data/tracks/java/exercises/spiral-matrix/.meta/.version +1 -0
- data/tracks/java/exercises/spiral-matrix/README.md +2 -2
- data/tracks/java/exercises/spiral-matrix/src/test/java/SpiralMatrixBuilderTest.java +0 -3
- data/tracks/java/exercises/sum-of-multiples/README.md +0 -3
- data/tracks/java/exercises/tournament/README.md +6 -5
- data/tracks/java/exercises/transpose/README.md +7 -7
- data/tracks/java/exercises/triangle/README.md +9 -6
- data/tracks/java/exercises/trinary/README.md +1 -1
- data/tracks/java/exercises/twelve-days/README.md +1 -1
- data/tracks/java/exercises/two-fer/README.md +1 -2
- data/tracks/java/exercises/word-count/README.md +1 -2
- data/tracks/java/exercises/word-search/.meta/.version +1 -0
- data/tracks/java/exercises/word-search/README.md +1 -1
- data/tracks/java/exercises/word-search/src/test/java/WordSearcherTest.java +0 -3
- data/tracks/java/exercises/wordy/README.md +0 -5
- data/tracks/javascript/config.json +13 -0
- data/tracks/javascript/docs/TESTS.md +1 -1
- data/tracks/javascript/exercises/diffie-hellman/example.js +1 -1
- data/tracks/javascript/exercises/hello-world/example.js +2 -3
- data/tracks/javascript/exercises/meetup/example.js +24 -27
- data/tracks/javascript/exercises/meetup/meetup.spec.js +0 -6
- data/tracks/javascript/exercises/nucleotide-count/nucleotide-count.spec.js +1 -1
- data/tracks/javascript/exercises/protein-translation/README.md +73 -0
- data/tracks/javascript/exercises/protein-translation/example.js +68 -0
- data/tracks/javascript/exercises/protein-translation/protein-translation.spec.js +63 -0
- data/tracks/julia/README.md +1 -1
- data/tracks/kotlin/config.json +11 -0
- data/tracks/kotlin/exercises/acronym/README.md +0 -1
- data/tracks/kotlin/exercises/all-your-base/README.md +1 -1
- data/tracks/kotlin/exercises/allergies/README.md +0 -1
- data/tracks/kotlin/exercises/atbash-cipher/README.md +2 -1
- data/tracks/kotlin/exercises/beer-song/README.md +1 -1
- data/tracks/kotlin/exercises/binary/README.md +2 -0
- data/tracks/kotlin/exercises/change/README.md +1 -1
- data/tracks/kotlin/exercises/collatz-conjecture/README.md +1 -1
- data/tracks/kotlin/exercises/complex-numbers/README.md +27 -0
- data/tracks/kotlin/exercises/diamond/README.md +6 -6
- data/tracks/kotlin/exercises/etl/README.md +2 -0
- data/tracks/kotlin/exercises/flatten-array/README.md +1 -2
- data/tracks/kotlin/exercises/grade-school/README.md +0 -1
- data/tracks/kotlin/exercises/grains/README.md +0 -1
- data/tracks/kotlin/exercises/hello-world/.meta/hints.md +4 -0
- data/tracks/kotlin/exercises/hello-world/.meta/src/reference/kotlin/HelloWorld.kt +2 -2
- data/tracks/kotlin/exercises/hello-world/README.md +6 -0
- data/tracks/kotlin/exercises/hello-world/TUTORIAL.md +32 -434
- data/tracks/kotlin/exercises/hello-world/src/main/kotlin/HelloWorld.kt +1 -1
- data/tracks/kotlin/exercises/hello-world/src/test/kotlin/HelloWorldTest.kt +2 -21
- data/tracks/kotlin/exercises/isogram/README.md +2 -1
- data/tracks/kotlin/exercises/leap/README.md +1 -1
- data/tracks/kotlin/exercises/linked-list/README.md +10 -10
- data/tracks/kotlin/exercises/luhn/README.md +7 -7
- data/tracks/kotlin/exercises/meetup/README.md +1 -2
- data/tracks/kotlin/exercises/nucleotide-count/README.md +8 -22
- data/tracks/kotlin/exercises/pangram/README.md +1 -1
- data/tracks/kotlin/exercises/pascals-triangle/README.md +1 -1
- data/tracks/kotlin/exercises/perfect-numbers/README.md +2 -2
- data/tracks/kotlin/exercises/phone-number/README.md +3 -2
- data/tracks/kotlin/exercises/roman-numerals/README.md +1 -1
- data/tracks/kotlin/exercises/rotational-cipher/README.md +2 -1
- data/tracks/kotlin/exercises/saddle-points/README.md +1 -1
- data/tracks/kotlin/exercises/scrabble-score/README.md +3 -1
- data/tracks/kotlin/exercises/secret-handshake/README.md +1 -1
- data/tracks/kotlin/exercises/settings.gradle +1 -0
- data/tracks/kotlin/exercises/space-age/README.md +1 -2
- data/tracks/kotlin/exercises/spiral-matrix/README.md +2 -2
- data/tracks/kotlin/exercises/sum-of-multiples/README.md +0 -3
- data/tracks/kotlin/exercises/triangle/README.md +9 -6
- data/tracks/kotlin/exercises/two-fer/.meta/src/reference/kotlin/Twofer.kt +3 -0
- data/tracks/kotlin/exercises/two-fer/README.md +50 -0
- data/tracks/kotlin/exercises/two-fer/build.gradle +28 -0
- data/tracks/kotlin/exercises/two-fer/src/main/kotlin/.keep +0 -0
- data/tracks/kotlin/exercises/two-fer/src/test/kotlin/TwoferTest.kt +31 -0
- data/tracks/kotlin/exercises/word-count/README.md +1 -2
- data/tracks/ocaml/exercises/pangram/test.ml +3 -1
- data/tracks/perl5/.travis.yml +3 -1
- data/tracks/php/Makefile +2 -2
- data/tracks/php/README.md +4 -4
- data/tracks/php/config.json +15 -0
- data/tracks/php/exercises/transpose/example.php +30 -0
- data/tracks/php/exercises/transpose/transpose_test.php +116 -0
- data/tracks/php/{phpcs-xphp.xml → phpcs-php.xml} +0 -0
- data/tracks/python/.travis.yml +1 -1
- data/tracks/python/config.json +199 -39
- data/tracks/python/exercises/acronym/acronym_test.py +1 -1
- data/tracks/python/exercises/allergies/allergies_test.py +1 -1
- data/tracks/python/exercises/alphametics/alphametics_test.py +1 -1
- data/tracks/python/exercises/anagram/anagram_test.py +1 -1
- data/tracks/python/exercises/atbash-cipher/atbash_cipher_test.py +1 -1
- data/tracks/python/exercises/bob/bob.py +1 -1
- data/tracks/python/exercises/bob/bob_test.py +1 -1
- data/tracks/python/exercises/book-store/book_store_test.py +1 -1
- data/tracks/python/exercises/bracket-push/bracket_push.py +1 -1
- data/tracks/python/exercises/bracket-push/bracket_push_test.py +1 -1
- data/tracks/python/exercises/collatz-conjecture/collatz_conjecture_test.py +1 -1
- data/tracks/python/exercises/diamond/diamond_test.py +1 -1
- data/tracks/python/exercises/difference-of-squares/difference_of_squares_test.py +1 -1
- data/tracks/python/exercises/diffie-hellman/README.md +58 -0
- data/tracks/python/exercises/diffie-hellman/diffie_hellman.py +10 -0
- data/tracks/python/exercises/diffie-hellman/diffie_hellman_test.py +87 -0
- data/tracks/python/exercises/diffie-hellman/example.py +13 -0
- data/tracks/python/exercises/etl/etl_test.py +1 -1
- data/tracks/python/exercises/food-chain/README.md +81 -0
- data/tracks/python/exercises/food-chain/example.py +45 -0
- data/tracks/python/exercises/food-chain/food_chain.py +2 -0
- data/tracks/python/exercises/food-chain/food_chain_test.py +109 -0
- data/tracks/python/exercises/forth/README.md +43 -0
- data/tracks/python/exercises/forth/example.py +58 -0
- data/tracks/python/exercises/forth/forth.py +2 -0
- data/tracks/python/exercises/forth/forth_test.py +254 -0
- data/tracks/python/exercises/gigasecond/gigasecond_test.py +1 -1
- data/tracks/python/exercises/grep/grep_test.py +1 -1
- data/tracks/python/exercises/hello-world/hello_world_test.py +1 -1
- data/tracks/python/exercises/isogram/isogram_test.py +10 -10
- data/tracks/python/exercises/largest-series-product/largest_series_product_test.py +1 -1
- data/tracks/python/exercises/leap/leap_test.py +5 -5
- data/tracks/python/exercises/luhn/luhn_test.py +16 -16
- data/tracks/python/exercises/markdown/README.md +30 -0
- data/tracks/python/exercises/markdown/example.py +80 -0
- data/tracks/python/exercises/markdown/markdown.py +71 -0
- data/tracks/python/exercises/markdown/markdown_test.py +51 -0
- data/tracks/python/exercises/meetup/meetup_test.py +1 -1
- data/tracks/python/exercises/nth-prime/nth_prime_test.py +1 -1
- data/tracks/python/exercises/pascals-triangle/pascals_triangle_test.py +2 -2
- data/tracks/python/exercises/perfect-numbers/perfect_numbers_test.py +11 -11
- data/tracks/python/exercises/phone-number/phone_number_test.py +1 -1
- data/tracks/python/exercises/prime-factors/prime_factors_test.py +1 -1
- data/tracks/python/exercises/pythagorean-triplet/pythagorean_triplet_test.py +3 -3
- data/tracks/python/exercises/queen-attack/queen_attack_test.py +8 -8
- data/tracks/python/exercises/rail-fence-cipher/rail_fence_cipher_test.py +1 -1
- data/tracks/python/exercises/rectangles/rectangles_test.py +1 -1
- data/tracks/python/exercises/robot-simulator/robot_simulator.py +9 -1
- data/tracks/python/exercises/roman-numerals/roman_numerals_test.py +1 -1
- data/tracks/python/exercises/run-length-encoding/run_length_encoding_test.py +1 -1
- data/tracks/python/exercises/say/say_test.py +1 -1
- data/tracks/python/exercises/scrabble-score/scrabble_score_test.py +1 -1
- data/tracks/python/exercises/series/series.py +1 -1
- data/tracks/python/exercises/sieve/sieve_test.py +1 -1
- data/tracks/python/exercises/sublist/sublist_test.py +1 -1
- data/tracks/python/exercises/tournament/tournament_test.py +1 -1
- data/tracks/python/exercises/transpose/transpose_test.py +1 -1
- data/tracks/python/exercises/two-bucket/example.py +49 -54
- data/tracks/python/exercises/two-bucket/two_bucket_test.py +1 -1
- data/tracks/python/exercises/variable-length-quantity/variable_length_quantity_test.py +1 -1
- data/tracks/rust/config.json +24 -0
- data/tracks/rust/exercises/collatz-conjecture/Cargo.lock +4 -0
- data/tracks/rust/exercises/collatz-conjecture/Cargo.toml +3 -0
- data/tracks/rust/exercises/collatz-conjecture/README.md +65 -0
- data/tracks/rust/exercises/collatz-conjecture/example.rs +19 -0
- data/tracks/rust/exercises/collatz-conjecture/src/lib.rs +4 -0
- data/tracks/rust/exercises/collatz-conjecture/tests/collatz-conjecture.rs +32 -0
- data/tracks/rust/exercises/decimal/.gitignore +7 -0
- data/tracks/rust/exercises/decimal/.meta/description.md +19 -0
- data/tracks/rust/exercises/decimal/.meta/metadata.yml +3 -0
- data/tracks/rust/exercises/decimal/Cargo-example.toml +9 -0
- data/tracks/rust/exercises/decimal/Cargo.toml +6 -0
- data/tracks/rust/exercises/decimal/README.md +59 -0
- data/tracks/rust/exercises/decimal/example.rs +187 -0
- data/tracks/rust/exercises/decimal/src/lib.rs +10 -0
- data/tracks/rust/exercises/decimal/tests/decimal.rs +332 -0
- data/tracks/sml/exercises/accumulate/README.md +9 -1
- data/tracks/swift/exercises/luhn/Sources/LuhnExample.swift +17 -26
- data/tracks/swift/exercises/luhn/Tests/LinuxMain.swift +1 -1
- data/tracks/swift/exercises/luhn/Tests/LuhnTests/LuhnTests.swift +59 -35
- data/tracks/typescript/config.json +34 -0
- data/tracks/typescript/exercises/binary-search/README.md +67 -0
- data/tracks/typescript/exercises/binary-search/binary-search.example.ts +42 -0
- data/tracks/typescript/exercises/binary-search/binary-search.test.ts +27 -0
- data/tracks/typescript/exercises/binary-search/binary-search.ts +3 -0
- data/tracks/typescript/exercises/binary-search/package.json +36 -0
- data/tracks/typescript/exercises/binary-search/tsconfig.json +22 -0
- data/tracks/typescript/exercises/binary-search/tslint.json +127 -0
- data/tracks/typescript/exercises/binary-search/yarn.lock +2305 -0
- data/tracks/typescript/exercises/pascals-triangle/README.md +47 -0
- data/tracks/typescript/exercises/pascals-triangle/package.json +36 -0
- data/tracks/typescript/exercises/pascals-triangle/pascals-triangle.example.ts +32 -0
- data/tracks/typescript/exercises/pascals-triangle/pascals-triangle.test.ts +28 -0
- data/tracks/typescript/exercises/pascals-triangle/pascals-triangle.ts +2 -0
- data/tracks/typescript/exercises/pascals-triangle/tsconfig.json +22 -0
- data/tracks/typescript/exercises/pascals-triangle/tslint.json +127 -0
- data/tracks/typescript/exercises/pascals-triangle/yarn.lock +2305 -0
- data/tracks/typescript/exercises/rotational-cipher/README.md +63 -0
- data/tracks/typescript/exercises/rotational-cipher/package.json +36 -0
- data/tracks/typescript/exercises/rotational-cipher/rotational-cipher.example.ts +19 -0
- data/tracks/typescript/exercises/rotational-cipher/rotational-cipher.test.ts +56 -0
- data/tracks/typescript/exercises/rotational-cipher/rotational-cipher.ts +1 -0
- data/tracks/typescript/exercises/rotational-cipher/tsconfig.json +22 -0
- data/tracks/typescript/exercises/rotational-cipher/tslint.json +127 -0
- data/tracks/typescript/exercises/rotational-cipher/yarn.lock +2305 -0
- metadata +171 -5
- data/tracks/javascript/exercises/twelve-days/package.json +0 -69
- data/tracks/kotlin/exercises/hello-world/GETTING_STARTED.md +0 -50
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
class Triangle {
|
|
2
|
+
|
|
3
|
+
static boolean isEquilateral(Number a, Number b, Number c) {
|
|
4
|
+
throw new UnsupportedOperationException('isEquilateral method not implemented.')
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
static boolean isIsosceles(Number a, Number b, Number c) {
|
|
8
|
+
throw new UnsupportedOperationException('isIsosceles method not implemented.')
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
static boolean isScalene(Number a, Number b, Number c) {
|
|
12
|
+
throw new UnsupportedOperationException('isScalene method not implemented.')
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
@Grab('org.spockframework:spock-core:1.0-groovy-2.4')
|
|
2
|
+
import spock.lang.*
|
|
3
|
+
|
|
4
|
+
class TriangleSpec extends Specification {
|
|
5
|
+
|
|
6
|
+
def 'returns true if the triangle is equilateral'() {
|
|
7
|
+
expect: 'true if all sides are equal'
|
|
8
|
+
Triangle.isEquilateral(2, 2, 2)
|
|
9
|
+
|
|
10
|
+
and: 'false if any side is unequal'
|
|
11
|
+
!Triangle.isEquilateral(2, 3, 2)
|
|
12
|
+
|
|
13
|
+
and: 'false if no sides are equal'
|
|
14
|
+
!Triangle.isEquilateral(5, 4, 6)
|
|
15
|
+
|
|
16
|
+
and: 'all zero sides are illegal, so the triangle is not equilateral'
|
|
17
|
+
!Triangle.isEquilateral(0, 0, 0)
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
def 'returns true if the triangle is isosceles'() {
|
|
21
|
+
expect: 'true if last two sides are equal'
|
|
22
|
+
Triangle.isIsosceles(3, 4, 4)
|
|
23
|
+
|
|
24
|
+
and: 'true if first two sides are equal'
|
|
25
|
+
Triangle.isIsosceles(4, 4, 3)
|
|
26
|
+
|
|
27
|
+
and: 'true if first and last sides are equal'
|
|
28
|
+
Triangle.isIsosceles(4, 3, 4)
|
|
29
|
+
|
|
30
|
+
and: 'equilateral triangles are also isosceles'
|
|
31
|
+
Triangle.isIsosceles(4, 4, 4)
|
|
32
|
+
|
|
33
|
+
and: 'false if no sides are equal'
|
|
34
|
+
!Triangle.isIsosceles(2, 3, 4)
|
|
35
|
+
|
|
36
|
+
and: 'sides that violate triangle inequality are not isosceles, even if two sides are equal'
|
|
37
|
+
!Triangle.isIsosceles(1, 1, 3)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
def 'returns true if the triangle is scalene'() {
|
|
41
|
+
expect: 'true if no sides are equal'
|
|
42
|
+
Triangle.isScalene(5, 4, 6)
|
|
43
|
+
|
|
44
|
+
and: 'false if all sides are equal'
|
|
45
|
+
!Triangle.isScalene(4, 4, 4)
|
|
46
|
+
|
|
47
|
+
and: 'false if two sides are equal'
|
|
48
|
+
!Triangle.isScalene(4, 4, 3)
|
|
49
|
+
|
|
50
|
+
and: 'sides that violate triangle inequality are not scalene, even if they are all different'
|
|
51
|
+
!Triangle.isScalene(7, 3, 2)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
@Ignore
|
|
55
|
+
def 'sides may be non-integral'() {
|
|
56
|
+
expect: 'equilateral triangle sides may be non-integral'
|
|
57
|
+
Triangle.isEquilateral(0.5, 0.5, 0.5)
|
|
58
|
+
|
|
59
|
+
and: 'isosceles triangle sides may be non-integral'
|
|
60
|
+
Triangle.isIsosceles(0.5, 0.4, 0.5)
|
|
61
|
+
|
|
62
|
+
and: 'scalene triangle sides may be non-integral'
|
|
63
|
+
Triangle.isScalene(0.5, 0.4, 0.6)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
}
|
data/tracks/haskell/config.json
CHANGED
|
@@ -114,6 +114,15 @@
|
|
|
114
114
|
"topics": [
|
|
115
115
|
]
|
|
116
116
|
},
|
|
117
|
+
{
|
|
118
|
+
"uuid": "4e10e864-2fe4-4926-b908-f70645698999",
|
|
119
|
+
"slug": "complex-numbers",
|
|
120
|
+
"core": false,
|
|
121
|
+
"unlocked_by": null,
|
|
122
|
+
"difficulty": 2,
|
|
123
|
+
"topics": [
|
|
124
|
+
]
|
|
125
|
+
},
|
|
117
126
|
{
|
|
118
127
|
"uuid": "197a543c-d9c7-41c3-814c-4b1ece3db568",
|
|
119
128
|
"slug": "grains",
|
|
@@ -102,6 +102,24 @@ cases = [ Case { description = "single bit one to decimal"
|
|
|
102
102
|
, outputBase = 10
|
|
103
103
|
, outputDigits = Just [4, 2]
|
|
104
104
|
}
|
|
105
|
+
, Case { description = "first base is one"
|
|
106
|
+
, inputBase = 1
|
|
107
|
+
, inputDigits = []
|
|
108
|
+
, outputBase = 10
|
|
109
|
+
, outputDigits = Nothing
|
|
110
|
+
}
|
|
111
|
+
, Case { description = "first base is zero"
|
|
112
|
+
, inputBase = 0
|
|
113
|
+
, inputDigits = []
|
|
114
|
+
, outputBase = 10
|
|
115
|
+
, outputDigits = Nothing
|
|
116
|
+
}
|
|
117
|
+
, Case { description = "first base is negative"
|
|
118
|
+
, inputBase = -2
|
|
119
|
+
, inputDigits = [1]
|
|
120
|
+
, outputBase = 10
|
|
121
|
+
, outputDigits = Nothing
|
|
122
|
+
}
|
|
105
123
|
, Case { description = "negative digit"
|
|
106
124
|
, inputBase = 2
|
|
107
125
|
, inputDigits = [1, -1, 1, 0, 1, 0]
|
|
@@ -114,36 +132,18 @@ cases = [ Case { description = "single bit one to decimal"
|
|
|
114
132
|
, outputBase = 10
|
|
115
133
|
, outputDigits = Nothing
|
|
116
134
|
}
|
|
117
|
-
, Case { description = "first base is one"
|
|
118
|
-
, inputBase = 1
|
|
119
|
-
, inputDigits = []
|
|
120
|
-
, outputBase = 10
|
|
121
|
-
, outputDigits = Nothing
|
|
122
|
-
}
|
|
123
135
|
, Case { description = "second base is one"
|
|
124
136
|
, inputBase = 2
|
|
125
137
|
, inputDigits = [1, 0, 1, 0, 1, 0]
|
|
126
138
|
, outputBase = 1
|
|
127
139
|
, outputDigits = Nothing
|
|
128
140
|
}
|
|
129
|
-
, Case { description = "first base is zero"
|
|
130
|
-
, inputBase = 0
|
|
131
|
-
, inputDigits = []
|
|
132
|
-
, outputBase = 10
|
|
133
|
-
, outputDigits = Nothing
|
|
134
|
-
}
|
|
135
141
|
, Case { description = "second base is zero"
|
|
136
142
|
, inputBase = 10
|
|
137
143
|
, inputDigits = [7]
|
|
138
144
|
, outputBase = 0
|
|
139
145
|
, outputDigits = Nothing
|
|
140
146
|
}
|
|
141
|
-
, Case { description = "first base is negative"
|
|
142
|
-
, inputBase = -2
|
|
143
|
-
, inputDigits = [1]
|
|
144
|
-
, outputBase = 10
|
|
145
|
-
, outputDigits = Nothing
|
|
146
|
-
}
|
|
147
147
|
, Case { description = "second base is negative"
|
|
148
148
|
, inputBase = 2
|
|
149
149
|
, inputDigits = [1]
|
|
@@ -80,23 +80,23 @@ cases = [ Case { description = "should be able to score a game with all zeros"
|
|
|
80
80
|
, rolls = [10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10]
|
|
81
81
|
, expected = Right 300
|
|
82
82
|
}
|
|
83
|
-
, Case { description = "rolls
|
|
83
|
+
, Case { description = "rolls cannot score negative points"
|
|
84
84
|
, rolls = [-1]
|
|
85
85
|
, expected = Left $ InvalidRoll 0 (-1)
|
|
86
86
|
}
|
|
87
|
-
, Case { description = "a roll
|
|
87
|
+
, Case { description = "a roll cannot score more than 10 points"
|
|
88
88
|
, rolls = [11]
|
|
89
89
|
, expected = Left $ InvalidRoll 0 11
|
|
90
90
|
}
|
|
91
|
-
, Case { description = "two rolls in a frame
|
|
91
|
+
, Case { description = "two rolls in a frame cannot score more than 10 points"
|
|
92
92
|
, rolls = [5, 6]
|
|
93
93
|
, expected = Left $ InvalidRoll 1 6
|
|
94
94
|
}
|
|
95
|
-
, Case { description = "bonus roll after a strike in the last frame
|
|
95
|
+
, Case { description = "bonus roll after a strike in the last frame cannot score more than 10 points"
|
|
96
96
|
, rolls = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 11]
|
|
97
97
|
, expected = Left $ InvalidRoll 19 11
|
|
98
98
|
}
|
|
99
|
-
, Case { description = "two bonus rolls after a strike in the last frame
|
|
99
|
+
, Case { description = "two bonus rolls after a strike in the last frame cannot score more than 10 points"
|
|
100
100
|
, rolls = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 5, 6]
|
|
101
101
|
, expected = Left $ InvalidRoll 20 6
|
|
102
102
|
}
|
|
@@ -104,19 +104,19 @@ cases = [ Case { description = "should be able to score a game with all zeros"
|
|
|
104
104
|
, rolls = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 6]
|
|
105
105
|
, expected = Right 26
|
|
106
106
|
}
|
|
107
|
-
, Case { description = "the second bonus rolls after a strike in the last frame
|
|
107
|
+
, Case { description = "the second bonus rolls after a strike in the last frame cannot be a strike if the first one is not a strike"
|
|
108
108
|
, rolls = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 6, 10]
|
|
109
109
|
, expected = Left $ InvalidRoll 20 10
|
|
110
110
|
}
|
|
111
|
-
, Case { description = "second bonus roll after a strike in the last frame
|
|
111
|
+
, Case { description = "second bonus roll after a strike in the last frame cannot score more than 10 points"
|
|
112
112
|
, rolls = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 10, 11]
|
|
113
113
|
, expected = Left $ InvalidRoll 20 11
|
|
114
114
|
}
|
|
115
|
-
, Case { description = "an unstarted game
|
|
115
|
+
, Case { description = "an unstarted game cannot be scored"
|
|
116
116
|
, rolls = []
|
|
117
117
|
, expected = Left IncompleteGame
|
|
118
118
|
}
|
|
119
|
-
, Case { description = "an incomplete game
|
|
119
|
+
, Case { description = "an incomplete game cannot be scored"
|
|
120
120
|
, rolls = [0, 0]
|
|
121
121
|
, expected = Left IncompleteGame
|
|
122
122
|
}
|
|
@@ -56,6 +56,11 @@ cases = [ Case { description = "single coin change"
|
|
|
56
56
|
, target = 21
|
|
57
57
|
, expected = Just [2, 2, 2, 5, 10]
|
|
58
58
|
}
|
|
59
|
+
, Case { description = "possible change without unit coins available, must stop early on larger coin"
|
|
60
|
+
, coins = [4, 5]
|
|
61
|
+
, target = 27
|
|
62
|
+
, expected = Just [4, 4, 4, 5, 5, 5]
|
|
63
|
+
}
|
|
59
64
|
, Case { description = "no coins make 0 change"
|
|
60
65
|
, coins = [1, 5, 10, 21, 25]
|
|
61
66
|
, target = 0
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
# Complex Numbers
|
|
2
|
+
|
|
3
|
+
A complex number is a number in the form `a + b * i` where `a` and `b` are real and `i` satisfies `i^2 = -1`.
|
|
4
|
+
|
|
5
|
+
`a` is called the real part and `b` is called the imaginary part of `z`.
|
|
6
|
+
The conjugate of the number `a + b * i` is the number `a - b * i`.
|
|
7
|
+
The absolute value of a complex number `z = a + b * i` is a real number `|z| = sqrt(a^2 + b^2)`. The square of the absolute value `|z|^2` is the result of multiplication of `z` by its complex conjugate.
|
|
8
|
+
|
|
9
|
+
The sum/difference of two complex numbers involves adding/subtracting their real and imaginary parts separately:
|
|
10
|
+
`(a + i * b) + (c + i * d) = (a + c) + (b + d) * i`,
|
|
11
|
+
`(a + i * b) - (c + i * d) = (a - c) + (b - d) * i`.
|
|
12
|
+
|
|
13
|
+
Multiplication result is by definition
|
|
14
|
+
`(a + i * b) * (c + i * d) = (a * c - b * d) + (b * c + a * d) * i`.
|
|
15
|
+
|
|
16
|
+
The reciprocal of a non-zero complex number is
|
|
17
|
+
`1 / (a + i * b) = a/(a^2 + b^2) - b/(a^2 + b^2) * i`.
|
|
18
|
+
|
|
19
|
+
Dividing a complex number `a + i * b` by another `c + i * d` gives:
|
|
20
|
+
`(a + i * b) / (c + i * d) = (a * c + b * d)/(c^2 + d^2) + (b * c - a * d)/(c^2 + d^2) * i`.
|
|
21
|
+
|
|
22
|
+
Exponent of a complex number can be expressed as
|
|
23
|
+
`exp(a + i * b) = exp(a) * exp(i * b)`,
|
|
24
|
+
and the last term is given by Euler's formula `exp(i * b) = cos(b) + i * sin(b)`.
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
Implement the following operations:
|
|
28
|
+
- addition, subtraction, multiplication and division of two complex numbers,
|
|
29
|
+
- conjugate, absolute value, exponent of a given complex number.
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
Assume the programming language you are using does not have an implementation of complex numbers.
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
## Getting Started
|
|
36
|
+
|
|
37
|
+
For installation and learning resources, refer to the
|
|
38
|
+
[exercism help page](http://exercism.io/languages/haskell).
|
|
39
|
+
|
|
40
|
+
## Running the tests
|
|
41
|
+
|
|
42
|
+
To run the test suite, execute the following command:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
stack test
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
#### If you get an error message like this...
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
No .cabal file found in directory
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
You are probably running an old stack version and need
|
|
55
|
+
to upgrade it.
|
|
56
|
+
|
|
57
|
+
#### Otherwise, if you get an error message like this...
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
No compiler found, expected minor version match with...
|
|
61
|
+
Try running "stack setup" to install the correct GHC...
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Just do as it says and it will download and install
|
|
65
|
+
the correct compiler version:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
stack setup
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Running *GHCi*
|
|
72
|
+
|
|
73
|
+
If you want to play with your solution in GHCi, just run the command:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
stack ghci
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Feedback, Issues, Pull Requests
|
|
80
|
+
|
|
81
|
+
The [exercism/haskell](https://github.com/exercism/haskell) repository on
|
|
82
|
+
GitHub is the home for all of the Haskell exercises.
|
|
83
|
+
|
|
84
|
+
If you have feedback about an exercise, or want to help implementing a new
|
|
85
|
+
one, head over there and create an issue. We'll do our best to help you!
|
|
86
|
+
|
|
87
|
+
## Source
|
|
88
|
+
|
|
89
|
+
Wikipedia [https://en.wikipedia.org/wiki/Complex_number](https://en.wikipedia.org/wiki/Complex_number)
|
|
90
|
+
|
|
91
|
+
## Submitting Incomplete Solutions
|
|
92
|
+
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
module ComplexNumbers
|
|
2
|
+
(Complex,
|
|
3
|
+
conjugate,
|
|
4
|
+
abs,
|
|
5
|
+
mul,
|
|
6
|
+
add,
|
|
7
|
+
sub,
|
|
8
|
+
div,
|
|
9
|
+
real,
|
|
10
|
+
imaginary,
|
|
11
|
+
complex) where
|
|
12
|
+
|
|
13
|
+
import Prelude hiding (div, abs)
|
|
14
|
+
|
|
15
|
+
-- Data definition -------------------------------------------------------------
|
|
16
|
+
data Complex a = Complex a a deriving (Eq, Show)
|
|
17
|
+
|
|
18
|
+
--------------------------------------------------------------------------------
|
|
19
|
+
complex :: (a, a) -> Complex a
|
|
20
|
+
complex = uncurry Complex
|
|
21
|
+
|
|
22
|
+
exp2 :: Num a => a -> a
|
|
23
|
+
exp2 x = x^(2 :: Integer)
|
|
24
|
+
|
|
25
|
+
-- unary operators -------------------------------------------------------------
|
|
26
|
+
real :: Num a => Complex a -> a
|
|
27
|
+
real (Complex a _) = a
|
|
28
|
+
|
|
29
|
+
imaginary :: Num a => Complex a -> a
|
|
30
|
+
imaginary (Complex _ b) = b
|
|
31
|
+
|
|
32
|
+
conjugate :: Num a => Complex a -> Complex a
|
|
33
|
+
conjugate (Complex a b) = Complex a (-b)
|
|
34
|
+
|
|
35
|
+
abs :: Floating a => Complex a -> a
|
|
36
|
+
abs (Complex a b) = sqrt (exp2 a + exp2 b)
|
|
37
|
+
|
|
38
|
+
-- binary operators ------------------------------------------------------------
|
|
39
|
+
mul :: Num a => Complex a -> Complex a -> Complex a
|
|
40
|
+
mul (Complex a b) (Complex c d) = Complex (a*c - b*d) (a*d + b*c)
|
|
41
|
+
|
|
42
|
+
add :: Num a => Complex a -> Complex a -> Complex a
|
|
43
|
+
add (Complex a b) (Complex c d) = Complex (a+c) (b+d)
|
|
44
|
+
|
|
45
|
+
sub :: Num a => Complex a -> Complex a -> Complex a
|
|
46
|
+
sub (Complex a b) (Complex c d) = Complex (a-c) (b-d)
|
|
47
|
+
|
|
48
|
+
div :: Fractional a => Complex a -> Complex a -> Complex a
|
|
49
|
+
div (Complex a b) (Complex c d) = Complex ((a*c + b*d)/(exp2 c + exp2 d))
|
|
50
|
+
((b*c - a*d)/(exp2 c + exp2 d))
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
name: complex-numbers
|
|
2
|
+
version: 1.0.0.1
|
|
3
|
+
|
|
4
|
+
dependencies:
|
|
5
|
+
- base
|
|
6
|
+
|
|
7
|
+
library:
|
|
8
|
+
exposed-modules: ComplexNumbers
|
|
9
|
+
source-dirs: src
|
|
10
|
+
dependencies:
|
|
11
|
+
# - foo # List here the packages you
|
|
12
|
+
# - bar # want to use in your solution.
|
|
13
|
+
|
|
14
|
+
tests:
|
|
15
|
+
test:
|
|
16
|
+
main: Tests.hs
|
|
17
|
+
source-dirs: test
|
|
18
|
+
dependencies:
|
|
19
|
+
- complex-numbers
|
|
20
|
+
- hspec
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
module ComplexNumbers
|
|
2
|
+
(Complex,
|
|
3
|
+
conjugate,
|
|
4
|
+
abs,
|
|
5
|
+
real,
|
|
6
|
+
imaginary,
|
|
7
|
+
mul,
|
|
8
|
+
add,
|
|
9
|
+
sub,
|
|
10
|
+
div,
|
|
11
|
+
complex) where
|
|
12
|
+
|
|
13
|
+
import Prelude hiding (div, abs)
|
|
14
|
+
|
|
15
|
+
-- Data definition -------------------------------------------------------------
|
|
16
|
+
data Complex a = Dummy deriving(Eq, Show)
|
|
17
|
+
|
|
18
|
+
complex :: (a, a) -> Complex a
|
|
19
|
+
complex = error "You need to implement this function"
|
|
20
|
+
|
|
21
|
+
-- unary operators -------------------------------------------------------------
|
|
22
|
+
conjugate :: Num a => Complex a -> Complex a
|
|
23
|
+
conjugate = error "You need to implement this function"
|
|
24
|
+
|
|
25
|
+
abs :: Floating a => Complex a -> a
|
|
26
|
+
abs = error "You need to implement this function"
|
|
27
|
+
|
|
28
|
+
real :: Num a => Complex a -> a
|
|
29
|
+
real = error "You need to implement this function"
|
|
30
|
+
|
|
31
|
+
imaginary :: Num a => Complex a -> a
|
|
32
|
+
imaginary = error "You need to implement this function"
|
|
33
|
+
|
|
34
|
+
-- binary operators ------------------------------------------------------------
|
|
35
|
+
mul :: Num a => Complex a -> Complex a -> Complex a
|
|
36
|
+
mul = error "You need to implement this function"
|
|
37
|
+
|
|
38
|
+
add :: Num a => Complex a -> Complex a -> Complex a
|
|
39
|
+
add = error "You need to implement this function"
|
|
40
|
+
|
|
41
|
+
sub :: Num a => Complex a -> Complex a -> Complex a
|
|
42
|
+
sub = error "You need to implement this function"
|
|
43
|
+
|
|
44
|
+
div :: Fractional a => Complex a -> Complex a -> Complex a
|
|
45
|
+
div = error "You need to implement this function"
|