trackler 2.2.1.99 → 2.2.1.100
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/problem-specifications/exercises/clock/canonical-data.json +303 -204
- data/problem-specifications/exercises/complex-numbers/canonical-data.json +104 -44
- data/problem-specifications/exercises/matrix/canonical-data.json +78 -0
- data/problem-specifications/exercises/word-count/canonical-data.json +12 -12
- data/tracks/bash/config.json +128 -110
- data/tracks/c/exercises/word-count/test/test_word_count.c +2 -2
- data/tracks/dart/CONTRIBUTING.md +2 -2
- data/tracks/dart/docs/EXERCISE_README_INSERT.md +0 -1
- data/tracks/dart/docs/INSTALLATION.md +17 -11
- data/tracks/fsharp/exercises/acronym/AcronymTest.fs +3 -7
- data/tracks/fsharp/exercises/anagram/AnagramTest.fs +1 -21
- data/tracks/fsharp/exercises/book-store/BookStoreTest.fs +1 -1
- data/tracks/fsharp/exercises/complex-numbers/ComplexNumbersTest.fs +25 -25
- data/tracks/fsharp/exercises/custom-set/CustomSetTest.fs +1 -1
- data/tracks/fsharp/exercises/food-chain/FoodChainTest.fs +1 -1
- data/tracks/fsharp/exercises/gigasecond/GigasecondTest.fs +1 -1
- data/tracks/fsharp/exercises/hamming/HammingTest.fs +1 -1
- data/tracks/fsharp/exercises/hello-world/HelloWorldTest.fs +1 -1
- data/tracks/fsharp/exercises/largest-series-product/LargestSeriesProductTest.fs +1 -1
- data/tracks/fsharp/exercises/leap/LeapTest.fs +1 -1
- data/tracks/fsharp/exercises/markdown/MarkdownTest.fs +19 -19
- data/tracks/fsharp/exercises/minesweeper/MinesweeperTest.fs +27 -27
- data/tracks/fsharp/exercises/nth-prime/NthPrimeTest.fs +1 -1
- data/tracks/fsharp/exercises/nucleotide-count/NucleotideCountTest.fs +1 -1
- data/tracks/fsharp/exercises/pangram/PangramTest.fs +1 -1
- data/tracks/fsharp/exercises/pascals-triangle/PascalsTriangleTest.fs +1 -1
- data/tracks/fsharp/exercises/perfect-numbers/PerfectNumbersTest.fs +1 -1
- data/tracks/fsharp/exercises/phone-number/PhoneNumberTest.fs +11 -3
- data/tracks/fsharp/exercises/pig-latin/PigLatinTest.fs +1 -1
- data/tracks/fsharp/exercises/protein-translation/Example.fs +2 -2
- data/tracks/fsharp/exercises/protein-translation/ProteinTranslation.fs +1 -1
- data/tracks/fsharp/exercises/protein-translation/ProteinTranslationTest.fs +94 -60
- data/tracks/fsharp/exercises/react/ReactTest.fs +1 -1
- data/tracks/fsharp/exercises/rna-transcription/RnaTranscriptionTest.fs +1 -1
- data/tracks/fsharp/exercises/roman-numerals/RomanNumeralsTest.fs +1 -1
- data/tracks/fsharp/exercises/rotational-cipher/RotationalCipherTest.fs +1 -1
- data/tracks/fsharp/exercises/say/Example.fs +1 -1
- data/tracks/fsharp/exercises/say/SayTest.fs +21 -24
- data/tracks/fsharp/exercises/scrabble-score/ScrabbleScoreTest.fs +1 -1
- data/tracks/fsharp/exercises/secret-handshake/Example.fs +2 -2
- data/tracks/fsharp/exercises/secret-handshake/SecretHandshake.fs +1 -1
- data/tracks/fsharp/exercises/secret-handshake/SecretHandshakeTest.fs +39 -22
- data/tracks/fsharp/exercises/sieve/Example.fs +1 -1
- data/tracks/fsharp/exercises/sieve/Sieve.fs +1 -1
- data/tracks/fsharp/exercises/sieve/SieveTest.fs +19 -21
- data/tracks/fsharp/exercises/spiral-matrix/SpiralMatrixTest.fs +1 -1
- data/tracks/fsharp/exercises/sum-of-multiples/Example.fs +1 -1
- data/tracks/fsharp/exercises/sum-of-multiples/SumOfMultiples.fs +1 -1
- data/tracks/fsharp/exercises/sum-of-multiples/SumOfMultiplesTest.fs +44 -14
- data/tracks/fsharp/exercises/twelve-days/TwelveDaysTest.fs +1 -1
- data/tracks/fsharp/exercises/two-fer/Example.fs +1 -1
- data/tracks/fsharp/exercises/two-fer/TwoFer.fs +1 -1
- data/tracks/fsharp/exercises/two-fer/TwoFerTest.fs +4 -4
- data/tracks/fsharp/exercises/word-count/Example.fs +2 -2
- data/tracks/fsharp/exercises/word-count/WordCount.fs +2 -2
- data/tracks/fsharp/exercises/word-count/WordCountTest.fs +80 -100
- data/tracks/fsharp/exercises/wordy/Example.fs +2 -3
- data/tracks/fsharp/exercises/wordy/Wordy.fs +1 -1
- data/tracks/fsharp/exercises/wordy/WordyTest.fs +51 -49
- data/tracks/fsharp/exercises/zebra-puzzle/Example.fs +4 -4
- data/tracks/fsharp/exercises/zebra-puzzle/ZebraPuzzleTest.fs +7 -8
- data/tracks/fsharp/generators/Common.fs +3 -1
- data/tracks/fsharp/generators/Exercise.fs +12 -1
- data/tracks/fsharp/generators/Generators.fs +89 -42
- data/tracks/fsharp/generators/Generators.fsproj +1 -0
- data/tracks/fsharp/generators/Options.fs +14 -7
- data/tracks/fsharp/generators/Program.fs +3 -0
- data/tracks/fsharp/generators/Rendering.fs +0 -1
- data/tracks/fsharp/generators/Track.fs +26 -0
- data/tracks/go/exercises/custom-set/.meta/gen.go +16 -14
- data/tracks/go/exercises/custom-set/cases_test.go +2 -2
- data/tracks/java/exercises/food-chain/.meta/version +1 -0
- data/tracks/java/exercises/sieve/.meta/version +1 -0
- data/tracks/java/exercises/sieve/src/test/java/SieveTest.java +17 -0
- data/tracks/java/exercises/twelve-days/.meta/version +1 -0
- data/tracks/java/exercises/twelve-days/src/test/java/TwelveDaysTest.java +15 -3
- data/tracks/java/exercises/two-fer/.meta/version +1 -0
- data/tracks/java/exercises/two-fer/src/test/java/TwoferTest.java +0 -9
- data/tracks/ocaml/config/exercise_readme.go.tmpl +38 -4
- data/tracks/ocaml/exercises/acronym/README.md +0 -2
- data/tracks/ocaml/exercises/all-your-base/README.md +1 -3
- data/tracks/ocaml/exercises/anagram/README.md +0 -1
- data/tracks/ocaml/exercises/atbash-cipher/README.md +2 -2
- data/tracks/ocaml/exercises/beer-song/README.md +2 -3
- data/tracks/ocaml/exercises/binary-search/README.md +0 -1
- data/tracks/ocaml/exercises/bob/README.md +2 -1
- data/tracks/ocaml/exercises/bowling/README.md +20 -7
- data/tracks/ocaml/exercises/bracket-push/README.md +0 -1
- data/tracks/ocaml/exercises/change/README.md +1 -2
- data/tracks/ocaml/exercises/connect/README.md +1 -3
- data/tracks/ocaml/exercises/custom-set/README.md +0 -2
- data/tracks/ocaml/exercises/difference-of-squares/README.md +0 -1
- data/tracks/ocaml/exercises/dominoes/README.md +3 -5
- data/tracks/ocaml/exercises/etl/README.md +3 -2
- data/tracks/ocaml/exercises/forth/README.md +0 -2
- data/tracks/ocaml/exercises/grade-school/README.md +0 -1
- data/tracks/ocaml/exercises/hamming/README.md +0 -1
- data/tracks/ocaml/exercises/hangman/README.md +0 -2
- data/tracks/ocaml/exercises/hello-world/README.md +0 -1
- data/tracks/ocaml/exercises/hexadecimal/README.md +0 -1
- data/tracks/ocaml/exercises/leap/README.md +1 -2
- data/tracks/ocaml/exercises/list-ops/README.md +0 -2
- data/tracks/ocaml/exercises/luhn/README.md +7 -8
- data/tracks/ocaml/exercises/meetup/README.md +16 -14
- data/tracks/ocaml/exercises/minesweeper/README.md +0 -2
- data/tracks/ocaml/exercises/nucleotide-count/README.md +8 -23
- data/tracks/ocaml/exercises/palindrome-products/README.md +0 -1
- data/tracks/ocaml/exercises/pangram/README.md +1 -2
- data/tracks/ocaml/exercises/phone-number/README.md +4 -4
- data/tracks/ocaml/exercises/prime-factors/README.md +0 -1
- data/tracks/ocaml/exercises/raindrops/README.md +0 -1
- data/tracks/ocaml/exercises/react/README.md +0 -2
- data/tracks/ocaml/{docs/EXERCISE_README_INSERT.md → exercises/rectangles/README.md} +67 -0
- data/tracks/ocaml/exercises/rna-transcription/README.md +1 -2
- data/tracks/ocaml/exercises/robot-name/README.md +0 -1
- data/tracks/ocaml/exercises/roman-numerals/README.md +1 -2
- data/tracks/ocaml/exercises/run-length-encoding/README.md +4 -5
- data/tracks/ocaml/exercises/say/README.md +0 -1
- data/tracks/ocaml/exercises/space-age/README.md +1 -2
- data/tracks/ocaml/exercises/triangle/README.md +8 -6
- data/tracks/ocaml/exercises/word-count/README.md +1 -3
- data/tracks/ocaml/exercises/zipper/README.md +1 -3
- data/tracks/perl6/.travis.yml +1 -1
- data/tracks/perl6/bin/README.md +1 -2
- data/tracks/perl6/bin/exercise-gen.pl6 +18 -18
- data/tracks/perl6/config.json +1 -0
- data/tracks/perl6/exercises/accumulate/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/accumulate/{Example.pm6 → .meta/solutions/Accumulate.pm6} +0 -0
- data/tracks/perl6/exercises/acronym/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/acronym/{Example.pm6 → .meta/solutions/Acronym.pm6} +0 -0
- data/tracks/perl6/exercises/all-your-base/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/all-your-base/{Example.pm6 → .meta/solutions/AllYourBase.pm6} +0 -0
- data/tracks/perl6/exercises/allergies/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/allergies/{Example.pm6 → .meta/solutions/Allergies.pm6} +0 -0
- data/tracks/perl6/exercises/anagram/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/anagram/{Example.pm6 → .meta/solutions/Anagram.pm6} +0 -0
- data/tracks/perl6/exercises/atbash-cipher/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/atbash-cipher/{Example.pm6 → .meta/solutions/AtbashCipher.pm6} +0 -0
- data/tracks/perl6/exercises/binary/{Example.pm6 → .meta/solutions/Trinary.pm6} +0 -0
- data/tracks/perl6/exercises/bob/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/bob/{Example.pm6 → .meta/solutions/Bob.pm6} +0 -0
- data/tracks/perl6/exercises/clock/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/clock/{Example.pm6 → .meta/solutions/Clock.pm6} +0 -0
- data/tracks/perl6/exercises/etl/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/etl/{Example.pm6 → .meta/solutions/ETL.pm6} +0 -0
- data/tracks/perl6/exercises/flatten-array/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/flatten-array/{Example.pm6 → .meta/solutions/FlattenArray.pm6} +0 -0
- data/tracks/perl6/exercises/grade-school/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/grade-school/{Example.pm6 → .meta/solutions/GradeSchool.pm6} +0 -0
- data/tracks/perl6/exercises/grains/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/grains/{Example.pm6 → .meta/solutions/Grains.pm6} +0 -0
- data/tracks/perl6/exercises/hamming/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/hamming/{Example.pm6 → .meta/solutions/Hamming.pm6} +0 -0
- data/tracks/perl6/exercises/hello-world/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/hello-world/{Example.pm6 → .meta/solutions/HelloWorld.pm6} +0 -0
- data/tracks/perl6/exercises/leap/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/leap/{Example.pm6 → .meta/solutions/Leap.pm6} +0 -0
- data/tracks/perl6/exercises/linked-list/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/linked-list/{Example.pm6 → .meta/solutions/LinkedList.pm6} +0 -0
- data/tracks/perl6/exercises/luhn/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/luhn/{Example.pm6 → .meta/solutions/Luhn.pm6} +0 -0
- data/tracks/perl6/exercises/meetup/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/meetup/{Example.pm6 → .meta/solutions/Meetup.pm6} +0 -0
- data/tracks/perl6/exercises/nucleotide-count/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/nucleotide-count/{Example.pm6 → .meta/solutions/NucleotideCount.pm6} +0 -0
- data/tracks/perl6/exercises/pangram/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/pangram/{Example.pm6 → .meta/solutions/Pangram.pm6} +0 -0
- data/tracks/perl6/exercises/phone-number/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/phone-number/{Example.pm6 → .meta/solutions/Phone.pm6} +0 -0
- data/tracks/perl6/exercises/raindrops/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/raindrops/{Example.pm6 → .meta/solutions/Raindrops.pm6} +0 -0
- data/tracks/perl6/exercises/rna-transcription/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/rna-transcription/{Example.pm6 → .meta/solutions/RNA.pm6} +0 -0
- data/tracks/perl6/exercises/robot-name/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/robot-name/{Example.pm6 → .meta/solutions/Robot.pm6} +0 -0
- data/tracks/perl6/exercises/roman-numerals/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/roman-numerals/{Example.pm6 → .meta/solutions/RomanNumerals.pm6} +0 -0
- data/tracks/perl6/exercises/scrabble-score/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/scrabble-score/{Example.pm6 → .meta/solutions/Scrabble.pm6} +0 -0
- data/tracks/perl6/exercises/space-age/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/space-age/{Example.pm6 → .meta/solutions/SpaceAge.pm6} +0 -0
- data/tracks/perl6/exercises/trinary/{Example.pm6 → .meta/solutions/Trinary.pm6} +0 -0
- data/tracks/perl6/exercises/two-fer/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/two-fer/{Example.pm6 → .meta/solutions/TwoFer.pm6} +0 -0
- data/tracks/perl6/exercises/word-count/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/word-count/{Example.pm6 → .meta/solutions/WordCount.pm6} +0 -0
- data/tracks/perl6/exercises/wordy/{example.yaml → .meta/exercise-data.yaml} +0 -0
- data/tracks/perl6/exercises/wordy/{Example.pm6 → .meta/solutions/Wordy.pm6} +0 -0
- data/tracks/perl6/t/generated-tests.t +2 -2
- data/tracks/python/config.json +12 -0
- data/tracks/python/exercises/bowling/.gitignore +0 -0
- data/tracks/python/exercises/bowling/bowling.py +11 -0
- data/tracks/python/exercises/bowling/bowling_test.py +193 -0
- data/tracks/python/exercises/bowling/example.py +149 -0
- data/tracks/python/exercises/say/say_test.py +1 -1
- data/tracks/ruby/README.md +121 -97
- data/tracks/ruby/config/exercise_readme.go.tmpl +23 -4
- data/tracks/ruby/exercises/accumulate/{HINTS.md → .meta/hints.md} +0 -0
- data/tracks/ruby/exercises/accumulate/README.md +3 -5
- data/tracks/ruby/exercises/acronym/README.md +3 -6
- data/tracks/ruby/exercises/all-your-base/README.md +4 -7
- data/tracks/ruby/exercises/allergies/README.md +3 -6
- data/tracks/ruby/exercises/alphametics/README.md +5 -8
- data/tracks/ruby/exercises/anagram/README.md +3 -5
- data/tracks/ruby/exercises/atbash-cipher/README.md +5 -6
- data/tracks/ruby/exercises/beer-song/README.md +5 -7
- data/tracks/ruby/exercises/binary-search-tree/README.md +3 -5
- data/tracks/ruby/exercises/binary-search/README.md +3 -5
- data/tracks/ruby/exercises/binary/README.md +5 -5
- data/tracks/ruby/exercises/bob/README.md +3 -5
- data/tracks/ruby/exercises/book-store/README.md +3 -5
- data/tracks/ruby/exercises/bowling/README.md +23 -11
- data/tracks/ruby/exercises/bracket-push/README.md +3 -5
- data/tracks/ruby/exercises/change/README.md +3 -5
- data/tracks/ruby/exercises/circular-buffer/README.md +16 -11
- data/tracks/ruby/exercises/clock/README.md +3 -5
- data/tracks/ruby/exercises/collatz-conjecture/README.md +4 -6
- data/tracks/ruby/exercises/complex-numbers/README.md +6 -8
- data/tracks/ruby/exercises/connect/README.md +4 -7
- data/tracks/ruby/exercises/crypto-square/README.md +3 -5
- data/tracks/ruby/exercises/custom-set/README.md +3 -6
- data/tracks/ruby/exercises/diamond/README.md +9 -11
- data/tracks/ruby/exercises/difference-of-squares/README.md +3 -5
- data/tracks/ruby/exercises/dominoes/README.md +6 -9
- data/tracks/ruby/exercises/etl/README.md +6 -6
- data/tracks/ruby/exercises/flatten-array/README.md +5 -8
- data/tracks/ruby/exercises/food-chain/README.md +4 -6
- data/tracks/ruby/exercises/gigasecond/README.md +3 -5
- data/tracks/ruby/exercises/grade-school/README.md +3 -6
- data/tracks/ruby/exercises/grains/README.md +3 -6
- data/tracks/ruby/exercises/hamming/README.md +3 -5
- data/tracks/ruby/exercises/hello-world/README.md +1 -3
- data/tracks/ruby/exercises/hexadecimal/README.md +3 -5
- data/tracks/ruby/exercises/house/README.md +5 -8
- data/tracks/ruby/exercises/isbn-verifier/README.md +4 -6
- data/tracks/ruby/exercises/isogram/README.md +5 -6
- data/tracks/ruby/exercises/kindergarten-garden/README.md +16 -18
- data/tracks/ruby/exercises/largest-series-product/README.md +3 -5
- data/tracks/ruby/exercises/leap/README.md +4 -6
- data/tracks/ruby/exercises/linked-list/README.md +13 -15
- data/tracks/ruby/exercises/list-ops/README.md +3 -6
- data/tracks/ruby/exercises/luhn/README.md +10 -12
- data/tracks/ruby/exercises/matrix/README.md +9 -9
- data/tracks/ruby/exercises/meetup/README.md +19 -18
- data/tracks/ruby/exercises/minesweeper/README.md +3 -6
- data/tracks/ruby/exercises/nth-prime/README.md +3 -5
- data/tracks/ruby/exercises/nucleotide-count/README.md +11 -27
- data/tracks/ruby/exercises/ocr-numbers/README.md +9 -11
- data/tracks/ruby/exercises/octal/README.md +9 -7
- data/tracks/ruby/exercises/palindrome-products/README.md +8 -17
- data/tracks/ruby/exercises/pangram/README.md +4 -6
- data/tracks/ruby/exercises/pascals-triangle/README.md +5 -7
- data/tracks/ruby/exercises/perfect-numbers/README.md +5 -7
- data/tracks/ruby/exercises/phone-number/README.md +7 -8
- data/tracks/ruby/exercises/pig-latin/README.md +3 -5
- data/tracks/ruby/exercises/point-mutations/README.md +3 -5
- data/tracks/ruby/exercises/poker/README.md +3 -5
- data/tracks/ruby/exercises/prime-factors/README.md +3 -5
- data/tracks/ruby/exercises/protein-translation/README.md +7 -10
- data/tracks/ruby/exercises/proverb/README.md +17 -14
- data/tracks/ruby/exercises/pythagorean-triplet/README.md +6 -8
- data/tracks/ruby/exercises/queen-attack/README.md +4 -6
- data/tracks/ruby/exercises/rail-fence-cipher/README.md +15 -12
- data/tracks/ruby/exercises/raindrops/README.md +3 -5
- data/tracks/ruby/exercises/rna-transcription/README.md +4 -6
- data/tracks/ruby/exercises/robot-name/{HINTS.md → .meta/hints.md} +0 -0
- data/tracks/ruby/exercises/robot-name/README.md +3 -5
- data/tracks/ruby/exercises/robot-simulator/README.md +3 -5
- data/tracks/ruby/exercises/roman-numerals/README.md +4 -6
- data/tracks/ruby/exercises/rotational-cipher/README.md +3 -5
- data/tracks/ruby/exercises/run-length-encoding/README.md +7 -9
- data/tracks/ruby/exercises/saddle-points/README.md +5 -7
- data/tracks/ruby/exercises/say/README.md +3 -5
- data/tracks/ruby/exercises/scale-generator/README.md +3 -7
- data/tracks/ruby/exercises/scrabble-score/README.md +6 -6
- data/tracks/ruby/exercises/secret-handshake/README.md +4 -6
- data/tracks/ruby/exercises/series/README.md +3 -5
- data/tracks/ruby/exercises/sieve/README.md +3 -5
- data/tracks/ruby/exercises/simple-cipher/README.md +7 -11
- data/tracks/ruby/exercises/simple-linked-list/README.md +3 -5
- data/tracks/ruby/exercises/space-age/README.md +4 -6
- data/tracks/ruby/exercises/strain/README.md +3 -5
- data/tracks/ruby/exercises/sum-of-multiples/README.md +6 -11
- data/tracks/ruby/exercises/tournament/README.md +8 -11
- data/tracks/ruby/exercises/transpose/README.md +10 -12
- data/tracks/ruby/exercises/triangle/README.md +12 -11
- data/tracks/ruby/exercises/trinary/README.md +4 -6
- data/tracks/ruby/exercises/twelve-days/README.md +4 -6
- data/tracks/ruby/exercises/two-bucket/README.md +13 -15
- data/tracks/ruby/exercises/two-fer/README.md +13 -39
- data/tracks/ruby/exercises/word-count/README.md +4 -7
- data/tracks/ruby/exercises/wordy/README.md +3 -10
- metadata +77 -68
- data/tracks/ruby/docs/EXERCISE_README_INSERT.md +0 -24
data/tracks/ruby/README.md
CHANGED
@@ -7,20 +7,20 @@ Exercism Exercises in Ruby
|
|
7
7
|
|
8
8
|
## Setup
|
9
9
|
|
10
|
-
You'll need a recent (2.1+) version of Ruby, but that's it. Minitest ships
|
11
|
-
the language, so you're all set.
|
10
|
+
You'll need a recent (2.1+) version of Ruby, but that's it. Minitest ships
|
11
|
+
with the language, so you're all set.
|
12
12
|
|
13
13
|
## Anatomy of an Exercise
|
14
14
|
|
15
15
|
The files for an exercise live in `exercises/<slug>`. The slug for an exercise
|
16
|
-
is a unique nickname composed of a-z (lowercase) and -, e.g.
|
16
|
+
is a unique nickname composed of a-z (lowercase) and -, e.g. `clock` or
|
17
17
|
`atbash-cipher`. Inside its directory, each exercise has:
|
18
18
|
|
19
19
|
* a test suite, `<exercise_name>_test.rb`
|
20
20
|
* an example solution, `.meta/solutions/<exercise_name>.rb`
|
21
21
|
|
22
|
-
where `<exercise_name>` is the underscored version of the exercise's slug,
|
23
|
-
`clock` or `atbash_cipher`.
|
22
|
+
where `<exercise_name>` is the underscored version of the exercise's slug,
|
23
|
+
e.g., `clock` or `atbash_cipher`.
|
24
24
|
|
25
25
|
If the exercise has a test generator, the directory will also contain:
|
26
26
|
|
@@ -33,42 +33,42 @@ A few exercises use a custom test template:
|
|
33
33
|
|
34
34
|
### BookKeeping::VERSION
|
35
35
|
|
36
|
-
For some, even perhaps many, of the exercises, you will find a reference
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
36
|
+
For some, even perhaps many, of the exercises, you will find a reference to
|
37
|
+
the `BookKeeping` module, but this is only included when tests have been
|
38
|
+
generated; see [Generated Test Suites](#generated-test-suites). This
|
39
|
+
`VERSION` number helps make sure exercise solvers and exercise reviewers know
|
40
|
+
which revision of the test suite they are talking about, and it theoretically
|
41
|
+
helps avoid reviewer feedback like *"Your solution doesn't make the tests
|
42
|
+
pass,"* if they are looking at a different version of the tests than the
|
43
|
+
solver used.
|
44
44
|
|
45
45
|
### Canonical Data
|
46
46
|
|
47
47
|
**Most exercises can be generated from shared inputs/outputs, called canonical
|
48
|
-
data (see [Generated Test Suites](#generated-test-suites) below).** To find
|
49
|
-
whether a test has canonical data, check
|
50
|
-
|
48
|
+
data (see [Generated Test Suites](#generated-test-suites) below).** To find
|
49
|
+
out whether a test has canonical data, check the
|
50
|
+
[problem-specifications repo](https://github.com/exercism/problem-specifications/tree/master/exercises).
|
51
51
|
|
52
52
|
## Running the Tests
|
53
53
|
|
54
|
-
Run the tests using `rake`, rather than `ruby path/to/the_test.rb`.
|
55
|
-
to look for the example solution and to disable skips. Just tell `rake`
|
56
|
-
of your problem and you are set:
|
54
|
+
Run the tests using `rake`, rather than `ruby path/to/the_test.rb`. `rake`
|
55
|
+
knows to look for the example solution and to disable skips. Just tell `rake`
|
56
|
+
the name of your problem and you are set:
|
57
57
|
|
58
58
|
```sh
|
59
59
|
rake test:clock
|
60
60
|
```
|
61
61
|
|
62
|
-
To pass arguments to the test command, like `-p` for example, you can run
|
63
|
-
|
62
|
+
To pass arguments to the test command, like `-p` for example, you can run the
|
63
|
+
following:
|
64
64
|
|
65
65
|
```sh
|
66
66
|
rake test:clock -- -p
|
67
67
|
```
|
68
68
|
|
69
69
|
To run a subset of the tests, use a regular expression. For example, if tests
|
70
|
-
exist that are named identical_to_4_places, and identical, then we can run
|
71
|
-
tests with
|
70
|
+
exist that are named identical_to_4_places, and identical, then we can run
|
71
|
+
both tests with
|
72
72
|
|
73
73
|
```sh
|
74
74
|
rake test:hamming -- -p -n="/identical/"
|
@@ -93,13 +93,16 @@ some do not. To find out whether an exercise has a generator, run
|
|
93
93
|
In addition to a usage message, the `-h` flag lists all exercises with a
|
94
94
|
generator. If a generator is available for your exercise, you can
|
95
95
|
|
96
|
-
* [Regenerate the test suite](#regenerating-an-exercise) based on
|
96
|
+
* [Regenerate the test suite](#regenerating-an-exercise) based on
|
97
|
+
updated canonical data
|
97
98
|
* [Make changes to a generated exercise](#changing-a-generated-exercise)
|
98
99
|
|
99
|
-
If not, you will need to
|
100
|
+
If not, you will need to
|
101
|
+
[implement a new generator](#implementing-a-generator).
|
100
102
|
|
101
|
-
Generated exercises depend on the
|
102
|
-
|
103
|
+
Generated exercises depend on the
|
104
|
+
[the shared metadata][problem-specifications], which must be cloned to the
|
105
|
+
same directory that contains your clone of the ruby repository:
|
103
106
|
|
104
107
|
```
|
105
108
|
tree -L 1 ~/code/exercism
|
@@ -109,20 +112,21 @@ tree -L 1 ~/code/exercism
|
|
109
112
|
|
110
113
|
#### Regenerating a Test Suite
|
111
114
|
|
112
|
-
From time to time, the
|
113
|
-
|
114
|
-
|
115
|
-
|
115
|
+
From time to time, the
|
116
|
+
[canonical data](https://github.com/exercism/problem-specifications/tree/master/exercises)
|
117
|
+
for an exercise's tests changes, and we need to keep the Ruby version's tests
|
118
|
+
synced up. Regenerating these tests is a quick and easy way to help maintain
|
119
|
+
the track and get involved!
|
116
120
|
|
117
|
-
If it's your first time cloning/contributing to the repository, you'll
|
118
|
-
|
121
|
+
If it's your first time cloning/contributing to the repository, you'll need to
|
122
|
+
install any dependencies via `bundle`:
|
119
123
|
|
120
124
|
```bash
|
121
125
|
bundle install
|
122
126
|
```
|
123
127
|
|
124
|
-
Be sure that you're working on the most up-to-date version of the repo.
|
125
|
-
|
128
|
+
Be sure that you're working on the most up-to-date version of the repo. From
|
129
|
+
the root of your copy of the repository:
|
126
130
|
|
127
131
|
```bash
|
128
132
|
# Add the exercism repo as upstream if you haven't yet:
|
@@ -136,14 +140,15 @@ git checkout master
|
|
136
140
|
git merge upstream/master
|
137
141
|
```
|
138
142
|
|
139
|
-
Depending on your git workflow preferences and the state of your local
|
140
|
-
|
143
|
+
Depending on your git workflow preferences and the state of your local repo,
|
144
|
+
you may want to do some rebasing.
|
141
145
|
[See the rebasing documentation for more information.](https://help.github.com/articles/about-git-rebase/)
|
142
146
|
|
143
|
-
The generator also depends on the presence of Exercism's
|
144
|
-
repository (see the file tree in the section above).
|
145
|
-
an *up-to-date* version of the specifications in a
|
146
|
-
folder that's in a parallel directory to your local
|
147
|
+
The generator also depends on the presence of Exercism's
|
148
|
+
`problem-specifications` repository (see the file tree in the section above).
|
149
|
+
Make sure you've got an *up-to-date* version of the specifications in a
|
150
|
+
`problem-specifications` folder that's in a parallel directory to your local
|
151
|
+
copy of the `ruby` repository.
|
147
152
|
|
148
153
|
To check which problems have possibly been updated, run:
|
149
154
|
|
@@ -151,14 +156,14 @@ To check which problems have possibly been updated, run:
|
|
151
156
|
bin/generate --all
|
152
157
|
```
|
153
158
|
|
154
|
-
This will autogenerate all of the test cases for which generators exist.
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
159
|
+
This will autogenerate all of the test cases for which generators exist. Use
|
160
|
+
`git diff` (or your preferred method) to find out which test files have
|
161
|
+
changed. Some exercises will update because someone updated the description
|
162
|
+
or other exercise metadata. Others will change because the actual test suite
|
163
|
+
has changed. If you find that an exercise's test suite (i.e. the actual
|
164
|
+
tests, not just the line at the test data version number at the top of the
|
165
|
+
tests) has changed, be sure to use `generate` to update the
|
166
|
+
[BookKeeping::VERSION](#bookkeeping-version) number by running:
|
162
167
|
|
163
168
|
```bash
|
164
169
|
bin/generate --update <exercise-slug>
|
@@ -166,23 +171,24 @@ bin/generate --update <exercise-slug>
|
|
166
171
|
|
167
172
|
Once everything has been regenerated and updated, you're almost ready to
|
168
173
|
submit your changes via pull request. Please be sure to only update one
|
169
|
-
exercise per pull request. Also, please follow the guidelines in the
|
170
|
-
|
171
|
-
|
172
|
-
|
174
|
+
exercise per pull request. Also, please follow the guidelines in the [Pull
|
175
|
+
Requests](#pull-requests) section, being sure to follow the pattern of
|
176
|
+
`<slug>: Regenerate Tests`, where slug is the slug of the exercise that your
|
177
|
+
pull request is regenerating.
|
173
178
|
|
174
179
|
#### Changing a Generated Exercise
|
175
180
|
|
176
|
-
Do not edit `<slug>/<exercise_name>_test.rb`. Any changes you make will
|
177
|
-
|
181
|
+
Do not edit `<slug>/<exercise_name>_test.rb`. Any changes you make will be
|
182
|
+
overwritten when the test suite is regenerated.
|
178
183
|
|
179
184
|
There are two reasons why a test suite might change:
|
180
185
|
|
181
|
-
1. the tests need to change (an incorrect expectation, a missing edge case,
|
186
|
+
1. the tests need to change (an incorrect expectation, a missing edge case,
|
187
|
+
etc)
|
182
188
|
1. there might be issues with the style or boilerplate
|
183
189
|
|
184
|
-
In the first case, the changes need to be made to the `canonical-data.json`
|
185
|
-
the exercise, which lives in the problem-specifications repository.
|
190
|
+
In the first case, the changes need to be made to the `canonical-data.json`
|
191
|
+
file for the exercise, which lives in the problem-specifications repository.
|
186
192
|
|
187
193
|
```
|
188
194
|
../problem-specifications/exercises/<slug>/
|
@@ -191,19 +197,19 @@ the exercise, which lives in the problem-specifications repository.
|
|
191
197
|
└── metadata.yml
|
192
198
|
```
|
193
199
|
|
194
|
-
This change will need to be submitted as a pull request to the
|
195
|
-
repository. This pull request needs to be merged before
|
196
|
-
exercise.
|
200
|
+
This change will need to be submitted as a pull request to the
|
201
|
+
problem-specifications repository. This pull request needs to be merged before
|
202
|
+
you can regenerate the exercise.
|
197
203
|
|
198
204
|
Changes that don't have to do directly with the test inputs and outputs should
|
199
|
-
be made to the exercise's test case generator, discussed
|
200
|
-
|
201
|
-
|
205
|
+
be made to the exercise's test case generator, discussed in
|
206
|
+
[implementing a new generator](#implementing-a-generator), next. Then you can
|
207
|
+
regenerate the exercise with `bin/generate <slug>`.
|
202
208
|
|
203
209
|
#### Implementing a Generator
|
204
210
|
|
205
|
-
An exercise's test case generator class produces the code that goes inside
|
206
|
-
|
211
|
+
An exercise's test case generator class produces the code that goes inside the
|
212
|
+
minitest `test_<whatever>` methods. An exercise's generator lives in
|
207
213
|
`exercises/<slug>/.meta/generator/<exercise_name>_case.rb`.
|
208
214
|
|
209
215
|
The test case generator is a derived class of `ExerciseCase` (in
|
@@ -224,27 +230,30 @@ class <ExerciseName>Case < Generator::ExerciseCase
|
|
224
230
|
end
|
225
231
|
```
|
226
232
|
|
227
|
-
where `<ExerciseName>` is the CamelCased version of the exercise's slug. This
|
228
|
-
important, since the generator script will infer the name of the class from
|
233
|
+
where `<ExerciseName>` is the CamelCased version of the exercise's slug. This
|
234
|
+
is important, since the generator script will infer the name of the class from
|
229
235
|
`<slug>`.
|
230
236
|
|
231
237
|
This class must provide the methods used by the test
|
232
238
|
template. A
|
233
|
-
[default template](https://github.com/exercism/ruby/blob/master/lib/generator/test_template.erb)
|
234
|
-
most exercises can (and do) use lives in
|
235
|
-
base class provides methods for the
|
236
|
-
`#workload`.
|
239
|
+
[default template](https://github.com/exercism/ruby/blob/master/lib/generator/test_template.erb)
|
240
|
+
that most exercises can (and do) use lives in
|
241
|
+
`lib/generator/test_template.erb`. The base class provides methods for the
|
242
|
+
default template for everything except `#workload`.
|
237
243
|
|
238
244
|
`#workload` generates the code for the body of a test, including the assertion
|
239
245
|
and any setup required. The base class provides a variety of
|
240
|
-
[assertion](https://github.com/exercism/ruby/blob/master/lib/generator/exercise_case/assertion.rb)
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
about [the intention of #workload](#workload-philosophy)
|
246
|
+
[assertion](https://github.com/exercism/ruby/blob/master/lib/generator/exercise_case/assertion.rb)
|
247
|
+
and
|
248
|
+
[helper](https://github.com/exercism/ruby/blob/master/lib/generator/exercise_case.rb)
|
249
|
+
methods.
|
245
250
|
|
246
|
-
|
247
|
-
|
251
|
+
Beyond that, you can implement any helper methods that you need as private
|
252
|
+
methods in your derived class. See below for more information about
|
253
|
+
[the intention of #workload](#workload-philosophy)
|
254
|
+
|
255
|
+
You don't have to do anything other than implement `#workload` to use the
|
256
|
+
default template.
|
248
257
|
|
249
258
|
If you really must add additional logic to the view template, you can use a
|
250
259
|
custom template. Copy `lib/generator/test_template.erb` to
|
@@ -262,6 +271,7 @@ in a clear and consistent manner. Illustrate the purpose of the individual
|
|
262
271
|
elements of the assertion by using meaningful variable names.
|
263
272
|
|
264
273
|
Example output from the `workload` method:
|
274
|
+
|
265
275
|
```ruby
|
266
276
|
detector = Anagram.new('allergy')
|
267
277
|
anagrams = detector.match(["gallery", "ballerina", "regally", "clergy", "largely", "leading"])
|
@@ -269,7 +279,6 @@ expected = ["gallery", "largely", "regally"]
|
|
269
279
|
assert_equal expected, anagrams.sort
|
270
280
|
```
|
271
281
|
|
272
|
-
|
273
282
|
## Pull Requests
|
274
283
|
|
275
284
|
We welcome pull requests that provide fixes to existing test suites (missing
|
@@ -281,13 +290,13 @@ change.
|
|
281
290
|
Please submit changes to a single problem per pull request unless you're
|
282
291
|
submitting a general change across many of the problems (e.g. formatting).
|
283
292
|
|
284
|
-
You can run (some) of the same checks that we run by running the
|
285
|
-
|
293
|
+
You can run (some) of the same checks that we run by running the following
|
294
|
+
tool in your terminal:
|
286
295
|
|
287
296
|
bin/local-status-check
|
288
297
|
|
289
|
-
If you would like to have these run right before you push your commits,
|
290
|
-
|
298
|
+
If you would like to have these run right before you push your commits, you
|
299
|
+
can activate the hook by running this tool in your terminal:
|
291
300
|
|
292
301
|
bin/setup-git-hoooks
|
293
302
|
|
@@ -295,28 +304,34 @@ Thank you so much for contributing! :sparkles:
|
|
295
304
|
|
296
305
|
### Style Guide
|
297
306
|
|
298
|
-
We have created a minimal set of guidelines for the testing files, which
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
307
|
+
We have created a minimal set of guidelines for the testing files, which you
|
308
|
+
can take advantage of by installing the `rubocop` gem. It will use the
|
309
|
+
configuration file located in the root folder, `.rubocop.yml`. When you edit
|
310
|
+
your code, you can simply run `rubocop -D`. It will ignore your example
|
311
|
+
solution, but will gently suggest style for your test code.
|
303
312
|
|
304
313
|
The `-D` option that is suggested is provided to give you the ability to
|
305
|
-
easily ignore the Cops that you think should be ignored. This is easily
|
306
|
-
|
314
|
+
easily ignore the Cops that you think should be ignored. This is easily done
|
315
|
+
by doing `# rubocop:disable CopName`, where the `CopName` is replaced
|
307
316
|
appropriately.
|
308
317
|
|
309
318
|
For more complete information, see [Rubocop](http://batsov.com/rubocop/).
|
310
319
|
|
311
320
|
While `lib/generator/exercise_case.rb` provides helper functions as discussed
|
312
|
-
above, it remains the responsibility of an exercise's generator to interpret
|
313
|
-
canonical-data.json data in a stylistically correct manner, e.g.
|
314
|
-
string indices to integer indices.
|
321
|
+
above, it remains the responsibility of an exercise's generator to interpret
|
322
|
+
its canonical-data.json data in a stylistically correct manner, e.g.
|
323
|
+
converting string indices to integer indices.
|
315
324
|
|
316
325
|
## READMEs
|
317
326
|
|
327
|
+
<<<<<<< HEAD
|
318
328
|
All exercises must have a README.md file, but should not be created manually. The READMEs
|
319
329
|
are constructed using shared metadata, which lives in the [problem-specifications][] repo.
|
330
|
+
=======
|
331
|
+
Do not add a README or README.md file to the exercise's directory. The READMEs
|
332
|
+
are constructed using shared metadata, which lives in the
|
333
|
+
[problem-specifications][] repo.
|
334
|
+
>>>>>>> Whitespace and wrapping, not integral to this PR
|
320
335
|
|
321
336
|
Use the `configlet` tool to generate a README from shared metadata:
|
322
337
|
|
@@ -326,15 +341,24 @@ Use the `configlet` tool to generate a README from shared metadata:
|
|
326
341
|
|
327
342
|
## Contributing Guide
|
328
343
|
|
329
|
-
|
344
|
+
If adding a new exercise:
|
345
|
+
|
346
|
+
* a [generator](#implementing-a-generator) should be implemented.
|
347
|
+
* a minimal, partial, solution should be able to be pushed, in order to create a
|
348
|
+
WIP pull request.
|
349
|
+
|
350
|
+
For an in-depth discussion of how exercism language tracks and exercises work,
|
351
|
+
please see the
|
330
352
|
[contributing guide](https://github.com/exercism/x-api/blob/master/CONTRIBUTING.md#the-exercise-data).
|
331
353
|
|
332
354
|
If you're just getting started and looking for a helpful way to get involved,
|
333
|
-
take a look at
|
355
|
+
take a look at
|
356
|
+
[regenerating the test suites](#regenerating-a-test-suite),
|
334
357
|
[porting an exercise from another language](https://github.com/exercism/docs/blob/master/you-can-help/implement-an-exercise-from-specification.md),
|
335
358
|
or [creating an automated test generator](#implementing-a-generator).
|
336
359
|
|
337
360
|
## Ruby icon
|
338
|
-
The Ruby icon is the Vienna.rb logo, and is used with permission. Thanks Floor
|
361
|
+
The Ruby icon is the Vienna.rb logo, and is used with permission. Thanks Floor
|
362
|
+
Dress :)
|
339
363
|
|
340
364
|
[problem-specifications]: https://github.com/exercism/problem-specifications
|
@@ -4,10 +4,29 @@
|
|
4
4
|
{{- with .Hints }}
|
5
5
|
{{ . }}
|
6
6
|
{{ end }}
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
* * * *
|
8
|
+
|
9
|
+
For installation and learning resources, refer to the
|
10
|
+
[exercism help page](http://exercism.io/languages/ruby).
|
11
|
+
|
12
|
+
For running the tests provided, you will need the Minitest gem. Open a
|
13
|
+
terminal window and run the following command to install minitest:
|
14
|
+
|
15
|
+
gem install minitest
|
16
|
+
|
17
|
+
If you would like color output, you can `require 'minitest/pride'` in
|
18
|
+
the test file, or note the alternative instruction, below, for running
|
19
|
+
the test file.
|
20
|
+
|
21
|
+
Run the tests from the exercise directory using the following command:
|
22
|
+
|
23
|
+
ruby {{ .Spec.SnakeCaseName }}_test.rb
|
24
|
+
|
25
|
+
To include color from the command line:
|
26
|
+
|
27
|
+
ruby -r minitest/pride {{ .Spec.SnakeCaseName }}_test.rb
|
28
|
+
|
29
|
+
{{ with .Spec.Credits }}
|
11
30
|
## Source
|
12
31
|
|
13
32
|
{{ . }}
|
File without changes
|
@@ -54,15 +54,13 @@ If you would like color output, you can `require 'minitest/pride'` in
|
|
54
54
|
the test file, or note the alternative instruction, below, for running
|
55
55
|
the test file.
|
56
56
|
|
57
|
-
|
58
|
-
directory. For example, if the test suite is called
|
59
|
-
`hello_world_test.rb`, you can run the following command:
|
57
|
+
Run the tests from the exercise directory using the following command:
|
60
58
|
|
61
|
-
ruby
|
59
|
+
ruby accumulate_test.rb
|
62
60
|
|
63
61
|
To include color from the command line:
|
64
62
|
|
65
|
-
ruby -r minitest/pride
|
63
|
+
ruby -r minitest/pride accumulate_test.rb
|
66
64
|
|
67
65
|
|
68
66
|
## Source
|