trackler 1.0.0 → 1.0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +7 -0
- data/CHANGELOG.md +9 -1
- data/README.md +10 -0
- data/common/CONTRIBUTING.md +50 -2
- data/common/exercises/alphametics/canonical-data.json +10 -10
- data/common/exercises/markdown/canonical-data.json +4 -4
- data/common/exercises/pov/canonical-data.json +356 -0
- data/lib/trackler/version.rb +1 -1
- data/trackler.gemspec +1 -2
- data/tracks/c/config.json +11 -1
- data/tracks/c/exercises/binary-search/makefile +16 -0
- data/tracks/c/exercises/binary-search/src/example.c +21 -0
- data/tracks/c/exercises/binary-search/src/example.h +8 -0
- data/tracks/c/exercises/binary-search/test/test_binary_search.c +99 -0
- data/tracks/c/exercises/binary-search/test/vendor/unity.c +1300 -0
- data/tracks/c/exercises/binary-search/test/vendor/unity.h +274 -0
- data/tracks/c/exercises/binary-search/test/vendor/unity_internals.h +701 -0
- data/tracks/clojure/config.json +3 -2
- data/tracks/clojure/exercises/bank-account/project.clj +4 -0
- data/tracks/clojure/exercises/bank-account/src/example.clj +17 -0
- data/tracks/clojure/exercises/bank-account/test/bank_account_test.clj +44 -0
- data/tracks/clojure/exercises/isogram/project.clj +4 -0
- data/tracks/clojure/exercises/isogram/src/example.clj +5 -0
- data/tracks/clojure/exercises/isogram/test/isogram_test.clj +17 -0
- data/tracks/csharp/config.json +27 -87
- data/tracks/csharp/exercises/exercises.csproj +265 -1
- data/tracks/csharp/exercises/grep/Example.cs +114 -0
- data/tracks/csharp/exercises/grep/GrepTest.cs +376 -0
- data/tracks/csharp/exercises/paket.references +2 -1
- data/tracks/csharp/exercises/poker/Example.cs +96 -0
- data/tracks/csharp/exercises/poker/PokerTest.cs +171 -0
- data/tracks/csharp/exercises/sgf-parsing/Example.cs +61 -0
- data/tracks/csharp/exercises/sgf-parsing/SgfParsing.cs +13 -0
- data/tracks/csharp/exercises/sgf-parsing/SgfParsingTest.cs +158 -0
- data/tracks/csharp/paket.dependencies +2 -1
- data/tracks/csharp/paket.lock +72 -0
- data/tracks/ecmascript/exercises/simple-cipher/simple-cipher.spec.js +1 -1
- data/tracks/elisp/config.json +6 -1
- data/tracks/elisp/exercises/etl/etl-test.el +90 -0
- data/tracks/elisp/exercises/etl/etl.el +9 -0
- data/tracks/elisp/exercises/etl/example.el +22 -0
- data/tracks/elisp/exercises/nucleotide-count/example.el +19 -0
- data/tracks/elisp/exercises/nucleotide-count/nucleotide-count-test.el +34 -0
- data/tracks/elisp/exercises/nucleotide-count/nucleotide-count.el +9 -0
- data/tracks/elisp/exercises/perfect-numbers/example.el +28 -0
- data/tracks/elisp/exercises/perfect-numbers/perfect-numbers-test.el +24 -0
- data/tracks/elisp/exercises/perfect-numbers/perfect-numbers.el +10 -0
- data/tracks/elisp/exercises/roman-numerals/example.el +36 -0
- data/tracks/elisp/exercises/roman-numerals/roman-numerals-test.el +30 -0
- data/tracks/elisp/exercises/roman-numerals/roman-numerals.el +10 -0
- data/tracks/elisp/exercises/word-count/example.el +18 -0
- data/tracks/elisp/exercises/word-count/word-count-test.el +64 -0
- data/tracks/elisp/exercises/word-count/word-count.el +9 -0
- data/tracks/elixir/README.md +4 -4
- data/tracks/elixir/SETUP.md +3 -3
- data/tracks/elixir/docs/TESTS.md +3 -3
- data/tracks/elixir/exercises/accumulate/accumulate_test.exs +7 -7
- data/tracks/elixir/exercises/acronym/acronym_test.exs +5 -5
- data/tracks/elixir/exercises/allergies/allergies_test.exs +13 -13
- data/tracks/elixir/exercises/anagram/anagram_test.exs +12 -12
- data/tracks/elixir/exercises/atbash-cipher/atbash_cipher_test.exs +9 -9
- data/tracks/elixir/exercises/bank-account/bank_account_test.exs +5 -5
- data/tracks/elixir/exercises/beer-song/beer_song_test.exs +6 -6
- data/tracks/elixir/exercises/binary-search/binary_search_test.exs +7 -7
- data/tracks/elixir/exercises/binary/binary_test.exs +13 -13
- data/tracks/elixir/exercises/bob/bob_test.exs +15 -15
- data/tracks/elixir/exercises/bowling/bowling_test.exs +18 -18
- data/tracks/elixir/exercises/bracket-push/bracket_push_test.exs +12 -12
- data/tracks/elixir/exercises/change/change_test.exs +7 -7
- data/tracks/elixir/exercises/connect/connect_test.exs +9 -9
- data/tracks/elixir/exercises/crypto-square/crypto_square_test.exs +7 -7
- data/tracks/elixir/exercises/custom-set/custom_set_test.exs +11 -11
- data/tracks/elixir/exercises/diamond/diamond_test.exs +4 -4
- data/tracks/elixir/exercises/difference-of-squares/difference_of_squares_test.exs +10 -10
- data/tracks/elixir/exercises/dot-dsl/dot_dsl_test.exs +17 -17
- data/tracks/elixir/exercises/etl/etl_test.exs +5 -5
- data/tracks/elixir/exercises/flatten-array/flatten_array_test.exs +6 -6
- data/tracks/elixir/exercises/forth/forth_test.exs +16 -16
- data/tracks/elixir/exercises/gigasecond/gigasecond_test.exs +5 -5
- data/tracks/elixir/exercises/grade-school/grade_school_test.exs +6 -6
- data/tracks/elixir/exercises/grains/grains_test.exs +9 -9
- data/tracks/elixir/exercises/hamming/hamming_test.exs +6 -6
- data/tracks/elixir/exercises/hello-world/hello_world_test.exs +3 -3
- data/tracks/elixir/exercises/hexadecimal/hexadecimal_test.exs +11 -11
- data/tracks/elixir/exercises/isogram/isogram_test.exs +10 -10
- data/tracks/elixir/exercises/kindergarten-garden/garden_test.exs +7 -7
- data/tracks/elixir/exercises/largest-series-product/largest_series_product_test.exs +17 -17
- data/tracks/elixir/exercises/leap/leap_test.exs +5 -5
- data/tracks/elixir/exercises/list-ops/list_ops_test.exs +26 -26
- data/tracks/elixir/exercises/luhn/luhn_test.exs +7 -7
- data/tracks/elixir/exercises/markdown/markdown_test.exs +10 -10
- data/tracks/elixir/exercises/meetup/meetup_test.exs +92 -92
- data/tracks/elixir/exercises/minesweeper/minesweeper_test.exs +8 -8
- data/tracks/elixir/exercises/nth-prime/nth_prime_test.exs +6 -6
- data/tracks/elixir/exercises/nucleotide-count/example.exs +0 -5
- data/tracks/elixir/exercises/nucleotide-count/nucleotide_count_test.exs +7 -7
- data/tracks/elixir/exercises/palindrome-products/palindrome_products_test.exs +6 -6
- data/tracks/elixir/exercises/pangram/pangram_test.exs +11 -11
- data/tracks/elixir/exercises/parallel-letter-frequency/parallel_letter_frequency_test.exs +10 -10
- data/tracks/elixir/exercises/pascals-triangle/pascals_triangle_test.exs +7 -7
- data/tracks/elixir/exercises/phone-number/phone_number_test.exs +10 -10
- data/tracks/elixir/exercises/prime-factors/prime_factors_test.exs +13 -13
- data/tracks/elixir/exercises/pythagorean-triplet/pythagorean_triplet_test.exs +8 -8
- data/tracks/elixir/exercises/queen-attack/queen_attack_test.exs +16 -16
- data/tracks/elixir/exercises/rail-fence-cipher/rail_fence_cipher_test.exs +13 -13
- data/tracks/elixir/exercises/raindrops/raindrops_test.exs +17 -17
- data/tracks/elixir/exercises/rna-transcription/rna_transcription_test.exs +6 -6
- data/tracks/elixir/exercises/robot-simulator/robot_simulator_test.exs +6 -6
- data/tracks/elixir/exercises/roman-numerals/roman_numerals_test.exs +19 -19
- data/tracks/elixir/exercises/run-length-encoding/rle_test.exs +6 -6
- data/tracks/elixir/exercises/saddle-points/saddle_points_test.exs +11 -11
- data/tracks/elixir/exercises/scrabble-score/scrabble_score_test.exs +9 -9
- data/tracks/elixir/exercises/sieve/sieve_test.exs +3 -3
- data/tracks/elixir/exercises/space-age/space_age_test.exs +9 -9
- data/tracks/elixir/exercises/sublist/sublist_test.exs +20 -20
- data/tracks/elixir/exercises/sum-of-multiples/sum_of_multiples_test.exs +11 -11
- data/tracks/elixir/exercises/test_helper.exs +1 -1
- data/tracks/elixir/exercises/triangle/triangle_test.exs +16 -16
- data/tracks/elixir/exercises/word-count/word_count_test.exs +9 -9
- data/tracks/elixir/exercises/wordy/wordy_test.exs +16 -16
- data/tracks/elixir/exercises/zipper/zipper_test.exs +13 -13
- data/tracks/fsharp/build.fsx +2 -7
- data/tracks/fsharp/config.json +0 -104
- data/tracks/fsharp/exercises/grep/GrepTest.fs +7 -1
- data/tracks/go/config.json +1 -0
- data/tracks/go/exercises/acronym/acronym_test.go +36 -0
- data/tracks/go/exercises/acronym/example.go +21 -0
- data/tracks/go/exercises/palindrome-products/example.go +2 -0
- data/tracks/go/exercises/palindrome-products/palindrome_products_test.go +10 -0
- data/tracks/go/exercises/phone-number/example.go +2 -0
- data/tracks/go/exercises/phone-number/phone_number_test.go +44 -27
- data/tracks/go/exercises/robot-simulator/defs.go +6 -6
- data/tracks/go/exercises/robot-simulator/example.go +22 -22
- data/tracks/go/exercises/robot-simulator/robot_simulator_step2_test.go +28 -28
- data/tracks/go/exercises/robot-simulator/robot_simulator_step3_test.go +75 -76
- data/tracks/go/exercises/robot-simulator/robot_simulator_test.go +10 -4
- data/tracks/haskell/exercises/anagram/HINTS.md +22 -0
- data/tracks/haskell/exercises/anagram/package.yaml +3 -0
- data/tracks/haskell/exercises/anagram/src/Example.hs +10 -7
- data/tracks/haskell/exercises/anagram/test/Tests.hs +9 -3
- data/tracks/haskell/exercises/beer-song/HINTS.md +18 -0
- data/tracks/haskell/exercises/beer-song/src/Beer.hs +301 -3
- data/tracks/haskell/exercises/beer-song/src/Example.hs +5 -3
- data/tracks/haskell/exercises/beer-song/test/Tests.hs +332 -23
- data/tracks/haskell/exercises/crypto-square/src/CryptoSquare.hs +3 -17
- data/tracks/haskell/exercises/crypto-square/src/Example.hs +12 -20
- data/tracks/haskell/exercises/crypto-square/test/Tests.hs +46 -86
- data/tracks/haskell/exercises/leap/HINTS.md +11 -0
- data/tracks/haskell/exercises/leap/src/LeapYear.hs +1 -0
- data/tracks/java/exercises/pangram/src/test/java/PangramTest.java +34 -4
- data/tracks/lua/exercises/pov/pov_spec.lua +0 -13
- data/tracks/mips/docs/ABOUT.md +1 -1
- data/tracks/objective-c/config.json +225 -0
- data/tracks/objective-c/exercises/largest-series-product/LargestSeriesProductExample.h +8 -0
- data/tracks/objective-c/exercises/largest-series-product/LargestSeriesProductExample.m +63 -0
- data/tracks/objective-c/exercises/largest-series-product/LargestSeriesProductTest.m +84 -0
- data/tracks/objective-c/xcodeProject/ObjectiveC.xcodeproj/project.pbxproj +18 -0
- data/tracks/ocaml/.travis-ci.sh +23 -0
- data/tracks/ocaml/.travis.yml +5 -1
- data/tracks/ocaml/Makefile +41 -0
- data/tracks/ocaml/config.json +18 -0
- data/tracks/ocaml/exercises/anagram/Makefile +1 -0
- data/tracks/ocaml/exercises/beer-song/Makefile +1 -0
- data/tracks/ocaml/exercises/beer-song/{beer.mli → beer_song.mli} +0 -0
- data/tracks/ocaml/exercises/beer-song/example.ml +1 -1
- data/tracks/ocaml/exercises/beer-song/test.ml +7 -6
- data/tracks/ocaml/exercises/bob/Makefile +1 -0
- data/tracks/ocaml/exercises/bowling/Makefile +1 -0
- data/tracks/ocaml/exercises/custom-set/Makefile +1 -0
- data/tracks/ocaml/exercises/difference-of-squares/.merlin +5 -0
- data/tracks/ocaml/exercises/difference-of-squares/Makefile +11 -0
- data/tracks/ocaml/exercises/difference-of-squares/difference_of_squares.mli +8 -0
- data/tracks/ocaml/exercises/difference-of-squares/example.ml +21 -0
- data/tracks/ocaml/exercises/difference-of-squares/test.ml +32 -0
- data/tracks/ocaml/exercises/grade-school/Makefile +1 -0
- data/tracks/ocaml/exercises/grade-school/{school.mli → grade_school.mli} +0 -0
- data/tracks/ocaml/exercises/grade-school/test.ml +27 -27
- data/tracks/ocaml/exercises/hamming/Makefile +1 -0
- data/tracks/ocaml/exercises/hangman/Makefile +1 -0
- data/tracks/ocaml/exercises/hello-world/Makefile +1 -1
- data/tracks/ocaml/exercises/hello-world/{hello.ml → hello_world.ml} +0 -0
- data/tracks/ocaml/exercises/hello-world/{hello.mli → hello_world.mli} +0 -0
- data/tracks/ocaml/exercises/hello-world/test.ml +1 -1
- data/tracks/ocaml/exercises/hexadecimal/Makefile +1 -0
- data/tracks/ocaml/exercises/leap/Makefile +1 -1
- data/tracks/ocaml/exercises/list-ops/Makefile +1 -0
- data/tracks/ocaml/exercises/luhn/Makefile +1 -0
- data/tracks/ocaml/exercises/minesweeper/Makefile +1 -0
- data/tracks/ocaml/exercises/nucleotide-count/Makefile +1 -0
- data/tracks/ocaml/exercises/nucleotide-count/{dna.mli → nucleotide_count.mli} +0 -0
- data/tracks/ocaml/exercises/nucleotide-count/test.ml +7 -7
- data/tracks/ocaml/exercises/phone-number/Makefile +1 -0
- data/tracks/ocaml/exercises/phone-number/{phone.mli → phone_number.mli} +0 -0
- data/tracks/ocaml/exercises/phone-number/test.ml +10 -10
- data/tracks/ocaml/exercises/point-mutations/Makefile +8 -0
- data/tracks/ocaml/exercises/point-mutations/example.ml +0 -0
- data/tracks/ocaml/exercises/prime-factors/Makefile +1 -0
- data/tracks/ocaml/exercises/raindrops/.merlin +5 -0
- data/tracks/ocaml/exercises/raindrops/Makefile +11 -0
- data/tracks/ocaml/exercises/raindrops/example.ml +11 -0
- data/tracks/ocaml/exercises/raindrops/raindrops.mli +7 -0
- data/tracks/ocaml/exercises/raindrops/test.ml +48 -0
- data/tracks/ocaml/exercises/rna-transcription/Makefile +1 -0
- data/tracks/ocaml/exercises/rna-transcription/{dna.mli → rna_transcription.mli} +0 -0
- data/tracks/ocaml/exercises/rna-transcription/test.ml +6 -6
- data/tracks/ocaml/exercises/roman-numerals/Makefile +1 -0
- data/tracks/ocaml/exercises/say/.gitignore +1 -0
- data/tracks/ocaml/exercises/say/.merlin +5 -0
- data/tracks/ocaml/exercises/say/Makefile +11 -0
- data/tracks/ocaml/exercises/say/example.ml +52 -0
- data/tracks/ocaml/exercises/say/say.mli +8 -0
- data/tracks/ocaml/exercises/say/test.ml +65 -0
- data/tracks/ocaml/exercises/space-age/Makefile +1 -0
- data/tracks/ocaml/exercises/word-count/Makefile +1 -0
- data/tracks/ocaml/exercises/word-count/example.ml +1 -1
- data/tracks/ocaml/exercises/zipper/HINT.md +5 -6
- data/tracks/ocaml/exercises/zipper/Makefile +1 -0
- data/tracks/ocaml/exercises/zipper/example.ml +2 -2
- data/tracks/ocaml/exercises/zipper/tree.ml +1 -1
- data/tracks/php/config.json +7 -1
- data/tracks/php/exercises/variable-length-quantity/example.php +56 -0
- data/tracks/php/exercises/variable-length-quantity/variable-length-quantity_test.php +149 -0
- data/tracks/python/config.json +1 -1
- data/tracks/ruby/.rubocop.yml +1915 -26
- data/tracks/ruby/bin/generate-acronym +7 -0
- data/tracks/ruby/bin/generate-nth-prime +7 -0
- data/tracks/ruby/config.json +482 -0
- data/tracks/ruby/exercises/acronym/.version +1 -0
- data/tracks/ruby/exercises/acronym/acronym_test.rb +45 -21
- data/tracks/ruby/exercises/acronym/example.rb +1 -1
- data/tracks/ruby/exercises/acronym/example.tt +19 -0
- data/tracks/ruby/exercises/anagram/anagram_test.rb +1 -1
- data/tracks/ruby/exercises/nth-prime/.version +1 -0
- data/tracks/ruby/exercises/nth-prime/example.rb +4 -0
- data/tracks/ruby/exercises/nth-prime/example.tt +23 -0
- data/tracks/ruby/exercises/nth-prime/nth_prime_test.rb +33 -10
- data/tracks/ruby/exercises/raindrops/.version +1 -1
- data/tracks/ruby/exercises/raindrops/example.rb +1 -1
- data/tracks/ruby/exercises/raindrops/raindrops_test.rb +20 -5
- data/tracks/ruby/lib/acronym_cases.rb +19 -0
- data/tracks/ruby/lib/generator.rb +3 -2
- data/tracks/ruby/lib/nth_prime_cases.rb +23 -0
- data/tracks/ruby/lib/raindrop_cases.rb +1 -1
- data/tracks/rust/README.md +1 -1
- data/tracks/scala/exercises/leap/src/test/scala/leap_test.scala +10 -0
- data/tracks/scala/exercises/prime-factors/example.scala +2 -5
- data/tracks/scala/exercises/prime-factors/src/test/scala/primefactors_test.scala +11 -13
- data/tracks/scheme/{anagram → exercises/anagram}/anagram-test.scm +0 -0
- data/tracks/scheme/{anagram → exercises/anagram}/anagram.scm +0 -0
- data/tracks/scheme/{anagram → exercises/anagram}/example.scm +0 -0
- data/tracks/scheme/{bob → exercises/bob}/bob-test.scm +0 -0
- data/tracks/scheme/{bob → exercises/bob}/bob.scm +0 -0
- data/tracks/scheme/{bob → exercises/bob}/example.scm +0 -0
- data/tracks/scheme/{difference-of-squares → exercises/difference-of-squares}/difference-of-squares-test.scm +0 -0
- data/tracks/scheme/{difference-of-squares → exercises/difference-of-squares}/example.scm +0 -0
- data/tracks/scheme/{difference-of-squares → exercises/difference-of-squares}/squares.scm +0 -0
- data/tracks/scheme/{grains → exercises/grains}/example.scm +0 -0
- data/tracks/scheme/{grains → exercises/grains}/grains-test.scm +0 -0
- data/tracks/scheme/{grains → exercises/grains}/grains.scm +0 -0
- data/tracks/scheme/{hamming → exercises/hamming}/example.scm +0 -0
- data/tracks/scheme/{hamming → exercises/hamming}/hamming-test.scm +0 -0
- data/tracks/scheme/{hamming → exercises/hamming}/hamming.scm +0 -0
- data/tracks/scheme/{hello-world → exercises/hello-world}/example.scm +0 -0
- data/tracks/scheme/{hello-world → exercises/hello-world}/hello-world-test.scm +0 -0
- data/tracks/scheme/{hello-world → exercises/hello-world}/hello-world.scm +0 -0
- data/tracks/scheme/{leap → exercises/leap}/example.scm +0 -0
- data/tracks/scheme/{leap → exercises/leap}/leap-test.scm +0 -0
- data/tracks/scheme/{leap → exercises/leap}/leap-year.scm +0 -0
- data/tracks/scheme/{list-ops → exercises/list-ops}/example.scm +0 -0
- data/tracks/scheme/{list-ops → exercises/list-ops}/list-ops-test.scm +0 -0
- data/tracks/scheme/{list-ops → exercises/list-ops}/list-ops.scm +0 -0
- data/tracks/scheme/{nucleotide-count → exercises/nucleotide-count}/example.scm +0 -0
- data/tracks/scheme/{nucleotide-count → exercises/nucleotide-count}/nucleotide-count-test.scm +0 -0
- data/tracks/scheme/{nucleotide-count → exercises/nucleotide-count}/nucleotide-count.scm +0 -0
- data/tracks/scheme/{phone-number → exercises/phone-number}/example.scm +0 -0
- data/tracks/scheme/{phone-number → exercises/phone-number}/phone-number-test.scm +0 -0
- data/tracks/scheme/{phone-number → exercises/phone-number}/phone-number.scm +0 -0
- data/tracks/scheme/{raindrops → exercises/raindrops}/example.scm +0 -0
- data/tracks/scheme/{raindrops → exercises/raindrops}/raindrops-test.scm +0 -0
- data/tracks/scheme/{raindrops → exercises/raindrops}/raindrops.scm +0 -0
- data/tracks/scheme/{rna-transcription → exercises/rna-transcription}/dna.scm +0 -0
- data/tracks/scheme/{rna-transcription → exercises/rna-transcription}/example.scm +0 -0
- data/tracks/scheme/{rna-transcription → exercises/rna-transcription}/rna-transcription-test.scm +0 -0
- data/tracks/scheme/{robot-name → exercises/robot-name}/example.scm +0 -0
- data/tracks/scheme/{robot-name → exercises/robot-name}/robot-name-test.scm +0 -0
- data/tracks/scheme/{robot-name → exercises/robot-name}/robot.scm +0 -0
- metadata +125 -64
@@ -67,6 +67,8 @@
|
|
67
67
|
E951B6B91D429550009EB5B6 /* AllergiesTest.m in Sources */ = {isa = PBXBuildFile; fileRef = E951B6B81D429550009EB5B6 /* AllergiesTest.m */; };
|
68
68
|
E99D1D811D5533BF0006A303 /* SumOfMultiplesExample.m in Sources */ = {isa = PBXBuildFile; fileRef = E99D1D801D5533BF0006A303 /* SumOfMultiplesExample.m */; };
|
69
69
|
E99D1D831D5533D80006A303 /* SumOfMultiplesTest.m in Sources */ = {isa = PBXBuildFile; fileRef = E99D1D821D5533D80006A303 /* SumOfMultiplesTest.m */; };
|
70
|
+
E9A7B2F71DA5AC37009056B6 /* LargestSeriesProductExample.m in Sources */ = {isa = PBXBuildFile; fileRef = E9A7B2F61DA5AC37009056B6 /* LargestSeriesProductExample.m */; };
|
71
|
+
E9A7B2F91DA5AC55009056B6 /* LargestSeriesProductTest.m in Sources */ = {isa = PBXBuildFile; fileRef = E9A7B2F81DA5AC55009056B6 /* LargestSeriesProductTest.m */; };
|
70
72
|
E9C1C0231D9D993E0015E86E /* SecretHandshakeExample.m in Sources */ = {isa = PBXBuildFile; fileRef = E9C1C0221D9D993E0015E86E /* SecretHandshakeExample.m */; };
|
71
73
|
E9C1C0251D9D99620015E86E /* SecretHandshakeTest.m in Sources */ = {isa = PBXBuildFile; fileRef = E9C1C0241D9D99620015E86E /* SecretHandshakeTest.m */; };
|
72
74
|
E9C1C0291D9DB16B0015E86E /* AcronymExample.m in Sources */ = {isa = PBXBuildFile; fileRef = E9C1C0281D9DB16B0015E86E /* AcronymExample.m */; };
|
@@ -149,6 +151,9 @@
|
|
149
151
|
E99D1D7F1D5533BF0006A303 /* SumOfMultiplesExample.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SumOfMultiplesExample.h; path = "../../exercises/sum-of-multiples/SumOfMultiplesExample.h"; sourceTree = "<group>"; };
|
150
152
|
E99D1D801D5533BF0006A303 /* SumOfMultiplesExample.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SumOfMultiplesExample.m; path = "../../exercises/sum-of-multiples/SumOfMultiplesExample.m"; sourceTree = "<group>"; };
|
151
153
|
E99D1D821D5533D80006A303 /* SumOfMultiplesTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SumOfMultiplesTest.m; path = "../../exercises/sum-of-multiples/SumOfMultiplesTest.m"; sourceTree = "<group>"; };
|
154
|
+
E9A7B2F51DA5AC37009056B6 /* LargestSeriesProductExample.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LargestSeriesProductExample.h; path = "../../exercises/largest-series-product/LargestSeriesProductExample.h"; sourceTree = "<group>"; };
|
155
|
+
E9A7B2F61DA5AC37009056B6 /* LargestSeriesProductExample.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = LargestSeriesProductExample.m; path = "../../exercises/largest-series-product/LargestSeriesProductExample.m"; sourceTree = "<group>"; };
|
156
|
+
E9A7B2F81DA5AC55009056B6 /* LargestSeriesProductTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = LargestSeriesProductTest.m; path = "../../exercises/largest-series-product/LargestSeriesProductTest.m"; sourceTree = "<group>"; };
|
152
157
|
E9C1C0211D9D993E0015E86E /* SecretHandshakeExample.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SecretHandshakeExample.h; path = "../../exercises/secret-handshake/SecretHandshakeExample.h"; sourceTree = "<group>"; };
|
153
158
|
E9C1C0221D9D993E0015E86E /* SecretHandshakeExample.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SecretHandshakeExample.m; path = "../../exercises/secret-handshake/SecretHandshakeExample.m"; sourceTree = "<group>"; };
|
154
159
|
E9C1C0241D9D99620015E86E /* SecretHandshakeTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SecretHandshakeTest.m; path = "../../exercises/secret-handshake/SecretHandshakeTest.m"; sourceTree = "<group>"; };
|
@@ -189,6 +194,7 @@
|
|
189
194
|
E9E8B6EE1D519DFE0012F12C /* GradeSchool */,
|
190
195
|
E9E8B6EF1D519E040012F12C /* Hamming */,
|
191
196
|
E9E8B6F01D519E0B0012F12C /* HelloWorld */,
|
197
|
+
E9A7B2F41DA5ABA3009056B6 /* LargestSeriesProduct */,
|
192
198
|
E9E8B6F11D519E120012F12C /* Leap */,
|
193
199
|
E92FCC0A1D78F2AA00061017 /* Meetup */,
|
194
200
|
E9E8B6F21D519E180012F12C /* NucleotideCount */,
|
@@ -305,6 +311,16 @@
|
|
305
311
|
name = SumOfMultiples;
|
306
312
|
sourceTree = "<group>";
|
307
313
|
};
|
314
|
+
E9A7B2F41DA5ABA3009056B6 /* LargestSeriesProduct */ = {
|
315
|
+
isa = PBXGroup;
|
316
|
+
children = (
|
317
|
+
E9A7B2F51DA5AC37009056B6 /* LargestSeriesProductExample.h */,
|
318
|
+
E9A7B2F61DA5AC37009056B6 /* LargestSeriesProductExample.m */,
|
319
|
+
E9A7B2F81DA5AC55009056B6 /* LargestSeriesProductTest.m */,
|
320
|
+
);
|
321
|
+
name = LargestSeriesProduct;
|
322
|
+
sourceTree = "<group>";
|
323
|
+
};
|
308
324
|
E9C1C0201D9D98B80015E86E /* SecretHandshake */ = {
|
309
325
|
isa = PBXGroup;
|
310
326
|
children = (
|
@@ -595,6 +611,7 @@
|
|
595
611
|
1EFACAB51CCCAF3D006F2E69 /* PhoneNumberExample.m in Sources */,
|
596
612
|
E951B6B91D429550009EB5B6 /* AllergiesTest.m in Sources */,
|
597
613
|
E9381D461D8EDFFA003F22A1 /* DifferenceOfSquaresExample.m in Sources */,
|
614
|
+
E9A7B2F71DA5AC37009056B6 /* LargestSeriesProductExample.m in Sources */,
|
598
615
|
E907D0CA1D6B731600106C42 /* GigasecondExample.m in Sources */,
|
599
616
|
E9381D521D8F2DCC003F22A1 /* ClockExample.m in Sources */,
|
600
617
|
E99D1D811D5533BF0006A303 /* SumOfMultiplesExample.m in Sources */,
|
@@ -631,6 +648,7 @@
|
|
631
648
|
E947A4DE1D81FE0F00633720 /* TriangleExample.m in Sources */,
|
632
649
|
1EFACAAC1CCCAF3D006F2E69 /* HammingTest.m in Sources */,
|
633
650
|
1EFACAA61CCCAF3D006F2E69 /* BobTest.m in Sources */,
|
651
|
+
E9A7B2F91DA5AC55009056B6 /* LargestSeriesProductTest.m in Sources */,
|
634
652
|
1EFACAAF1CCCAF3D006F2E69 /* LeapExample.m in Sources */,
|
635
653
|
E9C1C0251D9D99620015E86E /* SecretHandshakeTest.m in Sources */,
|
636
654
|
E99D1D831D5533D80006A303 /* SumOfMultiplesTest.m in Sources */,
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# Edit this for your own project dependencies
|
2
|
+
OPAM_DEPENDS="ocamlfind core ounit react"
|
3
|
+
|
4
|
+
case "$OCAML_VERSION,$OPAM_VERSION" in
|
5
|
+
4.03.0,1.2.2) ppa=avsm/ocaml42+opam12 ;;
|
6
|
+
*) echo Unknown $OCAML_VERSION,$OPAM_VERSION; exit 1 ;;
|
7
|
+
esac
|
8
|
+
|
9
|
+
echo "yes" | sudo add-apt-repository ppa:$ppa
|
10
|
+
sudo apt-get update -qq
|
11
|
+
sudo apt-get install -qq ocaml ocaml-native-compilers camlp4-extra opam
|
12
|
+
export OPAMYES=1
|
13
|
+
export OPAMVERBOSE=1
|
14
|
+
echo OCaml version
|
15
|
+
ocaml -version
|
16
|
+
echo OPAM versions
|
17
|
+
opam --version
|
18
|
+
opam --git-version
|
19
|
+
|
20
|
+
opam init
|
21
|
+
opam install ${OPAM_DEPENDS}
|
22
|
+
eval `opam config env`
|
23
|
+
make test
|
data/tracks/ocaml/.travis.yml
CHANGED
@@ -0,0 +1,41 @@
|
|
1
|
+
# assignments
|
2
|
+
ASSIGNMENT ?= ""
|
3
|
+
ASSIGNMENTS = $(shell find ./exercises -maxdepth 1 -mindepth 1 -type d | awk -F/ '{print $$NF}' | sort)
|
4
|
+
|
5
|
+
default: test
|
6
|
+
|
7
|
+
# output directories
|
8
|
+
TMPDIR ?= "/tmp/"
|
9
|
+
OUTDIR := $(shell mktemp -d "$(TMPDIR)$(ASSIGNMENT).XXXXXXXXXX")
|
10
|
+
|
11
|
+
# language specific config (tweakable per language)
|
12
|
+
FILEEXT := "ml"
|
13
|
+
EXAMPLE := "example.$(FILEEXT)"
|
14
|
+
SRCFILE := "$(shell echo $(ASSIGNMENT) | sed 's/-/_/g')"
|
15
|
+
TSTFILE := "$(SRCFILE)_test.$(FILEEXT)"
|
16
|
+
# Any additional arguments, such as -p for pretty output and others
|
17
|
+
ARGS ?= ""
|
18
|
+
|
19
|
+
# single test
|
20
|
+
test-assignment:
|
21
|
+
@echo ""
|
22
|
+
@echo ""
|
23
|
+
@echo "----------------------------------------------------------------"
|
24
|
+
@echo "running tests for: $(ASSIGNMENT)"
|
25
|
+
@cp -r ./exercises/$(ASSIGNMENT)/* $(OUTDIR)
|
26
|
+
@cp ./exercises/$(ASSIGNMENT)/$(EXAMPLE) $(OUTDIR)/$(SRCFILE).$(FILEEXT)
|
27
|
+
@make -C $(OUTDIR)
|
28
|
+
@rm -rf $(OUTDIR)
|
29
|
+
|
30
|
+
# all tests
|
31
|
+
test:
|
32
|
+
@for assignment in $(ASSIGNMENTS); do \
|
33
|
+
ASSIGNMENT=$$assignment $(MAKE) -s test-assignment || exit 1;\
|
34
|
+
done
|
35
|
+
|
36
|
+
clean:
|
37
|
+
@for assignment in $(ASSIGNMENTS); do \
|
38
|
+
make -C ./exercises/$$assignment clean;\
|
39
|
+
done
|
40
|
+
|
41
|
+
.PHONY: clean
|
data/tracks/ocaml/config.json
CHANGED
@@ -6,6 +6,7 @@
|
|
6
6
|
"problems": [
|
7
7
|
"hello-world",
|
8
8
|
"bob",
|
9
|
+
"difference-of-squares",
|
9
10
|
"list-ops",
|
10
11
|
"leap",
|
11
12
|
"word-count",
|
@@ -13,6 +14,7 @@
|
|
13
14
|
"beer-song",
|
14
15
|
"nucleotide-count",
|
15
16
|
"rna-transcription",
|
17
|
+
"raindrops",
|
16
18
|
"hamming",
|
17
19
|
"phone-number",
|
18
20
|
"grade-school",
|
@@ -24,6 +26,7 @@
|
|
24
26
|
"prime-factors",
|
25
27
|
"hexadecimal",
|
26
28
|
"luhn",
|
29
|
+
"say",
|
27
30
|
"zipper",
|
28
31
|
"hangman"
|
29
32
|
],
|
@@ -38,6 +41,11 @@
|
|
38
41
|
"difficulty": 1,
|
39
42
|
"topics": []
|
40
43
|
},
|
44
|
+
{
|
45
|
+
"slug": "difference-of-squares",
|
46
|
+
"difficulty": 1,
|
47
|
+
"topics": []
|
48
|
+
},
|
41
49
|
{
|
42
50
|
"slug": "list-ops",
|
43
51
|
"difficulty": 1,
|
@@ -73,6 +81,11 @@
|
|
73
81
|
"difficulty": 1,
|
74
82
|
"topics": []
|
75
83
|
},
|
84
|
+
{
|
85
|
+
"slug": "raindrops",
|
86
|
+
"difficulty": 1,
|
87
|
+
"topics": []
|
88
|
+
},
|
76
89
|
{
|
77
90
|
"slug": "hamming",
|
78
91
|
"difficulty": 1,
|
@@ -128,6 +141,11 @@
|
|
128
141
|
"difficulty": 1,
|
129
142
|
"topics": []
|
130
143
|
},
|
144
|
+
{
|
145
|
+
"slug": "say",
|
146
|
+
"difficulty": 1,
|
147
|
+
"topics": []
|
148
|
+
},
|
131
149
|
{
|
132
150
|
"slug": "zipper",
|
133
151
|
"difficulty": 1,
|
File without changes
|
@@ -1,27 +1,28 @@
|
|
1
1
|
open Core.Std
|
2
2
|
open OUnit2
|
3
|
+
open Beer_song
|
3
4
|
|
4
5
|
let ae exp got = assert_equal ~printer:String.to_string exp got
|
5
6
|
|
6
7
|
let tests =
|
7
8
|
["a verse">:: (fun _ ->
|
8
9
|
let exp = "8 bottles of beer on the wall, 8 bottles of beer.\nTake one down and pass it around, 7 bottles of beer on the wall.\n" in
|
9
|
-
ae exp (
|
10
|
+
ae exp (verse 8));
|
10
11
|
"verse 1">:: (fun _ ->
|
11
12
|
let exp = "1 bottle of beer on the wall, 1 bottle of beer.\nTake it down and pass it around, no more bottles of beer on the wall.\n" in
|
12
|
-
ae exp (
|
13
|
+
ae exp (verse 1));
|
13
14
|
"verse 2">:: (fun _ ->
|
14
15
|
let exp = "2 bottles of beer on the wall, 2 bottles of beer.\nTake one down and pass it around, 1 bottle of beer on the wall.\n" in
|
15
|
-
ae exp (
|
16
|
+
ae exp (verse 2));
|
16
17
|
"verse 0">:: (fun _ ->
|
17
18
|
let exp = "No more bottles of beer on the wall, no more bottles of beer.\nGo to the store and buy some more, 99 bottles of beer on the wall.\n" in
|
18
|
-
ae exp (
|
19
|
+
ae exp (verse 0));
|
19
20
|
"singing several verses">:: (fun _ ->
|
20
21
|
let exp = "8 bottles of beer on the wall, 8 bottles of beer.\nTake one down and pass it around, 7 bottles of beer on the wall.\n\n7 bottles of beer on the wall, 7 bottles of beer.\nTake one down and pass it around, 6 bottles of beer on the wall.\n\n6 bottles of beer on the wall, 6 bottles of beer.\nTake one down and pass it around, 5 bottles of beer on the wall.\n\n" in
|
21
|
-
ae exp (
|
22
|
+
ae exp (sing ~from:8 ~until:6));
|
22
23
|
"sing all the rest of the verses">:: (fun _ ->
|
23
24
|
let exp = "3 bottles of beer on the wall, 3 bottles of beer.\nTake one down and pass it around, 2 bottles of beer on the wall.\n\n2 bottles of beer on the wall, 2 bottles of beer.\nTake one down and pass it around, 1 bottle of beer on the wall.\n\n1 bottle of beer on the wall, 1 bottle of beer.\nTake it down and pass it around, no more bottles of beer on the wall.\n\nNo more bottles of beer on the wall, no more bottles of beer.\nGo to the store and buy some more, 99 bottles of beer on the wall.\n\n" in
|
24
|
-
ae exp (
|
25
|
+
ae exp (sing ~from:3 ~until:0))
|
25
26
|
]
|
26
27
|
|
27
28
|
let () =
|
@@ -0,0 +1,8 @@
|
|
1
|
+
(* Square the sum of the numbers up to the given number *)
|
2
|
+
val square_of_sum : int -> int
|
3
|
+
|
4
|
+
(* Sum the squares of the numbers up to the given number *)
|
5
|
+
val sum_of_squares : int -> int
|
6
|
+
|
7
|
+
(* Subtract sum of squares from square of sums *)
|
8
|
+
val difference_of_squares : int -> int
|
@@ -0,0 +1,21 @@
|
|
1
|
+
open Core.Std
|
2
|
+
|
3
|
+
let rec range a b =
|
4
|
+
if a > b then
|
5
|
+
[]
|
6
|
+
else
|
7
|
+
a :: (range (a + 1) b)
|
8
|
+
|
9
|
+
let square_of_sum n =
|
10
|
+
let numbers = (range 1 n) in
|
11
|
+
let sum = (List.fold ~init:0 ~f:(fun s t -> s + t) numbers) in
|
12
|
+
sum * sum
|
13
|
+
|
14
|
+
let sum_of_squares n =
|
15
|
+
let numbers = (range 1 n) in
|
16
|
+
let square m = m * m in
|
17
|
+
let squares = (List.map ~f:square numbers) in
|
18
|
+
List.fold ~init:0 ~f:(fun s t -> s + t) squares
|
19
|
+
|
20
|
+
let difference_of_squares n =
|
21
|
+
(square_of_sum n) - (sum_of_squares n)
|
@@ -0,0 +1,32 @@
|
|
1
|
+
open Core.Std
|
2
|
+
open OUnit2
|
3
|
+
open Difference_of_squares
|
4
|
+
|
5
|
+
let ae exp got _test_ctxt = assert_equal exp got
|
6
|
+
|
7
|
+
let tests =
|
8
|
+
[
|
9
|
+
"square of sum 5">::
|
10
|
+
ae 225 (square_of_sum 5);
|
11
|
+
"square of sum 10">::
|
12
|
+
ae 3025 (square_of_sum 10);
|
13
|
+
"square of sum 100">::
|
14
|
+
ae 25502500 (square_of_sum 100);
|
15
|
+
"sum of squares 5">::
|
16
|
+
ae 55 (sum_of_squares 5);
|
17
|
+
"sum of squares 10">::
|
18
|
+
ae 385 (sum_of_squares 10);
|
19
|
+
"sum of squares 5">::
|
20
|
+
ae 338350 (sum_of_squares 100);
|
21
|
+
"difference of squares 0">::
|
22
|
+
ae 0 (difference_of_squares 0);
|
23
|
+
"difference of squares 5">::
|
24
|
+
ae 170 (difference_of_squares 5);
|
25
|
+
"difference of squares 10">::
|
26
|
+
ae 2640 (difference_of_squares 10);
|
27
|
+
"difference of squares 100">::
|
28
|
+
ae 25164150 (difference_of_squares 100);
|
29
|
+
]
|
30
|
+
|
31
|
+
let () =
|
32
|
+
run_test_tt_main ("difference of squares tests" >::: tests)
|
File without changes
|
@@ -20,7 +20,7 @@ let ame exp got =
|
|
20
20
|
|
21
21
|
(* The tests never reuse a school value, so if you like you can use destructive
|
22
22
|
* modification (i.e. mutable data structures). For the same reason
|
23
|
-
*
|
23
|
+
* Grade_school.create takes a unit argument.
|
24
24
|
*
|
25
25
|
* For those who wonder why the test doesn't use objects, it's to not force
|
26
26
|
* the use of objects. You can still use them internally though.
|
@@ -28,45 +28,45 @@ let ame exp got =
|
|
28
28
|
|
29
29
|
let tests =
|
30
30
|
["add student">:: (fun _ ->
|
31
|
-
let got =
|
32
|
-
|>
|
31
|
+
let got = Grade_school.create ()
|
32
|
+
|> Grade_school.add "Aimee" 2 in
|
33
33
|
ame (IMap.of_alist_exn [(2, ["Aimee"])])
|
34
|
-
(
|
34
|
+
(Grade_school.to_map got));
|
35
35
|
"add more students in same class">:: (fun _ ->
|
36
|
-
let got =
|
37
|
-
|>
|
38
|
-
|>
|
39
|
-
|>
|
36
|
+
let got = Grade_school.create ()
|
37
|
+
|> Grade_school.add "James" 2
|
38
|
+
|> Grade_school.add "Blair" 2
|
39
|
+
|> Grade_school.add "Paul" 2 in
|
40
40
|
ame (IMap.of_alist_exn [(2, ["Blair"; "James"; "Paul"])])
|
41
|
-
(
|
41
|
+
(Grade_school.to_map got |> Map.map ~f:(List.sort ~cmp:compare)));
|
42
42
|
"add students to different grades">:: (fun _ ->
|
43
|
-
let got =
|
44
|
-
|>
|
45
|
-
|>
|
43
|
+
let got = Grade_school.create ()
|
44
|
+
|> Grade_school.add "Chelsea" 3
|
45
|
+
|> Grade_school.add "Logan" 7 in
|
46
46
|
ame (IMap.of_alist_exn [(3, ["Chelsea"]); (7, ["Logan"])])
|
47
|
-
(
|
47
|
+
(Grade_school.to_map got |> Map.map ~f:(List.sort ~cmp:compare)));
|
48
48
|
"get students in a grade">:: (fun _ ->
|
49
|
-
let got =
|
50
|
-
|>
|
51
|
-
|>
|
52
|
-
|>
|
53
|
-
|>
|
49
|
+
let got = Grade_school.create ()
|
50
|
+
|> Grade_school.add "Franklin" 5
|
51
|
+
|> Grade_school.add "Bradley" 5
|
52
|
+
|> Grade_school.add "Jeff" 1
|
53
|
+
|> Grade_school.grade 5 in
|
54
54
|
ale ["Bradley"; "Franklin"]
|
55
55
|
(List.sort ~cmp:compare got));
|
56
56
|
"get students in a non existant grade">:: (fun _ ->
|
57
|
-
ale [] (List.sort ~cmp:compare (
|
57
|
+
ale [] (List.sort ~cmp:compare (Grade_school.create () |> Grade_school.grade 2)));
|
58
58
|
"sort school">:: (fun _ ->
|
59
|
-
let got =
|
60
|
-
|>
|
61
|
-
|>
|
62
|
-
|>
|
63
|
-
|>
|
64
|
-
|>
|
65
|
-
|>
|
59
|
+
let got = Grade_school.create ()
|
60
|
+
|> Grade_school.add "Christopher" 4
|
61
|
+
|> Grade_school.add "Jennifer" 4
|
62
|
+
|> Grade_school.add "Aaron" 4
|
63
|
+
|> Grade_school.add "Kareem" 6
|
64
|
+
|> Grade_school.add "Kyle" 3
|
65
|
+
|> Grade_school.sort in
|
66
66
|
ame (IMap.of_alist_exn [(3, ["Kyle"]);
|
67
67
|
(4, ["Aaron"; "Christopher"; "Jennifer"]);
|
68
68
|
(6, ["Kareem"])])
|
69
|
-
(
|
69
|
+
(Grade_school.to_map got));
|
70
70
|
]
|
71
71
|
|
72
72
|
let () =
|