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
@@ -0,0 +1,11 @@
|
|
1
|
+
## Hints
|
2
|
+
|
3
|
+
To complete this exercise you need to implement the function `isLeapYear`,
|
4
|
+
that takes a year and determines whether it is a leap year.
|
5
|
+
|
6
|
+
You can use the provided signature if you are unsure about the types, but
|
7
|
+
don't let it restrict your creativity:
|
8
|
+
|
9
|
+
```haskell
|
10
|
+
isLeapYear :: Integer -> Bool
|
11
|
+
```
|
@@ -8,13 +8,13 @@ public class PangramTest {
|
|
8
8
|
|
9
9
|
|
10
10
|
@Test
|
11
|
-
public void
|
11
|
+
public void sentenceEmpty() {
|
12
12
|
assertFalse(Pangrams.isPangram(""));
|
13
13
|
}
|
14
14
|
|
15
15
|
@Ignore
|
16
16
|
@Test
|
17
|
-
public void
|
17
|
+
public void pangramWithOnlyLowerCase() {
|
18
18
|
assertTrue(Pangrams.isPangram("the quick brown fox jumps over the lazy dog"));
|
19
19
|
}
|
20
20
|
|
@@ -26,14 +26,44 @@ public class PangramTest {
|
|
26
26
|
|
27
27
|
@Ignore
|
28
28
|
@Test
|
29
|
-
public void
|
29
|
+
public void anotherMissingCharacterX() {
|
30
|
+
assertFalse(Pangrams.isPangram("the quick brown fish jumps over the lazy dog"));
|
31
|
+
}
|
32
|
+
|
33
|
+
@Ignore
|
34
|
+
@Test
|
35
|
+
public void pangramWithUnderscores() {
|
36
|
+
assertTrue(Pangrams.isPangram("\"the_quick_brown_fox_jumps_over_the_lazy_dog\""));
|
37
|
+
}
|
38
|
+
|
39
|
+
@Ignore
|
40
|
+
@Test
|
41
|
+
public void pangramWithNumbers() {
|
42
|
+
assertTrue(Pangrams.isPangram("\"the 1 quick brown fox jumps over the 2 lazy dogs\""));
|
43
|
+
}
|
44
|
+
|
45
|
+
@Ignore
|
46
|
+
@Test
|
47
|
+
public void missingLettersReplacedByNumbers() {
|
48
|
+
assertFalse(Pangrams.isPangram("\"7h3 qu1ck brown fox jumps ov3r 7h3 lazy dog\""));
|
49
|
+
}
|
50
|
+
|
51
|
+
@Ignore
|
52
|
+
@Test
|
53
|
+
public void pangramWithMixedCaseAndPunctuation() {
|
30
54
|
assertTrue(Pangrams.isPangram("\"Five quacking Zephyrs jolt my wax bed.\""));
|
31
55
|
}
|
32
56
|
|
33
57
|
@Ignore
|
34
58
|
@Test
|
35
|
-
public void
|
59
|
+
public void pangramWithNonAsciiCharacters() {
|
36
60
|
assertTrue(Pangrams.isPangram("Victor jagt zwölf Boxkämpfer quer über den großen Sylter Deich."));
|
37
61
|
}
|
38
62
|
|
63
|
+
|
64
|
+
@Ignore
|
65
|
+
@Test
|
66
|
+
public void panagramInAlphabetOtherThanAscii() {
|
67
|
+
assertFalse(Pangrams.isPangram("Широкая электрификация южных губерний даст мощный толчок подъёму сельского хозяйства."));
|
68
|
+
}
|
39
69
|
}
|
@@ -2,9 +2,7 @@ local pov_from = require('pov').pov_from
|
|
2
2
|
local path_from = require('pov').path_from
|
3
3
|
|
4
4
|
describe('pov', function()
|
5
|
-
|
6
5
|
describe('pov_from.of', function()
|
7
|
-
|
8
6
|
it('should give the POV of a singleton as the singleton', function()
|
9
7
|
assert.same({ 'x' }, pov_from('x').of({ 'x' }))
|
10
8
|
end)
|
@@ -22,13 +20,6 @@ describe('pov', function()
|
|
22
20
|
assert.same(expected, pov_from('leaf').of(simple_tree))
|
23
21
|
end)
|
24
22
|
|
25
|
-
it('should be able give the POV of a leaf in a simple tree', function()
|
26
|
-
local simple_tree = { 'parent', {{ 'sibling' }, { 'leaf' }}}
|
27
|
-
local expected = { 'leaf', {{ 'parent', {{ 'sibling' }}}}}
|
28
|
-
|
29
|
-
assert.same(expected, pov_from('leaf').of(simple_tree))
|
30
|
-
end)
|
31
|
-
|
32
23
|
it('should be able give the POV of the leaf of a deeply nested tree', function()
|
33
24
|
local deeply_nested_tree =
|
34
25
|
{ 'level1', {
|
@@ -124,11 +115,9 @@ describe('pov', function()
|
|
124
115
|
pov_from('leaf').of(tree)
|
125
116
|
assert.same(original_tree, tree)
|
126
117
|
end)
|
127
|
-
|
128
118
|
end)
|
129
119
|
|
130
120
|
describe('path_from.to.of', function()
|
131
|
-
|
132
121
|
it('should be able to give the path from a leaf to the root of a simple tree', function()
|
133
122
|
local simple_tree =
|
134
123
|
{ 'parent', {
|
@@ -189,7 +178,5 @@ describe('pov', function()
|
|
189
178
|
path_from('leaf').to('parent').of(tree)
|
190
179
|
assert.same(original_tree, tree)
|
191
180
|
end)
|
192
|
-
|
193
181
|
end)
|
194
|
-
|
195
182
|
end)
|
data/tracks/mips/docs/ABOUT.md
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
MIPS is a reduced instruction set computer (RISC) instruction set architecture, currently used mostly in video game consoles and
|
1
|
+
MIPS is a reduced instruction set computer (RISC) instruction set architecture, currently used mostly in video game consoles and routers. It is also a popular architecture in introductory courses and textbooks on computer architecture, due to its simplicity relative to x86 and ARM. Here we use the 32-bit instruction set; a 64-bit instruction set also exists.
|
2
2
|
|
3
3
|
This track involves programming in MIPS assembly language, assembled and run on a cross-platform simulator.
|
@@ -31,6 +31,231 @@
|
|
31
31
|
,"secret-handshake"
|
32
32
|
,"acronym"
|
33
33
|
,"run-length-encoding"
|
34
|
+
,"largest-series-product"
|
35
|
+
],
|
36
|
+
"exercises": [
|
37
|
+
{
|
38
|
+
"difficulty": 1,
|
39
|
+
"slug": "hello-world",
|
40
|
+
"topics": [
|
41
|
+
"Text formatting",
|
42
|
+
"Optional values"
|
43
|
+
]
|
44
|
+
},
|
45
|
+
{
|
46
|
+
"difficulty": 1,
|
47
|
+
"slug": "bob",
|
48
|
+
"topics": [
|
49
|
+
"Strings",
|
50
|
+
"Control-flow (if-else statements)"
|
51
|
+
]
|
52
|
+
},
|
53
|
+
{
|
54
|
+
"difficulty": 1,
|
55
|
+
"slug": "leap",
|
56
|
+
"topics": [
|
57
|
+
"Integers"
|
58
|
+
]
|
59
|
+
},
|
60
|
+
{
|
61
|
+
"difficulty": 1,
|
62
|
+
"slug": "gigasecond",
|
63
|
+
"topics": [
|
64
|
+
"Dates"
|
65
|
+
]
|
66
|
+
},
|
67
|
+
{
|
68
|
+
"difficulty": 1,
|
69
|
+
"slug": "difference-of-squares",
|
70
|
+
"topics": [
|
71
|
+
"Integers"
|
72
|
+
]
|
73
|
+
},
|
74
|
+
{
|
75
|
+
"difficulty": 1,
|
76
|
+
"slug": "sum-of-multiples",
|
77
|
+
"topics": [
|
78
|
+
"Lists",
|
79
|
+
"Transforming"
|
80
|
+
]
|
81
|
+
},
|
82
|
+
{
|
83
|
+
"difficulty": 1,
|
84
|
+
"slug": "space-age",
|
85
|
+
"topics": [
|
86
|
+
"Discriminated unions",
|
87
|
+
"Floating-point numbers"
|
88
|
+
]
|
89
|
+
},
|
90
|
+
{
|
91
|
+
"difficulty": 2,
|
92
|
+
"slug": "hamming",
|
93
|
+
"topics": [
|
94
|
+
"Strings",
|
95
|
+
"Filtering"
|
96
|
+
]
|
97
|
+
},
|
98
|
+
{
|
99
|
+
"difficulty": 2,
|
100
|
+
"slug": "nucleotide-count",
|
101
|
+
"topics": [
|
102
|
+
"Maps",
|
103
|
+
"Strings"
|
104
|
+
]
|
105
|
+
},
|
106
|
+
{
|
107
|
+
"difficulty": 2,
|
108
|
+
"slug": "raindrops",
|
109
|
+
"topics": [
|
110
|
+
"Text formatting",
|
111
|
+
"Filtering"
|
112
|
+
]
|
113
|
+
},
|
114
|
+
{
|
115
|
+
"difficulty": 2,
|
116
|
+
"slug": "grade-school",
|
117
|
+
"topics": [
|
118
|
+
"Maps",
|
119
|
+
"Sorting"
|
120
|
+
]
|
121
|
+
},
|
122
|
+
{
|
123
|
+
"difficulty": 2,
|
124
|
+
"slug": "etl",
|
125
|
+
"topics": [
|
126
|
+
"Maps",
|
127
|
+
"Transforming"
|
128
|
+
]
|
129
|
+
},
|
130
|
+
{
|
131
|
+
"difficulty": 3,
|
132
|
+
"slug": "clock",
|
133
|
+
"topics": [
|
134
|
+
"Time",
|
135
|
+
"Structural equality"
|
136
|
+
]
|
137
|
+
},
|
138
|
+
{
|
139
|
+
"difficulty": 3,
|
140
|
+
"slug": "triangle",
|
141
|
+
"topics": [
|
142
|
+
"Integers",
|
143
|
+
"Discriminated unions"
|
144
|
+
]
|
145
|
+
},
|
146
|
+
{
|
147
|
+
"difficulty": 3,
|
148
|
+
"slug": "robot-name",
|
149
|
+
"topics": [
|
150
|
+
"Randomness",
|
151
|
+
"Strings"
|
152
|
+
]
|
153
|
+
},
|
154
|
+
{
|
155
|
+
"difficulty": 3,
|
156
|
+
"slug": "scrabble-score",
|
157
|
+
"topics": [
|
158
|
+
"Transforming"
|
159
|
+
]
|
160
|
+
},
|
161
|
+
{
|
162
|
+
"difficulty": 3,
|
163
|
+
"slug": "phone-number",
|
164
|
+
"topics": [
|
165
|
+
"Parsing",
|
166
|
+
"Transforming"
|
167
|
+
]
|
168
|
+
},
|
169
|
+
{
|
170
|
+
"difficulty": 3,
|
171
|
+
"slug": "perfect-numbers",
|
172
|
+
"topics": [
|
173
|
+
"Integers",
|
174
|
+
"Discriminated unions"
|
175
|
+
]
|
176
|
+
},
|
177
|
+
{
|
178
|
+
"difficulty": 3,
|
179
|
+
"slug": "secret-handshake",
|
180
|
+
"topics": [
|
181
|
+
"Bitwise operations",
|
182
|
+
"Lists"
|
183
|
+
]
|
184
|
+
},
|
185
|
+
{
|
186
|
+
"difficulty": 4,
|
187
|
+
"slug": "word-count",
|
188
|
+
"topics": [
|
189
|
+
"Strings",
|
190
|
+
"Maps",
|
191
|
+
"Transforming"
|
192
|
+
]
|
193
|
+
},
|
194
|
+
{
|
195
|
+
"difficulty": 4,
|
196
|
+
"slug": "allergies",
|
197
|
+
"topics": [
|
198
|
+
"Enumerations",
|
199
|
+
"Bitwise operations",
|
200
|
+
"Filtering"
|
201
|
+
]
|
202
|
+
},
|
203
|
+
{
|
204
|
+
"difficulty": 4,
|
205
|
+
"slug": "meetup",
|
206
|
+
"topics": [
|
207
|
+
"Dates"
|
208
|
+
]
|
209
|
+
},
|
210
|
+
{
|
211
|
+
"difficulty": 4,
|
212
|
+
"slug": "anagram",
|
213
|
+
"topics": [
|
214
|
+
"Strings",
|
215
|
+
"Filtering"
|
216
|
+
]
|
217
|
+
},
|
218
|
+
{
|
219
|
+
"difficulty": 4,
|
220
|
+
"slug": "acronym",
|
221
|
+
"topics": [
|
222
|
+
"Strings",
|
223
|
+
"Transforming"
|
224
|
+
]
|
225
|
+
},
|
226
|
+
{
|
227
|
+
"difficulty": 4,
|
228
|
+
"slug": "all-your-base",
|
229
|
+
"topics": [
|
230
|
+
"Integers",
|
231
|
+
"Transforming"
|
232
|
+
]
|
233
|
+
},
|
234
|
+
{
|
235
|
+
"difficulty": 4,
|
236
|
+
"slug": "largest-series-product",
|
237
|
+
"topics": [
|
238
|
+
"Strings",
|
239
|
+
"Integers",
|
240
|
+
"Transforming"
|
241
|
+
]
|
242
|
+
},
|
243
|
+
{
|
244
|
+
"difficulty": 5,
|
245
|
+
"slug": "roman-numerals",
|
246
|
+
"topics": [
|
247
|
+
"Recursion",
|
248
|
+
"Transforming"
|
249
|
+
]
|
250
|
+
},
|
251
|
+
{
|
252
|
+
"difficulty": 5,
|
253
|
+
"slug": "run-length-encoding",
|
254
|
+
"topics": [
|
255
|
+
"Algorithms",
|
256
|
+
"Transforming"
|
257
|
+
]
|
258
|
+
}
|
34
259
|
],
|
35
260
|
"deprecated": [
|
36
261
|
|
@@ -0,0 +1,63 @@
|
|
1
|
+
#import "LargestSeriesProductExample.h"
|
2
|
+
|
3
|
+
@implementation LargestSeriesProduct {
|
4
|
+
NSArray<NSNumber *> *_numbers;
|
5
|
+
}
|
6
|
+
|
7
|
+
- (instancetype)initWithNumberString:(NSString *)numberString {
|
8
|
+
if (self = [super init]) {
|
9
|
+
NSMutableArray<NSNumber *> *numbers = [[NSMutableArray alloc] initWithCapacity:[numberString length]];
|
10
|
+
NSCharacterSet *decimalSet = [NSCharacterSet decimalDigitCharacterSet];
|
11
|
+
|
12
|
+
for (int i = 0; i < [numberString length]; i++) {
|
13
|
+
unichar character = [numberString characterAtIndex:i];
|
14
|
+
if (![decimalSet characterIsMember:character]) {
|
15
|
+
@throw [NSException exceptionWithName:@"Invalid input" reason:@"Non-decimal character" userInfo:nil];
|
16
|
+
}
|
17
|
+
|
18
|
+
NSString *digit = [NSString stringWithFormat:@"%c", character];
|
19
|
+
|
20
|
+
[numbers addObject:[NSNumber numberWithInt:[digit intValue]]];
|
21
|
+
}
|
22
|
+
|
23
|
+
_numbers = numbers;
|
24
|
+
}
|
25
|
+
|
26
|
+
return self;
|
27
|
+
}
|
28
|
+
|
29
|
+
- (long)largestProduct:(int)numberOfDigits {
|
30
|
+
if (numberOfDigits < 0) {
|
31
|
+
@throw [NSException exceptionWithName:@"Invalid request" reason:@"Negative span" userInfo:nil];
|
32
|
+
}
|
33
|
+
|
34
|
+
int endIndex = (int)[_numbers count] - numberOfDigits;
|
35
|
+
|
36
|
+
if (endIndex < 0) {
|
37
|
+
@throw [NSException exceptionWithName:@"Invalid request" reason:@"Span longer than string length" userInfo:nil];
|
38
|
+
}
|
39
|
+
|
40
|
+
long result = 0;
|
41
|
+
|
42
|
+
for (int i = 0; i <= endIndex; i++) {
|
43
|
+
NSMutableArray *selectedNumbers = [[NSMutableArray alloc] init];
|
44
|
+
|
45
|
+
for (int j = i; j < i + numberOfDigits; j++) {
|
46
|
+
[selectedNumbers addObject:_numbers[j]];
|
47
|
+
}
|
48
|
+
|
49
|
+
long total = 1;
|
50
|
+
|
51
|
+
for (NSNumber *selectedNumber in selectedNumbers) {
|
52
|
+
total *= [selectedNumber intValue];
|
53
|
+
}
|
54
|
+
|
55
|
+
if (total > result) {
|
56
|
+
result = total;
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
return result;
|
61
|
+
}
|
62
|
+
|
63
|
+
@end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
#import <XCTest/XCTest.h>
|
2
|
+
|
3
|
+
#if __has_include("LargestSeriesProductExample.h")
|
4
|
+
# import "LargestSeriesProductExample.h"
|
5
|
+
# else
|
6
|
+
# import "LargestSeriesProduct.h"
|
7
|
+
#endif
|
8
|
+
|
9
|
+
|
10
|
+
@interface LargestSeriesProductTest : XCTestCase
|
11
|
+
|
12
|
+
@end
|
13
|
+
|
14
|
+
@implementation LargestSeriesProductTest
|
15
|
+
|
16
|
+
- (void)testCanFindTheLargestProductOf2WithNumbersInOrder {
|
17
|
+
XCTAssertEqual(72, [[[LargestSeriesProduct alloc] initWithNumberString:@"0123456789"] largestProduct:2]);
|
18
|
+
}
|
19
|
+
|
20
|
+
- (void)testCanFindTheLargestProductOf2 {
|
21
|
+
XCTAssertEqual(48, [[[LargestSeriesProduct alloc] initWithNumberString:@"576802143"] largestProduct:2]);
|
22
|
+
}
|
23
|
+
|
24
|
+
- (void)testFindsTheLargestProductIfSpanEqualsLength {
|
25
|
+
XCTAssertEqual(18, [[[LargestSeriesProduct alloc] initWithNumberString:@"29"] largestProduct:2]);
|
26
|
+
}
|
27
|
+
|
28
|
+
- (void)testCanFindTheLargestProductOf3WithNumbersInOrder {
|
29
|
+
XCTAssertEqual(504, [[[LargestSeriesProduct alloc] initWithNumberString:@"0123456789"] largestProduct:3]);
|
30
|
+
}
|
31
|
+
|
32
|
+
- (void)testCanFindTheLargestProductOf3 {
|
33
|
+
XCTAssertEqual(270, [[[LargestSeriesProduct alloc] initWithNumberString:@"1027839564"] largestProduct:3]);
|
34
|
+
}
|
35
|
+
|
36
|
+
- (void)testCanFindTheLargestProductOf5WithNumbersInOrder {
|
37
|
+
XCTAssertEqual(15120, [[[LargestSeriesProduct alloc] initWithNumberString:@"0123456789"] largestProduct:5]);
|
38
|
+
}
|
39
|
+
|
40
|
+
- (void)testCanGetTheLargestProductOfABigNumber {
|
41
|
+
XCTAssertEqual(23520, [[[LargestSeriesProduct alloc] initWithNumberString:@"73167176531330624919225119674426574742355349194934"] largestProduct:6]);
|
42
|
+
}
|
43
|
+
|
44
|
+
- (void)testCanGetTheLargestProductOfAnotherBigNumber {
|
45
|
+
XCTAssertEqual(28350, [[[LargestSeriesProduct alloc] initWithNumberString:@"52677741234314237566414902593461595376319419139427"] largestProduct:6]);
|
46
|
+
}
|
47
|
+
|
48
|
+
- (void)testCanGetTheLargestProductOfABigNumberProjectEuler {
|
49
|
+
XCTAssertEqual(23514624000, [[[LargestSeriesProduct alloc] initWithNumberString:@"7316717653133062491922511967442657474235534919493496983520312774506326239578318016984801869478851843858615607891129494954595017379583319528532088055111254069874715852386305071569329096329522744304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866452387493035890729629049156044077239071381051585930796086670172427121883998797908792274921901699720888093776657273330010533678812202354218097512545405947522435258490771167055601360483958644670632441572215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145351004748216637048440319989000889524345065854122758866688116427171479924442928230863465674813919123162824586178664583591245665294765456828489128831426076900422421902267105562632111110937054421750694165896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125607176060588611646710940507754100225698315520005593572972571636269561882670428252483600823257530420752963450"] largestProduct:13]);
|
50
|
+
}
|
51
|
+
|
52
|
+
- (void)testReportsZeroIfTheOnlyDigitsAreZero {
|
53
|
+
XCTAssertEqual(0, [[[LargestSeriesProduct alloc] initWithNumberString:@"0000"] largestProduct:2]);
|
54
|
+
}
|
55
|
+
|
56
|
+
- (void)testReportsZeroIfAllSpansIncludeZero {
|
57
|
+
XCTAssertEqual(0, [[[LargestSeriesProduct alloc] initWithNumberString:@"99099"] largestProduct:3]);
|
58
|
+
}
|
59
|
+
|
60
|
+
- (void)testRejectsSpanLongerThanStringLength {
|
61
|
+
XCTAssertThrows([[[LargestSeriesProduct alloc] initWithNumberString:@"123"] largestProduct:4]);
|
62
|
+
}
|
63
|
+
|
64
|
+
- (void)testReports1ForEmptyStringAndEmptyProduct0Span {
|
65
|
+
XCTAssertEqual(1, [[[LargestSeriesProduct alloc] initWithNumberString:@""] largestProduct:0]);
|
66
|
+
}
|
67
|
+
|
68
|
+
- (void)testReports1ForNonemptyStringAndEmptyProduct0Span {
|
69
|
+
XCTAssertEqual(1, [[[LargestSeriesProduct alloc] initWithNumberString:@"123"] largestProduct:0]);
|
70
|
+
}
|
71
|
+
|
72
|
+
- (void)testRejectsEmptyStringAndNonzeroSpan {
|
73
|
+
XCTAssertThrows([[[LargestSeriesProduct alloc] initWithNumberString:@""] largestProduct:1]);
|
74
|
+
}
|
75
|
+
|
76
|
+
- (void)testRejectsInvalidCharacterInDigits {
|
77
|
+
XCTAssertThrows([[[LargestSeriesProduct alloc] initWithNumberString:@"1234a5"] largestProduct:2]);
|
78
|
+
}
|
79
|
+
|
80
|
+
- (void)testRejectsNegativeSpan {
|
81
|
+
XCTAssertThrows([[[LargestSeriesProduct alloc] initWithNumberString:@"12345"] largestProduct:-1]);
|
82
|
+
}
|
83
|
+
|
84
|
+
@end
|