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,43 @@
|
|
|
1
|
+
# Forth
|
|
2
|
+
|
|
3
|
+
Implement an evaluator for a very simple subset of Forth.
|
|
4
|
+
|
|
5
|
+
[Forth](https://en.wikipedia.org/wiki/Forth_%28programming_language%29)
|
|
6
|
+
is a stack-based programming language. Implement a very basic evaluator
|
|
7
|
+
for a small subset of Forth.
|
|
8
|
+
|
|
9
|
+
Your evaluator has to support the following words:
|
|
10
|
+
|
|
11
|
+
- `+`, `-`, `*`, `/` (integer arithmetic)
|
|
12
|
+
- `DUP`, `DROP`, `SWAP`, `OVER` (stack manipulation)
|
|
13
|
+
|
|
14
|
+
Your evaluator also has to support defining new words using the
|
|
15
|
+
customary syntax: `: word-name definition ;`.
|
|
16
|
+
|
|
17
|
+
To keep things simple the only data type you need to support is signed
|
|
18
|
+
integers of at least 16 bits size.
|
|
19
|
+
|
|
20
|
+
You should use the following rules for the syntax: a number is a
|
|
21
|
+
sequence of one or more (ASCII) digits, a word is a sequence of one or
|
|
22
|
+
more letters, digits, symbols or punctuation that is not a number.
|
|
23
|
+
(Forth probably uses slightly different rules, but this is close
|
|
24
|
+
enough.)
|
|
25
|
+
|
|
26
|
+
Words are case-insensitive.
|
|
27
|
+
|
|
28
|
+
## Hints
|
|
29
|
+
- To parse the text, you could try to use the [Sprache](https://github.com/sprache/Sprache/blob/develop/README.md) library. You can also find a good tutorial [here](https://www.thomaslevesque.com/2017/02/23/easy-text-parsing-in-c-with-sprache/).
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
### Submitting Exercises
|
|
33
|
+
|
|
34
|
+
Note that, when trying to submit an exercise, make sure the solution is in the `exercism/python/<exerciseName>` directory.
|
|
35
|
+
|
|
36
|
+
For example, if you're submitting `bob.py` for the Bob exercise, the submit command would be something like `exercism submit <path_to_exercism_dir>/python/bob/bob.py`.
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
For more detailed information about running tests, code style and linting,
|
|
40
|
+
please see the [help page](http://exercism.io/languages/python).
|
|
41
|
+
|
|
42
|
+
## Submitting Incomplete Solutions
|
|
43
|
+
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
class StackUnderflowError(Exception):
|
|
2
|
+
pass
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def is_integer(string):
|
|
6
|
+
try:
|
|
7
|
+
int(string)
|
|
8
|
+
return True
|
|
9
|
+
except ValueError:
|
|
10
|
+
return False
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def evaluate(input_data):
|
|
14
|
+
defines = {}
|
|
15
|
+
while input_data[0][0] == ':':
|
|
16
|
+
values = input_data.pop(0).split()
|
|
17
|
+
values.pop()
|
|
18
|
+
values.pop(0)
|
|
19
|
+
key = values.pop(0)
|
|
20
|
+
if is_integer(key):
|
|
21
|
+
raise ValueError()
|
|
22
|
+
defines[key] = values
|
|
23
|
+
stack = []
|
|
24
|
+
input_data = input_data[-1].split()
|
|
25
|
+
while any(input_data):
|
|
26
|
+
word = input_data.pop(0).lower()
|
|
27
|
+
try:
|
|
28
|
+
if is_integer(word):
|
|
29
|
+
stack.append(int(word))
|
|
30
|
+
elif word in defines:
|
|
31
|
+
input_data = defines[word] + input_data
|
|
32
|
+
elif word == '+':
|
|
33
|
+
stack.append(stack.pop() + stack.pop())
|
|
34
|
+
elif word == '-':
|
|
35
|
+
stack.append(-stack.pop() + stack.pop())
|
|
36
|
+
elif word == '*':
|
|
37
|
+
stack.append(stack.pop() * stack.pop())
|
|
38
|
+
elif word == '/':
|
|
39
|
+
divider = stack.pop()
|
|
40
|
+
if divider == 0:
|
|
41
|
+
raise ZeroDivisionError()
|
|
42
|
+
stack.append(int(stack.pop() / divider))
|
|
43
|
+
elif word == 'dup':
|
|
44
|
+
stack.append(stack[-1])
|
|
45
|
+
elif word == 'drop':
|
|
46
|
+
stack.pop()
|
|
47
|
+
elif word == 'swap':
|
|
48
|
+
stack.append(stack[-2])
|
|
49
|
+
del stack[-3]
|
|
50
|
+
elif word == 'over':
|
|
51
|
+
stack.append(stack[-2])
|
|
52
|
+
else:
|
|
53
|
+
raise ValueError()
|
|
54
|
+
except ZeroDivisionError:
|
|
55
|
+
raise
|
|
56
|
+
except IndexError:
|
|
57
|
+
raise StackUnderflowError()
|
|
58
|
+
return stack
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import unittest
|
|
2
|
+
|
|
3
|
+
from example import evaluate, StackUnderflowError
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
# test cases adapted from `x-common//canonical-data.json` @ version: 1.2.0
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class ForthAdditionTest(unittest.TestCase):
|
|
10
|
+
def test_can_add_two_numbers(self):
|
|
11
|
+
input_data = ["1 2 +"]
|
|
12
|
+
expected = [3]
|
|
13
|
+
self.assertEqual(expected, evaluate(input_data))
|
|
14
|
+
|
|
15
|
+
def test_errors_if_there_is_nothing_on_the_stack(self):
|
|
16
|
+
input_data = ["+"]
|
|
17
|
+
with self.assertRaises(StackUnderflowError):
|
|
18
|
+
evaluate(input_data)
|
|
19
|
+
|
|
20
|
+
def test_errors_if_there_is_only_one_value_on_the_stack(self):
|
|
21
|
+
input_data = ["1 +"]
|
|
22
|
+
with self.assertRaises(StackUnderflowError):
|
|
23
|
+
evaluate(input_data)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class ForthSubtractionTest(unittest.TestCase):
|
|
27
|
+
def test_can_subtract_two_numbers(self):
|
|
28
|
+
input_data = ["3 4 -"]
|
|
29
|
+
expected = [-1]
|
|
30
|
+
self.assertEqual(expected, evaluate(input_data))
|
|
31
|
+
|
|
32
|
+
def test_errors_if_there_is_nothing_on_the_stack(self):
|
|
33
|
+
input_data = ["-"]
|
|
34
|
+
with self.assertRaises(StackUnderflowError):
|
|
35
|
+
evaluate(input_data)
|
|
36
|
+
|
|
37
|
+
def test_errors_if_there_is_only_one_value_on_the_stack(self):
|
|
38
|
+
input_data = ["1 -"]
|
|
39
|
+
with self.assertRaises(StackUnderflowError):
|
|
40
|
+
evaluate(input_data)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class ForthMultiplicationTest(unittest.TestCase):
|
|
44
|
+
def test_can_multiply_two_numbers(self):
|
|
45
|
+
input_data = ["2 4 *"]
|
|
46
|
+
expected = [8]
|
|
47
|
+
self.assertEqual(expected, evaluate(input_data))
|
|
48
|
+
|
|
49
|
+
def test_errors_if_there_is_nothing_on_the_stack(self):
|
|
50
|
+
input_data = ["*"]
|
|
51
|
+
with self.assertRaises(StackUnderflowError):
|
|
52
|
+
evaluate(input_data)
|
|
53
|
+
|
|
54
|
+
def test_errors_if_there_is_only_one_value_on_the_stack(self):
|
|
55
|
+
input_data = ["1 *"]
|
|
56
|
+
with self.assertRaises(StackUnderflowError):
|
|
57
|
+
evaluate(input_data)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class ForthDivisionTest(unittest.TestCase):
|
|
61
|
+
def test_can_divide_two_numbers(self):
|
|
62
|
+
input_data = ["3 4 -"]
|
|
63
|
+
expected = [-1]
|
|
64
|
+
self.assertEqual(expected, evaluate(input_data))
|
|
65
|
+
|
|
66
|
+
def test_performs_integer_division(self):
|
|
67
|
+
input_data = ["8 3 /"]
|
|
68
|
+
expected = [2]
|
|
69
|
+
self.assertEqual(expected, evaluate(input_data))
|
|
70
|
+
|
|
71
|
+
def test_errors_if_dividing_by_zero(self):
|
|
72
|
+
input_data = ["4 0 /"]
|
|
73
|
+
with self.assertRaises(ZeroDivisionError):
|
|
74
|
+
evaluate(input_data)
|
|
75
|
+
|
|
76
|
+
def test_errors_if_there_is_nothing_on_the_stack(self):
|
|
77
|
+
input_data = ["/"]
|
|
78
|
+
with self.assertRaises(StackUnderflowError):
|
|
79
|
+
evaluate(input_data)
|
|
80
|
+
|
|
81
|
+
def test_errors_if_there_is_only_one_value_on_the_stack(self):
|
|
82
|
+
input_data = ["1 /"]
|
|
83
|
+
with self.assertRaises(StackUnderflowError):
|
|
84
|
+
evaluate(input_data)
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class ForthCombinedArithmeticTest(unittest.TestCase):
|
|
88
|
+
def test_addition_and_subtraction(self):
|
|
89
|
+
input_data = ["1 2 + 4 -"]
|
|
90
|
+
expected = [-1]
|
|
91
|
+
self.assertEqual(expected, evaluate(input_data))
|
|
92
|
+
|
|
93
|
+
def test_multiplication_and_division(self):
|
|
94
|
+
input_data = ["2 4 * 3 /"]
|
|
95
|
+
expected = [2]
|
|
96
|
+
self.assertEqual(expected, evaluate(input_data))
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class ForthDupTest(unittest.TestCase):
|
|
100
|
+
def test_copies_the_top_value_on_the_stack(self):
|
|
101
|
+
input_data = ["1 DUP"]
|
|
102
|
+
expected = [1, 1]
|
|
103
|
+
self.assertEqual(expected, evaluate(input_data))
|
|
104
|
+
|
|
105
|
+
def test_is_case_insensitive(self):
|
|
106
|
+
input_data = ["1 2 Dup"]
|
|
107
|
+
expected = [1, 2, 2]
|
|
108
|
+
self.assertEqual(expected, evaluate(input_data))
|
|
109
|
+
|
|
110
|
+
def test_errors_if_there_is_nothing_on_the_stack(self):
|
|
111
|
+
input_data = ["dup"]
|
|
112
|
+
with self.assertRaises(StackUnderflowError):
|
|
113
|
+
evaluate(input_data)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
class ForthDropTest(unittest.TestCase):
|
|
117
|
+
def test_removes_the_top_value_on_the_stack_if_it_is_the_only_one(self):
|
|
118
|
+
input_data = ["1 DROP"]
|
|
119
|
+
expected = []
|
|
120
|
+
self.assertEqual(expected, evaluate(input_data))
|
|
121
|
+
|
|
122
|
+
def test_removes_the_top_value_on_the_stack_if_it_not_the_only_one(self):
|
|
123
|
+
input_data = ["3 4 DROP"]
|
|
124
|
+
expected = [3]
|
|
125
|
+
self.assertEqual(expected, evaluate(input_data))
|
|
126
|
+
|
|
127
|
+
def test_is_case_insensitive(self):
|
|
128
|
+
input_data = ["1 2 Drop"]
|
|
129
|
+
expected = [1]
|
|
130
|
+
self.assertEqual(expected, evaluate(input_data))
|
|
131
|
+
|
|
132
|
+
def test_errors_if_there_is_nothing_on_the_stack(self):
|
|
133
|
+
input_data = ["drop"]
|
|
134
|
+
with self.assertRaises(StackUnderflowError):
|
|
135
|
+
evaluate(input_data)
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
class ForthSwapTest(unittest.TestCase):
|
|
139
|
+
def test_swaps_only_two_values_on_stack(self):
|
|
140
|
+
input_data = ["1 2 SWAP"]
|
|
141
|
+
expected = [2, 1]
|
|
142
|
+
self.assertEqual(expected, evaluate(input_data))
|
|
143
|
+
|
|
144
|
+
def test_swaps_two_two_values_on_stack(self):
|
|
145
|
+
input_data = ["1 2 3 SWAP"]
|
|
146
|
+
expected = [1, 3, 2]
|
|
147
|
+
self.assertEqual(expected, evaluate(input_data))
|
|
148
|
+
|
|
149
|
+
def test_is_case_insensitive(self):
|
|
150
|
+
input_data = ["3 4 Swap"]
|
|
151
|
+
expected = [4, 3]
|
|
152
|
+
self.assertEqual(expected, evaluate(input_data))
|
|
153
|
+
|
|
154
|
+
def test_errors_if_there_is_nothing_on_the_stack(self):
|
|
155
|
+
input_data = ["swap"]
|
|
156
|
+
with self.assertRaises(StackUnderflowError):
|
|
157
|
+
evaluate(input_data)
|
|
158
|
+
|
|
159
|
+
def test_errors_if_there_is_only_one_value_on_the_stack(self):
|
|
160
|
+
input_data = ["1 swap"]
|
|
161
|
+
with self.assertRaises(StackUnderflowError):
|
|
162
|
+
evaluate(input_data)
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
class ForthOverTest(unittest.TestCase):
|
|
166
|
+
def test_copies_the_second_element_if_there_are_only_two(self):
|
|
167
|
+
input_data = ["1 2 OVER"]
|
|
168
|
+
expected = [1, 2, 1]
|
|
169
|
+
self.assertEqual(expected, evaluate(input_data))
|
|
170
|
+
|
|
171
|
+
def test_copies_the_second_element_if_there_are_more_than_two(self):
|
|
172
|
+
input_data = ["1 2 3 OVER"]
|
|
173
|
+
expected = [1, 2, 3, 2]
|
|
174
|
+
self.assertEqual(expected, evaluate(input_data))
|
|
175
|
+
|
|
176
|
+
def test_is_case_insensitive(self):
|
|
177
|
+
input_data = ["3 4 Over"]
|
|
178
|
+
expected = [3, 4, 3]
|
|
179
|
+
self.assertEqual(expected, evaluate(input_data))
|
|
180
|
+
|
|
181
|
+
def test_errors_if_there_is_nothing_on_the_stack(self):
|
|
182
|
+
input_data = ["over"]
|
|
183
|
+
with self.assertRaises(StackUnderflowError):
|
|
184
|
+
evaluate(input_data)
|
|
185
|
+
|
|
186
|
+
def test_errors_if_there_is_only_one_value_on_the_stack(self):
|
|
187
|
+
input_data = ["1 over"]
|
|
188
|
+
with self.assertRaises(StackUnderflowError):
|
|
189
|
+
evaluate(input_data)
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
class ForthUserDefinedWordsTest(unittest.TestCase):
|
|
193
|
+
def test_can_consist_of_built_in_words(self):
|
|
194
|
+
input_data = [
|
|
195
|
+
": dup-twice dup dup ;",
|
|
196
|
+
"1 dup-twice"
|
|
197
|
+
]
|
|
198
|
+
expected = [1, 1, 1]
|
|
199
|
+
self.assertEqual(expected, evaluate(input_data))
|
|
200
|
+
|
|
201
|
+
def test_execute_in_the_right_order(self):
|
|
202
|
+
input_data = [
|
|
203
|
+
": countup 1 2 3 ;",
|
|
204
|
+
"countup"
|
|
205
|
+
]
|
|
206
|
+
expected = [1, 2, 3]
|
|
207
|
+
self.assertEqual(expected, evaluate(input_data))
|
|
208
|
+
|
|
209
|
+
def test_can_override_other_user_defined_words(self):
|
|
210
|
+
input_data = [
|
|
211
|
+
": foo dup ;",
|
|
212
|
+
": foo dup dup ;",
|
|
213
|
+
"1 foo"
|
|
214
|
+
]
|
|
215
|
+
expected = [1, 1, 1]
|
|
216
|
+
self.assertEqual(expected, evaluate(input_data))
|
|
217
|
+
|
|
218
|
+
def test_can_override_built_in_words(self):
|
|
219
|
+
input_data = [
|
|
220
|
+
": swap dup ;",
|
|
221
|
+
"1 swap"
|
|
222
|
+
]
|
|
223
|
+
expected = [1, 1]
|
|
224
|
+
self.assertEqual(expected, evaluate(input_data))
|
|
225
|
+
|
|
226
|
+
def test_can_override_built_in_operators(self):
|
|
227
|
+
input_data = [
|
|
228
|
+
": + * ;",
|
|
229
|
+
"3 4 +"
|
|
230
|
+
]
|
|
231
|
+
expected = [12]
|
|
232
|
+
self.assertEqual(expected, evaluate(input_data))
|
|
233
|
+
|
|
234
|
+
def test_is_case_insensitive(self):
|
|
235
|
+
input_data = [
|
|
236
|
+
": foo dup ;",
|
|
237
|
+
"1 FOO"
|
|
238
|
+
]
|
|
239
|
+
expected = [1, 1]
|
|
240
|
+
self.assertEqual(expected, evaluate(input_data))
|
|
241
|
+
|
|
242
|
+
def test_cannot_redefine_numbers(self):
|
|
243
|
+
input_data = [": 1 2 ;"]
|
|
244
|
+
with self.assertRaises(ValueError):
|
|
245
|
+
evaluate(input_data)
|
|
246
|
+
|
|
247
|
+
def test_errors_if_executing_a_non_existent_word(self):
|
|
248
|
+
input_data = ["foo"]
|
|
249
|
+
with self.assertRaises(ValueError):
|
|
250
|
+
evaluate(input_data)
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
if __name__ == '__main__':
|
|
254
|
+
unittest.main()
|
|
@@ -5,7 +5,7 @@ from datetime import datetime
|
|
|
5
5
|
from gigasecond import add_gigasecond
|
|
6
6
|
|
|
7
7
|
|
|
8
|
-
#
|
|
8
|
+
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.0.0
|
|
9
9
|
|
|
10
10
|
class GigasecondTest(unittest.TestCase):
|
|
11
11
|
def test_date_only_specification_of_time(self):
|
|
@@ -4,7 +4,7 @@ import unittest
|
|
|
4
4
|
from grep import grep
|
|
5
5
|
|
|
6
6
|
|
|
7
|
-
#
|
|
7
|
+
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.0.0
|
|
8
8
|
|
|
9
9
|
ILIADFILENAME = 'iliad.txt'
|
|
10
10
|
ILIADCONTENTS = '''Achilles sing, O Goddess! Peleus' son;
|
|
@@ -8,34 +8,34 @@ from isogram import is_isogram
|
|
|
8
8
|
class TestIsogram(unittest.TestCase):
|
|
9
9
|
|
|
10
10
|
def test_empty_string(self):
|
|
11
|
-
self.
|
|
11
|
+
self.assertIs(is_isogram(""), True)
|
|
12
12
|
|
|
13
13
|
def test_isogram_with_only_lower_case_characters(self):
|
|
14
|
-
self.
|
|
14
|
+
self.assertIs(is_isogram("isogram"), True)
|
|
15
15
|
|
|
16
16
|
def test_word_with_one_duplicated_character(self):
|
|
17
|
-
self.
|
|
17
|
+
self.assertIs(is_isogram("eleven"), False)
|
|
18
18
|
|
|
19
19
|
def test_longest_reported_english_isogram(self):
|
|
20
|
-
self.
|
|
20
|
+
self.assertIs(is_isogram("subdermatoglyphic"), True)
|
|
21
21
|
|
|
22
22
|
def test_word_with_duplicated_character_in_mixed_case(self):
|
|
23
|
-
self.
|
|
23
|
+
self.assertIs(is_isogram("Alphabet"), False)
|
|
24
24
|
|
|
25
25
|
def test_hypothetical_isogrammic_word_with_hyphen(self):
|
|
26
|
-
self.
|
|
26
|
+
self.assertIs(is_isogram("thumbscrew-japingly"), True)
|
|
27
27
|
|
|
28
28
|
def test_isogram_with_duplicated_non_letter_character(self):
|
|
29
|
-
self.
|
|
29
|
+
self.assertIs(is_isogram("Hjelmqvist-Gryb-Zock-Pfund-Wax"), True)
|
|
30
30
|
|
|
31
31
|
def test_made_up_name_that_is_an_isogram(self):
|
|
32
|
-
self.
|
|
32
|
+
self.assertIs(is_isogram("Emily Jung Schwartzkopf"), True)
|
|
33
33
|
|
|
34
34
|
def test_duplicated_character_in_the_middle(self):
|
|
35
|
-
self.
|
|
35
|
+
self.assertIs(is_isogram("accentor"), False)
|
|
36
36
|
|
|
37
37
|
def test_isogram_with_duplicated_letter_and_nonletter_character(self):
|
|
38
|
-
self.
|
|
38
|
+
self.assertIs(is_isogram("Aleph Bot Chap"), False)
|
|
39
39
|
|
|
40
40
|
|
|
41
41
|
if __name__ == '__main__':
|
|
@@ -11,7 +11,7 @@ import unittest
|
|
|
11
11
|
from largest_series_product import largest_product
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
#
|
|
14
|
+
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.0.0
|
|
15
15
|
|
|
16
16
|
class SeriesTest(unittest.TestCase):
|
|
17
17
|
def test_finds_the_largest_product_if_span_equals_length(self):
|
|
@@ -3,20 +3,20 @@ import unittest
|
|
|
3
3
|
from leap import is_leap_year
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.0.0
|
|
7
7
|
|
|
8
8
|
class YearTest(unittest.TestCase):
|
|
9
9
|
def test_year_not_divisible_by_4(self):
|
|
10
|
-
self.
|
|
10
|
+
self.assertIs(is_leap_year(2015), False)
|
|
11
11
|
|
|
12
12
|
def test_year_divisible_by_4_not_divisible_by_100(self):
|
|
13
|
-
self.
|
|
13
|
+
self.assertIs(is_leap_year(2016), True)
|
|
14
14
|
|
|
15
15
|
def test_year_divisible_by_100_not_divisible_by_400(self):
|
|
16
|
-
self.
|
|
16
|
+
self.assertIs(is_leap_year(2100), False)
|
|
17
17
|
|
|
18
18
|
def test_year_divisible_by_400(self):
|
|
19
|
-
self.
|
|
19
|
+
self.assertIs(is_leap_year(2000), True)
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
if __name__ == '__main__':
|