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
|
@@ -3,7 +3,7 @@ import unittest
|
|
|
3
3
|
from acronym import abbreviate
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.1.0
|
|
7
7
|
|
|
8
8
|
class AcronymTest(unittest.TestCase):
|
|
9
9
|
def test_basic(self):
|
|
@@ -7,7 +7,7 @@ if not hasattr(unittest.TestCase, 'assertCountEqual'):
|
|
|
7
7
|
unittest.TestCase.assertCountEqual = unittest.TestCase.assertItemsEqual
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
#
|
|
10
|
+
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.0.0
|
|
11
11
|
|
|
12
12
|
class AllergiesTests(unittest.TestCase):
|
|
13
13
|
def test_no_allergies_means_not_allergic(self):
|
|
@@ -3,7 +3,7 @@ import unittest
|
|
|
3
3
|
from alphametics import solve
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.0.0
|
|
7
7
|
|
|
8
8
|
class TestAlphametics(unittest.TestCase):
|
|
9
9
|
def test_puzzle_with_three_letters(self):
|
|
@@ -3,7 +3,7 @@ import unittest
|
|
|
3
3
|
from anagram import detect_anagrams
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.0.1
|
|
7
7
|
|
|
8
8
|
class AnagramTests(unittest.TestCase):
|
|
9
9
|
def test_no_matches(self):
|
|
@@ -3,7 +3,7 @@ import unittest
|
|
|
3
3
|
from atbash_cipher import decode, encode
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.0.0
|
|
7
7
|
|
|
8
8
|
class AtbashCipherTest(unittest.TestCase):
|
|
9
9
|
def test_encode_no(self):
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
def hey(
|
|
1
|
+
def hey(phrase):
|
|
2
2
|
pass
|
|
@@ -3,7 +3,7 @@ import unittest
|
|
|
3
3
|
from book_store import calculate_total
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.0.1
|
|
7
7
|
|
|
8
8
|
class BookStoreTests(unittest.TestCase):
|
|
9
9
|
def test_only_a_single_book(self):
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
def check_brackets(
|
|
1
|
+
def check_brackets(input_string):
|
|
2
2
|
pass
|
|
@@ -3,7 +3,7 @@ import unittest
|
|
|
3
3
|
from bracket_push import check_brackets
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.1.0
|
|
7
7
|
|
|
8
8
|
class BracketPushTests(unittest.TestCase):
|
|
9
9
|
def test_paired_square_brackets(self):
|
|
@@ -2,7 +2,7 @@ import unittest
|
|
|
2
2
|
|
|
3
3
|
from collatz_conjecture import collatz_steps
|
|
4
4
|
|
|
5
|
-
#
|
|
5
|
+
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.1.1
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
class CollatzConjectureTests(unittest.TestCase):
|
|
@@ -3,7 +3,7 @@ import unittest
|
|
|
3
3
|
from diamond import make_diamond
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.0.0
|
|
7
7
|
|
|
8
8
|
class DiamondTests(unittest.TestCase):
|
|
9
9
|
def test_degenerate_case_with_a_single_row(self):
|
|
@@ -3,7 +3,7 @@ import unittest
|
|
|
3
3
|
from difference_of_squares import difference, square_of_sum, sum_of_squares
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.1.0
|
|
7
7
|
|
|
8
8
|
class DifferenceOfSquaresTest(unittest.TestCase):
|
|
9
9
|
def test_square_of_sum_1(self):
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Diffie Hellman
|
|
2
|
+
|
|
3
|
+
Diffie-Hellman key exchange.
|
|
4
|
+
|
|
5
|
+
Alice and Bob use Diffie-Hellman key exchange to share secrets. They
|
|
6
|
+
start with prime numbers, pick private keys, generate and share public
|
|
7
|
+
keys, and then generate a shared secret key.
|
|
8
|
+
|
|
9
|
+
## Step 0
|
|
10
|
+
|
|
11
|
+
The test program supplies prime numbers p and g.
|
|
12
|
+
|
|
13
|
+
## Step 1
|
|
14
|
+
|
|
15
|
+
Alice picks a private key, a, greater than 1 and less than p. Bob does
|
|
16
|
+
the same to pick a private key b.
|
|
17
|
+
|
|
18
|
+
## Step 2
|
|
19
|
+
|
|
20
|
+
Alice calculates a public key A.
|
|
21
|
+
|
|
22
|
+
A = g**a mod p
|
|
23
|
+
|
|
24
|
+
Using the same p and g, Bob similarly calculates a public key B from his
|
|
25
|
+
private key b.
|
|
26
|
+
|
|
27
|
+
## Step 3
|
|
28
|
+
|
|
29
|
+
Alice and Bob exchange public keys. Alice calculates secret key s.
|
|
30
|
+
|
|
31
|
+
s = B**a mod p
|
|
32
|
+
|
|
33
|
+
Bob calculates
|
|
34
|
+
|
|
35
|
+
s = A**b mod p
|
|
36
|
+
|
|
37
|
+
The calculations produce the same result! Alice and Bob now share
|
|
38
|
+
secret s.
|
|
39
|
+
|
|
40
|
+
## Notes
|
|
41
|
+
|
|
42
|
+
Python, as of version 3.6, includes two different random modules. The module called `random` is pseudo-random, meaning it does not generate true randomness, but follows and algorithm that simulates randomness. Since random numbers are generated through a known algorithm, they are not truly random. The `random` module is not correctly suited for cryptography and should not be used, because it is pseudo-random. In version 3.6, Python introduced the `secrets` module, which generates cryptographically strong random numbers that provide the greater security required for cryptography. Since this is only an exercise, `random` is fine to use, but note that it would be very insecure if actually used for cryptography.
|
|
43
|
+
|
|
44
|
+
### Submitting Exercises
|
|
45
|
+
|
|
46
|
+
Note that, when trying to submit an exercise, make sure the solution is in the `exercism/python/<exerciseName>` directory.
|
|
47
|
+
|
|
48
|
+
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`.
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
For more detailed information about running tests, code style and linting,
|
|
52
|
+
please see the [help page](http://exercism.io/languages/python).
|
|
53
|
+
## Source
|
|
54
|
+
|
|
55
|
+
Wikipedia, 1024 bit key from www.cryptopp.com/wiki. [http://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange](http://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange)
|
|
56
|
+
|
|
57
|
+
## Submitting Incomplete Solutions
|
|
58
|
+
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import unittest
|
|
2
|
+
|
|
3
|
+
import diffie_hellman
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class DiffieHellmanTest(unittest.TestCase):
|
|
7
|
+
|
|
8
|
+
def test_private_in_range(self):
|
|
9
|
+
primes = [5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47]
|
|
10
|
+
for i in primes:
|
|
11
|
+
self.assertTrue(1 < diffie_hellman.private_key(i) < i)
|
|
12
|
+
|
|
13
|
+
# Can fail due to randomness, but most likely will not,
|
|
14
|
+
# due to pseudo-randomness and the large number chosen
|
|
15
|
+
def test_private_key_randomness(self):
|
|
16
|
+
p = 2147483647
|
|
17
|
+
private_keys = []
|
|
18
|
+
for i in range(5):
|
|
19
|
+
private_keys.append(diffie_hellman.private_key(p))
|
|
20
|
+
self.assertEqual(len(list(set(private_keys))), len(private_keys))
|
|
21
|
+
|
|
22
|
+
def test_public_key_correct(self):
|
|
23
|
+
p = 23
|
|
24
|
+
g = 5
|
|
25
|
+
private = 6
|
|
26
|
+
expected = 8
|
|
27
|
+
|
|
28
|
+
actual = diffie_hellman.public_key(p, g, private)
|
|
29
|
+
self.assertEqual(actual, expected)
|
|
30
|
+
|
|
31
|
+
def test_secret_key_correct(self):
|
|
32
|
+
p = 23
|
|
33
|
+
public = 19
|
|
34
|
+
private = 6
|
|
35
|
+
expected = 2
|
|
36
|
+
|
|
37
|
+
actual = diffie_hellman.secret(p, public, private)
|
|
38
|
+
self.assertEqual(actual, expected)
|
|
39
|
+
|
|
40
|
+
def test_secret_key_correct_large_nums(self):
|
|
41
|
+
p = int("""120227323036150778550155526710966921740030662\
|
|
42
|
+
69457894729842354923526575959371158734103742634711454153\
|
|
43
|
+
30066288563005527069961435922404533456428692335628867529\
|
|
44
|
+
30249953227657883929905072620233073626594386072962776144\
|
|
45
|
+
69143365881426187411323246174903542571280506720291038940\
|
|
46
|
+
7991986070558964461330091797026762932543""".replace(
|
|
47
|
+
"\n", "").replace(" ", ""))
|
|
48
|
+
public = int("""7520544115435791944292554616920871123548\
|
|
49
|
+
58559049691782063133092992058683123990461493675163366079\
|
|
50
|
+
66149689640419216591714331722664409474612463910928128055\
|
|
51
|
+
99415792293044373353565984826436410603792531597409532111\
|
|
52
|
+
27577117569121441377056137760635413505489115127155125391\
|
|
53
|
+
86192176020596861210448363099541947258202188""".replace(
|
|
54
|
+
"\n", "").replace(" ", ""))
|
|
55
|
+
private = int("""248347939362593293991108130435688850515\
|
|
56
|
+
37971354473275017926961991904690152151776307586179022004\
|
|
57
|
+
17377685436170904594686456961202706692908603181062371925\
|
|
58
|
+
882""".replace("\n", "").replace(" ", ""))
|
|
59
|
+
expected = int("""70900735223964890815905879227737819348\
|
|
60
|
+
80851869892044649134650898046120174656773533145582564442\
|
|
61
|
+
98779465564310958207858354973848497783442169812282262526\
|
|
62
|
+
39932672153547963980483673419756271345828771971984887453\
|
|
63
|
+
01448857224581986445413661898091472983952358126388674082\
|
|
64
|
+
1363010486083940557620831348661126601106717071""".replace(
|
|
65
|
+
"\n", "").replace(" ", ""))
|
|
66
|
+
|
|
67
|
+
actual = diffie_hellman.secret(p, public, private)
|
|
68
|
+
self.assertEqual(actual, expected)
|
|
69
|
+
|
|
70
|
+
def test_exchange(self):
|
|
71
|
+
p = 23
|
|
72
|
+
g = 5
|
|
73
|
+
|
|
74
|
+
privateA = diffie_hellman.private_key(p)
|
|
75
|
+
privateB = diffie_hellman.private_key(p)
|
|
76
|
+
|
|
77
|
+
publicA = diffie_hellman.public_key(p, g, privateA)
|
|
78
|
+
publicB = diffie_hellman.public_key(p, g, privateB)
|
|
79
|
+
|
|
80
|
+
secretA = diffie_hellman.secret(p, publicB, privateA)
|
|
81
|
+
secretB = diffie_hellman.secret(p, publicA, privateB)
|
|
82
|
+
|
|
83
|
+
self.assertEqual(secretA, secretB)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
if __name__ == '__main__':
|
|
87
|
+
unittest.main()
|
|
@@ -3,7 +3,7 @@ import unittest
|
|
|
3
3
|
from etl import transform
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.0.0
|
|
7
7
|
|
|
8
8
|
class TransformTest(unittest.TestCase):
|
|
9
9
|
def test_a_single_letter(self):
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# Food chain
|
|
2
|
+
|
|
3
|
+
Generate the lyrics of the song 'I Know an Old Lady Who Swallowed a Fly'.
|
|
4
|
+
|
|
5
|
+
While you could copy/paste the lyrics,
|
|
6
|
+
or read them from a file, this problem is much more
|
|
7
|
+
interesting if you approach it algorithmically.
|
|
8
|
+
|
|
9
|
+
This is a [cumulative song](http://en.wikipedia.org/wiki/Cumulative_song) of unknown origin.
|
|
10
|
+
|
|
11
|
+
This is one of many common variants.
|
|
12
|
+
|
|
13
|
+
```text
|
|
14
|
+
I know an old lady who swallowed a fly.
|
|
15
|
+
I don't know why she swallowed the fly. Perhaps she'll die.
|
|
16
|
+
|
|
17
|
+
I know an old lady who swallowed a spider.
|
|
18
|
+
It wriggled and jiggled and tickled inside her.
|
|
19
|
+
She swallowed the spider to catch the fly.
|
|
20
|
+
I don't know why she swallowed the fly. Perhaps she'll die.
|
|
21
|
+
|
|
22
|
+
I know an old lady who swallowed a bird.
|
|
23
|
+
How absurd to swallow a bird!
|
|
24
|
+
She swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.
|
|
25
|
+
She swallowed the spider to catch the fly.
|
|
26
|
+
I don't know why she swallowed the fly. Perhaps she'll die.
|
|
27
|
+
|
|
28
|
+
I know an old lady who swallowed a cat.
|
|
29
|
+
Imagine that, to swallow a cat!
|
|
30
|
+
She swallowed the cat to catch the bird.
|
|
31
|
+
She swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.
|
|
32
|
+
She swallowed the spider to catch the fly.
|
|
33
|
+
I don't know why she swallowed the fly. Perhaps she'll die.
|
|
34
|
+
|
|
35
|
+
I know an old lady who swallowed a dog.
|
|
36
|
+
What a hog, to swallow a dog!
|
|
37
|
+
She swallowed the dog to catch the cat.
|
|
38
|
+
She swallowed the cat to catch the bird.
|
|
39
|
+
She swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.
|
|
40
|
+
She swallowed the spider to catch the fly.
|
|
41
|
+
I don't know why she swallowed the fly. Perhaps she'll die.
|
|
42
|
+
|
|
43
|
+
I know an old lady who swallowed a goat.
|
|
44
|
+
Just opened her throat and swallowed a goat!
|
|
45
|
+
She swallowed the goat to catch the dog.
|
|
46
|
+
She swallowed the dog to catch the cat.
|
|
47
|
+
She swallowed the cat to catch the bird.
|
|
48
|
+
She swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.
|
|
49
|
+
She swallowed the spider to catch the fly.
|
|
50
|
+
I don't know why she swallowed the fly. Perhaps she'll die.
|
|
51
|
+
|
|
52
|
+
I know an old lady who swallowed a cow.
|
|
53
|
+
I don't know how she swallowed a cow!
|
|
54
|
+
She swallowed the cow to catch the goat.
|
|
55
|
+
She swallowed the goat to catch the dog.
|
|
56
|
+
She swallowed the dog to catch the cat.
|
|
57
|
+
She swallowed the cat to catch the bird.
|
|
58
|
+
She swallowed the bird to catch the spider that wriggled and jiggled and tickled inside her.
|
|
59
|
+
She swallowed the spider to catch the fly.
|
|
60
|
+
I don't know why she swallowed the fly. Perhaps she'll die.
|
|
61
|
+
|
|
62
|
+
I know an old lady who swallowed a horse.
|
|
63
|
+
She's dead, of course!
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Submitting Exercises
|
|
67
|
+
|
|
68
|
+
Note that, when trying to submit an exercise, make sure the solution is in the `exercism/python/<exerciseName>` directory.
|
|
69
|
+
|
|
70
|
+
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`.
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
For more detailed information about running tests, code style and linting,
|
|
74
|
+
please see the [help page](http://exercism.io/languages/python).
|
|
75
|
+
|
|
76
|
+
## Source
|
|
77
|
+
|
|
78
|
+
Inspired by the Extreme Startup game [https://github.com/rchatley/extreme_startup](https://github.com/rchatley/extreme_startup)
|
|
79
|
+
|
|
80
|
+
## Submitting Incomplete Solutions
|
|
81
|
+
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
def chain():
|
|
2
|
+
|
|
3
|
+
animals = ["fly", "spider", "bird", "cat", "dog", "goat", "cow", "horse"]
|
|
4
|
+
|
|
5
|
+
phrases = [" wriggled and jiggled and tickled inside her.",
|
|
6
|
+
"How absurd to swallow a bird!",
|
|
7
|
+
"Imagine that, to swallow a cat!",
|
|
8
|
+
"What a hog, to swallow a dog!",
|
|
9
|
+
"Just opened her throat and swallowed a goat!",
|
|
10
|
+
"I don't know how she swallowed a cow!",
|
|
11
|
+
"She's dead, of course!"]
|
|
12
|
+
|
|
13
|
+
old_lady = "I know an old lady who swallowed a "
|
|
14
|
+
swallowed = "She swallowed the <animal> to catch the "
|
|
15
|
+
die = "I don't know why she swallowed the fly. Perhaps she'll die."
|
|
16
|
+
|
|
17
|
+
song = ""
|
|
18
|
+
verse = ""
|
|
19
|
+
chain = ""
|
|
20
|
+
|
|
21
|
+
for number, animal in enumerate(animals):
|
|
22
|
+
verse = old_lady + animal + ".\n"
|
|
23
|
+
|
|
24
|
+
if number == 7:
|
|
25
|
+
verse += phrases[6]
|
|
26
|
+
else:
|
|
27
|
+
if number == 0:
|
|
28
|
+
chain = swallowed + animal + '.\n'
|
|
29
|
+
elif number == 1:
|
|
30
|
+
verse += "It" + phrases[0] + "\n"
|
|
31
|
+
chain = chain.replace("<animal>", animal)
|
|
32
|
+
verse += chain
|
|
33
|
+
chain = swallowed+animal+" that"+phrases[0]+"\n"+chain
|
|
34
|
+
else:
|
|
35
|
+
verse += phrases[number-1] + "\n"
|
|
36
|
+
chain = chain.replace("<animal>", animal)
|
|
37
|
+
verse += chain
|
|
38
|
+
chain = swallowed + animal + ".\n" + chain
|
|
39
|
+
|
|
40
|
+
verse += die + "\n"
|
|
41
|
+
|
|
42
|
+
verse += "\n"
|
|
43
|
+
song += verse
|
|
44
|
+
|
|
45
|
+
return song
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import unittest
|
|
2
|
+
|
|
3
|
+
from food_chain import chain
|
|
4
|
+
|
|
5
|
+
# Tests adapted from `problem-specifications//canonical-data.json` @ v1.0.0
|
|
6
|
+
|
|
7
|
+
song = """I know an old lady who swallowed a fly.
|
|
8
|
+
I don't know why she swallowed the fly. Perhaps she'll die.
|
|
9
|
+
|
|
10
|
+
I know an old lady who swallowed a spider.
|
|
11
|
+
It wriggled and jiggled and tickled inside her.
|
|
12
|
+
She swallowed the spider to catch the fly.
|
|
13
|
+
I don't know why she swallowed the fly. Perhaps she'll die.
|
|
14
|
+
|
|
15
|
+
I know an old lady who swallowed a bird.
|
|
16
|
+
How absurd to swallow a bird!
|
|
17
|
+
She swallowed the bird to catch the spider that wriggled
|
|
18
|
+
and jiggled and tickled inside her.
|
|
19
|
+
She swallowed the spider to catch the fly.
|
|
20
|
+
I don't know why she swallowed the fly. Perhaps she'll die.
|
|
21
|
+
|
|
22
|
+
I know an old lady who swallowed a cat.
|
|
23
|
+
Imagine that, to swallow a cat!
|
|
24
|
+
She swallowed the cat to catch the bird.
|
|
25
|
+
She swallowed the bird to catch the spider that wriggled
|
|
26
|
+
and jiggled and tickled inside her.
|
|
27
|
+
She swallowed the spider to catch the fly.
|
|
28
|
+
I don't know why she swallowed the fly. Perhaps she'll die.
|
|
29
|
+
|
|
30
|
+
I know an old lady who swallowed a dog.
|
|
31
|
+
What a hog, to swallow a dog!
|
|
32
|
+
She swallowed the dog to catch the cat.
|
|
33
|
+
She swallowed the cat to catch the bird.
|
|
34
|
+
She swallowed the bird to catch the spider that wriggled
|
|
35
|
+
and jiggled and tickled inside her.
|
|
36
|
+
She swallowed the spider to catch the fly.
|
|
37
|
+
I don't know why she swallowed the fly. Perhaps she'll die.
|
|
38
|
+
|
|
39
|
+
I know an old lady who swallowed a goat.
|
|
40
|
+
Just opened her throat and swallowed a goat!
|
|
41
|
+
She swallowed the goat to catch the dog.
|
|
42
|
+
She swallowed the dog to catch the cat.
|
|
43
|
+
She swallowed the cat to catch the bird.
|
|
44
|
+
She swallowed the bird to catch the spider that wriggled
|
|
45
|
+
and jiggled and tickled inside her.
|
|
46
|
+
She swallowed the spider to catch the fly.
|
|
47
|
+
I don't know why she swallowed the fly. Perhaps she'll die.
|
|
48
|
+
|
|
49
|
+
I know an old lady who swallowed a cow.
|
|
50
|
+
I don't know how she swallowed a cow!
|
|
51
|
+
She swallowed the cow to catch the goat.
|
|
52
|
+
She swallowed the goat to catch the dog.
|
|
53
|
+
She swallowed the dog to catch the cat.
|
|
54
|
+
She swallowed the cat to catch the bird.
|
|
55
|
+
She swallowed the bird to catch the spider that wriggled
|
|
56
|
+
and jiggled and tickled inside her.
|
|
57
|
+
She swallowed the spider to catch the fly.
|
|
58
|
+
I don't know why she swallowed the fly. Perhaps she'll die.
|
|
59
|
+
|
|
60
|
+
I know an old lady who swallowed a horse.
|
|
61
|
+
She's dead, of course!"""
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def verses(letter):
|
|
65
|
+
return letter.replace('die.', 'die.slice').split('slice')
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
original = [verse.replace("\n", "").replace(" ", "").lower()
|
|
69
|
+
for verse in verses(song)]
|
|
70
|
+
|
|
71
|
+
generated = [verse.replace("\n", "").replace(" ", "").lower()
|
|
72
|
+
for verse in verses(chain())]
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class FoodChainTest(unittest.TestCase):
|
|
76
|
+
|
|
77
|
+
def test_fly(self):
|
|
78
|
+
self.assertEqual(original[0], generated[0])
|
|
79
|
+
|
|
80
|
+
def test_spider(self):
|
|
81
|
+
self.assertEqual(original[1], generated[1])
|
|
82
|
+
|
|
83
|
+
def test_bird(self):
|
|
84
|
+
self.assertEqual(original[2], generated[2])
|
|
85
|
+
|
|
86
|
+
def test_cat(self):
|
|
87
|
+
self.assertEqual(original[3], generated[3])
|
|
88
|
+
|
|
89
|
+
def test_dog(self):
|
|
90
|
+
self.assertEqual(original[4], generated[4])
|
|
91
|
+
|
|
92
|
+
def test_goat(self):
|
|
93
|
+
self.assertEqual(original[5], generated[5])
|
|
94
|
+
|
|
95
|
+
def test_cow(self):
|
|
96
|
+
self.assertEqual(original[6], generated[6])
|
|
97
|
+
|
|
98
|
+
def test_horse(self):
|
|
99
|
+
self.assertEqual(original[7], generated[7])
|
|
100
|
+
|
|
101
|
+
def test_multiple_verses(self):
|
|
102
|
+
self.assertEqual(original[0:3], generated[0:3])
|
|
103
|
+
|
|
104
|
+
def test_full_song(self):
|
|
105
|
+
self.assertEqual(original, generated)
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
if __name__ == '__main__':
|
|
109
|
+
unittest.main()
|