trackler 2.0.0.1 → 2.0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/bump-content +3 -1
- data/bin/verify-metadata +2 -2
- data/common/exercises/alphametics/canonical-data.json +19 -9
- data/common/exercises/food-chain/canonical-data.json +7 -1
- data/common/exercises/grains/canonical-data.json +66 -0
- data/common/exercises/raindrops/description.md +4 -5
- data/common/exercises/triangle/canonical-data.json +81 -54
- data/lib/trackler/version.rb +1 -1
- data/tracks/c/config.json +26 -19
- data/tracks/c/exercises/allergies/makefile +15 -0
- data/tracks/c/exercises/allergies/src/allergies.h +21 -0
- data/tracks/c/exercises/allergies/src/example.c +32 -0
- data/tracks/c/exercises/allergies/src/example.h +26 -0
- data/tracks/c/exercises/allergies/test/test_allergies.c +203 -0
- data/tracks/c/exercises/allergies/test/vendor/unity.c +1300 -0
- data/tracks/c/exercises/allergies/test/vendor/unity.h +274 -0
- data/tracks/c/exercises/allergies/test/vendor/unity_internals.h +701 -0
- data/tracks/c/exercises/atbash-cipher/makefile +16 -0
- data/tracks/c/exercises/atbash-cipher/src/example.c +71 -0
- data/tracks/c/exercises/atbash-cipher/src/example.h +7 -0
- data/tracks/c/exercises/atbash-cipher/test/test_atbash_cipher.c +113 -0
- data/tracks/c/exercises/atbash-cipher/test/vendor/unity.c +1300 -0
- data/tracks/c/exercises/atbash-cipher/test/vendor/unity.h +274 -0
- data/tracks/c/exercises/atbash-cipher/test/vendor/unity_internals.h +701 -0
- data/tracks/c/exercises/phone-number/makefile +16 -0
- data/tracks/c/exercises/phone-number/src/example.c +66 -0
- data/tracks/c/exercises/phone-number/src/example.h +8 -0
- data/tracks/c/exercises/phone-number/test/test_phone_number.c +108 -0
- data/tracks/c/exercises/phone-number/test/vendor/unity.c +1300 -0
- data/tracks/c/exercises/phone-number/test/vendor/unity.h +274 -0
- data/tracks/c/exercises/phone-number/test/vendor/unity_internals.h +701 -0
- data/tracks/csharp/config.json +8 -0
- data/tracks/csharp/exercises/bowling/BowlingTest.cs +188 -33
- data/tracks/csharp/exercises/bowling/Example.cs +38 -9
- data/tracks/csharp/exercises/rectangles/Example.cs +91 -0
- data/tracks/csharp/exercises/rectangles/RectanglesTest.cs +133 -0
- data/tracks/elisp/docs/INSTALLATION.org +1 -1
- data/tracks/elixir/config.json +8 -66
- data/tracks/elixir/docs/LEARNING.md +1 -1
- data/tracks/elixir/exercises/diamond/diamond_test.exs +12 -12
- data/tracks/elixir/exercises/grep/example.exs +92 -0
- data/tracks/elixir/exercises/grep/grep.exs +6 -0
- data/tracks/elixir/exercises/grep/grep_test.exs +259 -0
- data/tracks/elixir/exercises/markdown/markdown.exs +59 -2
- data/tracks/elixir/exercises/nucleotide-count/nucleotide_count_test.exs +4 -4
- data/tracks/elixir/exercises/phone-number/phone_number_test.exs +5 -0
- data/tracks/fsharp/exercises/bowling/BowlingTest.fs +158 -43
- data/tracks/fsharp/exercises/bowling/Example.fs +53 -24
- data/tracks/go/config.json +5 -0
- data/tracks/go/exercises/diamond/diamond_test.go +227 -0
- data/tracks/go/exercises/diamond/example.go +47 -0
- data/tracks/go/exercises/food-chain/example.go +1 -1
- data/tracks/go/exercises/food-chain/food_chain_test.go +30 -6
- data/tracks/go/exercises/nucleotide-count/example.go +21 -8
- data/tracks/go/exercises/nucleotide-count/nucleotide_count_test.go +45 -37
- data/tracks/haskell/exercises/anagram/test/Tests.hs +1 -11
- data/tracks/java/bin/journey-test.sh +165 -128
- data/tracks/java/docs/ABOUT.md +5 -8
- data/tracks/java/exercises/hello-world/build.gradle +0 -6
- data/tracks/java/exercises/hello-world/src/test/java/HelloWorldTest.java +0 -1
- data/tracks/java/exercises/meetup/build.gradle +0 -1
- data/tracks/java/exercises/meetup/src/example/java/Meetup.java +9 -7
- data/tracks/java/exercises/meetup/src/test/java/MeetupTest.java +185 -188
- data/tracks/lua/config.json +0 -73
- data/tracks/lua/exercises/bowling/bowling_spec.lua +92 -48
- data/tracks/lua/exercises/bowling/example.lua +4 -1
- data/tracks/objective-c/config.json +9 -30
- data/tracks/objective-c/exercises/pangram/PangramExample.h +7 -0
- data/tracks/objective-c/exercises/pangram/PangramExample.m +21 -0
- data/tracks/objective-c/exercises/pangram/PangramTest.m +51 -0
- data/tracks/objective-c/xcodeProject/ObjectiveC.xcodeproj/project.pbxproj +18 -0
- data/tracks/ocaml/README.md +46 -1
- data/tracks/ocaml/SETUP.md +21 -2
- data/tracks/ocaml/config.json +48 -78
- data/tracks/perl5/README.md +15 -8
- data/tracks/perl5/testall.pl +5 -5
- data/tracks/php/config.json +26 -34
- data/tracks/php/docs/ABOUT.md +15 -0
- data/tracks/php/exercises/allergies/allergies_test.php +121 -0
- data/tracks/php/exercises/allergies/example.php +64 -0
- data/tracks/php/exercises/etl/etl_test.php +52 -0
- data/tracks/php/exercises/etl/example.php +12 -0
- data/tracks/php/exercises/nucleotide-count/example.php +25 -0
- data/tracks/php/exercises/nucleotide-count/nucleotide-count_test.php +36 -0
- data/tracks/php/exercises/pig-latin/example.php +25 -29
- data/tracks/php/exercises/pig-latin/pig-latin_test.php +26 -19
- data/tracks/php/exercises/space-age/example.php +65 -0
- data/tracks/php/exercises/space-age/space-age_test.php +70 -0
- data/tracks/php/exercises/triangle/example.php +43 -0
- data/tracks/php/exercises/triangle/triangle_test.php +140 -0
- data/tracks/pony/exercises/anagram/example.pony +6 -6
- data/tracks/pony/exercises/anagram/test.pony +3 -4
- data/tracks/pony/exercises/bob/test.pony +23 -23
- data/tracks/pony/exercises/difference-of-squares/test.pony +11 -11
- data/tracks/pony/exercises/hamming/example.pony +3 -3
- data/tracks/pony/exercises/hamming/test.pony +16 -16
- data/tracks/pony/exercises/hello-world/test.pony +5 -4
- data/tracks/pony/exercises/leap/test.pony +8 -8
- data/tracks/python/config.json +18 -0
- data/tracks/python/exercises/diamond/diamond_test.py +33 -0
- data/tracks/python/exercises/diamond/example.py +15 -0
- data/tracks/python/exercises/linked-list/example.py +47 -0
- data/tracks/python/exercises/linked-list/linked_list.py +13 -0
- data/tracks/python/exercises/linked-list/linked_list_test.py +49 -0
- data/tracks/python/exercises/list-ops/example.py +55 -0
- data/tracks/python/exercises/list-ops/list_ops.py +38 -0
- data/tracks/python/exercises/list-ops/list_ops_test.py +136 -0
- data/tracks/ruby/bin/generate +22 -2
- data/tracks/ruby/config.json +12 -83
- data/tracks/ruby/exercises/allergies/allergies_test.rb +0 -1
- data/tracks/ruby/exercises/atbash-cipher/atbash_cipher_test.rb +0 -1
- data/tracks/ruby/exercises/beer-song/beer_song_test.rb +1 -2
- data/tracks/ruby/exercises/binary/example.rb +0 -1
- data/tracks/ruby/exercises/binary-search-tree/binary_search_tree_test.rb +1 -1
- data/tracks/ruby/exercises/bowling/.version +1 -0
- data/tracks/ruby/exercises/bowling/bowling_test.rb +109 -133
- data/tracks/ruby/exercises/bowling/example.rb +7 -7
- data/tracks/ruby/exercises/bowling/example.tt +27 -0
- data/tracks/ruby/exercises/circular-buffer/circular_buffer_test.rb +0 -2
- data/tracks/ruby/exercises/clock/example.rb +0 -2
- data/tracks/ruby/exercises/connect/connect_test.rb +0 -1
- data/tracks/ruby/exercises/custom-set/custom_set_test.rb +0 -1
- data/tracks/ruby/exercises/diamond/diamond_test.rb +0 -1
- data/tracks/ruby/exercises/etl/etl_test.rb +1 -1
- data/tracks/ruby/exercises/house/house_test.rb +0 -1
- data/tracks/ruby/exercises/isogram/isogram_test.rb +2 -2
- data/tracks/ruby/exercises/largest-series-product/example.tt +0 -3
- data/tracks/ruby/exercises/largest-series-product/largest_series_product_test.rb +0 -4
- data/tracks/ruby/exercises/linked-list/linked_list_test.rb +1 -1
- data/tracks/ruby/exercises/meetup/meetup_test.rb +0 -1
- data/tracks/ruby/exercises/nth-prime/example.tt +0 -2
- data/tracks/ruby/exercises/nth-prime/nth_prime_test.rb +0 -2
- data/tracks/ruby/exercises/ocr-numbers/ocr_numbers_test.rb +1 -2
- data/tracks/ruby/exercises/protein-translation/protein_translation_test.rb +0 -1
- data/tracks/ruby/exercises/proverb/proverb_test.rb +1 -3
- data/tracks/ruby/exercises/queen-attack/example.rb +3 -1
- data/tracks/ruby/exercises/queen-attack/queen_attack_test.rb +34 -8
- data/tracks/ruby/exercises/robot-simulator/robot_simulator_test.rb +1 -1
- data/tracks/ruby/exercises/strain/strain_test.rb +2 -2
- data/tracks/ruby/exercises/tournament/.version +1 -0
- data/tracks/ruby/exercises/tournament/example.rb +54 -0
- data/tracks/ruby/exercises/tournament/example.tt +23 -0
- data/tracks/ruby/exercises/tournament/tournament_test.rb +92 -0
- data/tracks/ruby/exercises/transpose/.version +1 -0
- data/tracks/ruby/exercises/transpose/example.rb +14 -0
- data/tracks/ruby/exercises/transpose/example.tt +22 -0
- data/tracks/ruby/exercises/transpose/transpose_test.rb +303 -0
- data/tracks/ruby/lib/bowling_cases.rb +46 -0
- data/tracks/ruby/lib/isogram_cases.rb +1 -1
- data/tracks/ruby/lib/tournament_cases.rb +45 -0
- data/tracks/ruby/lib/transpose_cases.rb +45 -0
- data/tracks/rust/config.json +2 -0
- data/tracks/rust/exercises/bowling/.gitignore +7 -0
- data/tracks/rust/exercises/bowling/Cargo.toml +3 -0
- data/tracks/rust/exercises/bowling/example.rs +134 -0
- data/tracks/rust/exercises/bowling/tests/bowling.rs +373 -0
- data/tracks/rust/exercises/grains/.gitignore +7 -0
- data/tracks/rust/exercises/grains/Cargo.toml +3 -0
- data/tracks/rust/exercises/grains/example.rs +11 -0
- data/tracks/rust/exercises/grains/src/lib.rs +7 -0
- data/tracks/rust/exercises/grains/tests/grains.rs +63 -0
- data/tracks/rust/problems.md +2 -0
- data/tracks/scala/README.md +38 -0
- data/tracks/scala/config.json +20 -74
- data/tracks/scala/exercises/accumulate/src/test/scala/accumulate_test.scala +4 -0
- data/tracks/scala/exercises/allergies/src/test/scala/allergies_test.scala +11 -0
- data/tracks/scala/exercises/alphametics/build.sbt +6 -0
- data/tracks/scala/exercises/alphametics/example.scala +125 -0
- data/tracks/scala/exercises/alphametics/src/main/scala/.keep +0 -0
- data/tracks/scala/exercises/alphametics/src/test/scala/AlphameticsTest.scala +62 -0
- data/tracks/scala/exercises/atbash-cipher/src/test/scala/atbash_test.scala +8 -0
- data/tracks/scala/exercises/bank-account/src/test/scala/BankAccountTest.scala +4 -0
- data/tracks/scala/exercises/binary/src/test/scala/binary_test.scala +13 -0
- data/tracks/scala/exercises/binary-search-tree/src/test/scala/BstTest.scala +11 -0
- data/tracks/scala/exercises/bowling/Example.scala +116 -0
- data/tracks/scala/exercises/bowling/build.sbt +3 -0
- data/tracks/scala/exercises/bowling/src/main/scala/Bowling.scala +11 -0
- data/tracks/scala/exercises/bowling/src/test/scala/BowlingSuite.scala +237 -0
- data/tracks/scala/exercises/clock/src/test/scala/ClockTest.scala +50 -0
- data/tracks/scala/exercises/connect/README.md +17 -0
- data/tracks/scala/exercises/connect/src/test/scala/ConnectTest.scala +7 -0
- data/tracks/scala/exercises/crypto-square/src/test/scala/{CrytpoSquareTest.scala → CryptoSquareTest.scala} +9 -0
- data/tracks/scala/exercises/custom-set/src/test/scala/CustomSetTest.scala +36 -0
- data/tracks/scala/exercises/difference-of-squares/src/test/scala/squares_test.scala +8 -0
- data/tracks/scala/exercises/forth/src/test/scala/ForthTest.scala +22 -0
- data/tracks/scala/exercises/hexadecimal/src/test/scala/HexadecimalTest.scala +8 -0
- data/tracks/scala/exercises/kindergarten-garden/src/test/scala/GardenTest.scala +5 -0
- data/tracks/scala/exercises/largest-series-product/src/test/scala/SeriesTest.scala +2 -0
- data/tracks/scala/exercises/linked-list/src/test/scala/DequeTest.scala +4 -0
- data/tracks/scala/exercises/luhn/src/test/scala/LuhnTest.scala +4 -0
- data/tracks/scala/exercises/matrix/src/test/scala/MatrixTest.scala +2 -0
- data/tracks/scala/exercises/minesweeper/src/test/scala/MinesweeperTest.scala +6 -0
- data/tracks/scala/exercises/nth-prime/src/test/scala/PrimeTest.scala +5 -0
- data/tracks/scala/exercises/ocr-numbers/src/test/scala/OcrTest.scala +15 -0
- data/tracks/scala/exercises/octal/src/test/scala/OctalTest.scala +7 -0
- data/tracks/scala/exercises/parallel-letter-frequency/src/test/scala/FrequencyTest.scala +8 -0
- data/tracks/scala/exercises/pascals-triangle/src/test/scala/PascalsTriangleTest.scala +5 -0
- data/tracks/scala/exercises/pig-latin/src/test/scala/PigLatinTest.scala +4 -0
- data/tracks/scala/exercises/pythagorean-triplet/src/test/scala/PythagoreanTripletTest.scala +3 -0
- data/tracks/scala/exercises/queen-attack/src/test/scala/QueensTest.scala +5 -0
- data/tracks/scala/exercises/robot-simulator/src/test/scala/RobotTest.scala +16 -8
- data/tracks/scala/exercises/say/src/test/scala/SayTest.scala +34 -17
- data/tracks/scala/exercises/scrabble-score/src/test/scala/scrabble_score_test.scala +6 -0
- data/tracks/scala/exercises/secret-handshake/src/test/scala/SecretHandshakeTest.scala +18 -9
- data/tracks/scala/exercises/series/src/test/scala/SeriesTest.scala +4 -2
- data/tracks/scala/exercises/sieve/src/test/scala/SieveTest.scala +8 -4
- data/tracks/scala/exercises/simple-cipher/src/test/scala/CipherTest.scala +17 -9
- data/tracks/scala/exercises/sublist/src/test/scala/sublist_test.scala +17 -0
- data/tracks/scala/exercises/trinary/src/test/scala/TrinaryTest.scala +14 -7
- data/tracks/scala/exercises/wordy/src/test/scala/WordProblemTest.scala +28 -14
- data/tracks/scala/project/Build.scala +3 -3
- data/tracks/scala/testgen/src/main/scala/BowlingTestGenerator.scala +57 -0
- data/tracks/sml/config.json +41 -6
- data/tracks/sml/exercises/flatten-array/example.sml +6 -0
- data/tracks/sml/exercises/flatten-array/test_flatten_array.sml +10 -0
- data/tracks/sml/exercises/nth-prime/example.sml +46 -0
- data/tracks/sml/exercises/nth-prime/test_nth_prime.sml +14 -0
- data/tracks/sml/exercises/raindrops/example.sml +9 -0
- data/tracks/sml/exercises/raindrops/raindrops.sml +2 -0
- data/tracks/sml/exercises/raindrops/test_raindrops.sml +95 -0
- data/tracks/swift/config.json +269 -328
- data/tracks/swift/exercises/pangram/PangramExample.swift +17 -0
- data/tracks/swift/exercises/pangram/PangramTest.swift +43 -0
- data/tracks/swift/xcodeProject/xSwift.xcodeproj/project.pbxproj +16 -0
- metadata +95 -3
|
@@ -10,22 +10,22 @@ actor Main is TestList
|
|
|
10
10
|
fun tag tests(test: PonyTest) =>
|
|
11
11
|
test(_TestSquares)
|
|
12
12
|
|
|
13
|
-
class _TestSquares
|
|
13
|
+
class iso _TestSquares is UnitTest
|
|
14
14
|
"""
|
|
15
15
|
Test Difference of Squares package
|
|
16
16
|
"""
|
|
17
17
|
|
|
18
18
|
fun name(): String => "difference-of-squares/Squares"
|
|
19
19
|
|
|
20
|
-
fun apply(h: TestHelper)
|
|
21
|
-
h.
|
|
22
|
-
h.
|
|
23
|
-
h.
|
|
20
|
+
fun apply(h: TestHelper) =>
|
|
21
|
+
h.assert_eq[U32](225, Squares(5).square_of_sums())
|
|
22
|
+
h.assert_eq[U32](55, Squares(5).sum_of_squares())
|
|
23
|
+
h.assert_eq[U32](170, Squares(5).difference())
|
|
24
24
|
|
|
25
|
-
h.
|
|
26
|
-
h.
|
|
27
|
-
h.
|
|
25
|
+
h.assert_eq[U32](3025, Squares(10).square_of_sums())
|
|
26
|
+
h.assert_eq[U32](385, Squares(10).sum_of_squares())
|
|
27
|
+
h.assert_eq[U32](2640, Squares(10).difference())
|
|
28
28
|
|
|
29
|
-
h.
|
|
30
|
-
h.
|
|
31
|
-
h.
|
|
29
|
+
h.assert_eq[U32](25502500, Squares(100).square_of_sums())
|
|
30
|
+
h.assert_eq[U32](338350, Squares(100).sum_of_squares())
|
|
31
|
+
h.assert_eq[U32](25164150, Squares(100).difference())
|
|
@@ -12,11 +12,11 @@ class Hamming
|
|
|
12
12
|
compute_distance(strand1, strand2)
|
|
13
13
|
|
|
14
14
|
fun compute_distance(strand1: String, strand2: String): U8 ? =>
|
|
15
|
-
let size:
|
|
15
|
+
let size: USize = strand1.size()
|
|
16
16
|
var dist: U8 = U8(0)
|
|
17
|
-
var idx:
|
|
17
|
+
var idx: ISize = 0
|
|
18
18
|
|
|
19
|
-
while idx < size.
|
|
19
|
+
while idx < size.isize() do
|
|
20
20
|
if (strand1.at_offset(idx).ne(strand2.at_offset(idx))) then
|
|
21
21
|
dist = dist + 1
|
|
22
22
|
end
|
|
@@ -11,30 +11,30 @@ actor Main is TestList
|
|
|
11
11
|
test(_HammingDistanceTest)
|
|
12
12
|
test(_HammingParamTest)
|
|
13
13
|
|
|
14
|
-
class _HammingDistanceTest
|
|
14
|
+
class iso _HammingDistanceTest is UnitTest
|
|
15
15
|
"""
|
|
16
16
|
Test Hamming package returns the right distance
|
|
17
17
|
"""
|
|
18
18
|
fun name(): String => "hamming/Hamming"
|
|
19
19
|
|
|
20
|
-
fun apply(h: TestHelper):
|
|
21
|
-
h.
|
|
22
|
-
h.
|
|
23
|
-
h.
|
|
24
|
-
h.
|
|
25
|
-
h.
|
|
26
|
-
h.
|
|
27
|
-
h.
|
|
28
|
-
h.
|
|
29
|
-
h.
|
|
30
|
-
h.
|
|
20
|
+
fun apply(h: TestHelper): None ? =>
|
|
21
|
+
h.assert_eq[U8](0, Hamming("A", "A"))
|
|
22
|
+
h.assert_eq[U8](0, Hamming("GGACTGA", "GGACTGA"))
|
|
23
|
+
h.assert_eq[U8](1, Hamming("A", "G"))
|
|
24
|
+
h.assert_eq[U8](2, Hamming("AG", "CT"))
|
|
25
|
+
h.assert_eq[U8](1, Hamming("AT", "CT"))
|
|
26
|
+
h.assert_eq[U8](1, Hamming("GGACG", "GGTCG"))
|
|
27
|
+
h.assert_eq[U8](2, Hamming("ACCAGGG", "ACTATGG"))
|
|
28
|
+
h.assert_eq[U8](1, Hamming("AGG", "AGA"))
|
|
29
|
+
h.assert_eq[U8](4, Hamming("GATACA", "GCATAA"))
|
|
30
|
+
h.assert_eq[U8](9, Hamming("GGACGGATTCTG", "AGGACGGATTCT"))
|
|
31
31
|
|
|
32
|
-
class _HammingParamTest
|
|
32
|
+
class iso _HammingParamTest is UnitTest
|
|
33
33
|
"""
|
|
34
34
|
Test Hamming package returns the right distance
|
|
35
35
|
"""
|
|
36
36
|
fun name(): String => "hamming/Hamming"
|
|
37
37
|
|
|
38
|
-
fun apply(h: TestHelper)
|
|
39
|
-
h.
|
|
40
|
-
h.
|
|
38
|
+
fun apply(h: TestHelper) =>
|
|
39
|
+
h.assert_error(lambda()? => Hamming("GAT", "GA") end)
|
|
40
|
+
h.assert_error(lambda()? => Hamming("GA", "GAC") end)
|
|
@@ -10,14 +10,15 @@ actor Main is TestList
|
|
|
10
10
|
fun tag tests(test: PonyTest) =>
|
|
11
11
|
test(_TestHelloWorld)
|
|
12
12
|
|
|
13
|
-
class _TestHelloWorld
|
|
13
|
+
class iso _TestHelloWorld is UnitTest
|
|
14
14
|
"""
|
|
15
15
|
Test HelloWorld package
|
|
16
16
|
"""
|
|
17
17
|
fun name(): String => "hello-world/HelloWorld"
|
|
18
18
|
|
|
19
|
-
fun apply(h: TestHelper)
|
|
19
|
+
fun apply(h: TestHelper) =>
|
|
20
20
|
let hello: HelloWorld = HelloWorld.create()
|
|
21
21
|
|
|
22
|
-
h.
|
|
23
|
-
h.
|
|
22
|
+
h.assert_eq[String]("Hello, World!", hello.say_hello())
|
|
23
|
+
h.assert_eq[String]("Hello, Exercism!", hello.say_hello("Exercism"))
|
|
24
|
+
|
|
@@ -10,18 +10,18 @@ actor Main is TestList
|
|
|
10
10
|
fun tag tests(test: PonyTest) =>
|
|
11
11
|
test(_LeapTest)
|
|
12
12
|
|
|
13
|
-
class _LeapTest
|
|
13
|
+
class iso _LeapTest is UnitTest
|
|
14
14
|
"""
|
|
15
15
|
Test Leap package
|
|
16
16
|
"""
|
|
17
17
|
fun name(): String => "leap/Leap"
|
|
18
18
|
|
|
19
|
-
fun apply(h: TestHelper)
|
|
20
|
-
// Note -> Current master-branch simplifies these functions to
|
|
19
|
+
fun apply(h: TestHelper) =>
|
|
20
|
+
// Note -> Current master-branch simplifies these functions to
|
|
21
21
|
// assert_true/false, and removes expect
|
|
22
22
|
// https://github.com/ponylang/ponyc/blob/master/packages/ponytest/helper.pony
|
|
23
|
-
h.
|
|
24
|
-
h.
|
|
25
|
-
h.
|
|
26
|
-
h.
|
|
27
|
-
h.
|
|
23
|
+
h.assert_true(Leap(1996), "Testing a leap year")
|
|
24
|
+
h.assert_false(Leap(1997), "Testing an odd year")
|
|
25
|
+
h.assert_false(Leap(1998), "Testing a non-leap even year")
|
|
26
|
+
h.assert_false(Leap(1900), "Testing a century")
|
|
27
|
+
h.assert_true(Leap(2000), "Testing an exceptional century")
|
data/tracks/python/config.json
CHANGED
|
@@ -411,6 +411,24 @@
|
|
|
411
411
|
"difficulty": 1,
|
|
412
412
|
"topics": [
|
|
413
413
|
]
|
|
414
|
+
},
|
|
415
|
+
{
|
|
416
|
+
"slug": "list-ops",
|
|
417
|
+
"difficulty": 1,
|
|
418
|
+
"topics": [
|
|
419
|
+
]
|
|
420
|
+
},
|
|
421
|
+
{
|
|
422
|
+
"slug": "linked-list",
|
|
423
|
+
"difficulty": 1,
|
|
424
|
+
"topics": [
|
|
425
|
+
]
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
"slug": "diamond",
|
|
429
|
+
"difficulty": 1,
|
|
430
|
+
"topics": [
|
|
431
|
+
]
|
|
414
432
|
}
|
|
415
433
|
],
|
|
416
434
|
"deprecated": [
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import unittest
|
|
2
|
+
|
|
3
|
+
from diamond import make_diamond
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class DiamondTests(unittest.TestCase):
|
|
7
|
+
|
|
8
|
+
def test_letter_A(self):
|
|
9
|
+
self.assertMultiLineEqual('A\n', make_diamond('A'))
|
|
10
|
+
|
|
11
|
+
def test_letter_C(self):
|
|
12
|
+
result = [' A ',
|
|
13
|
+
' B B ',
|
|
14
|
+
'C C',
|
|
15
|
+
' B B ',
|
|
16
|
+
' A ']
|
|
17
|
+
self.assertMultiLineEqual('\n'.join(result) + '\n', make_diamond('C'))
|
|
18
|
+
|
|
19
|
+
def test_letter_E(self):
|
|
20
|
+
result = [' A ',
|
|
21
|
+
' B B ',
|
|
22
|
+
' C C ',
|
|
23
|
+
' D D ',
|
|
24
|
+
'E E',
|
|
25
|
+
' D D ',
|
|
26
|
+
' C C ',
|
|
27
|
+
' B B ',
|
|
28
|
+
' A ']
|
|
29
|
+
self.assertMultiLineEqual('\n'.join(result) + '\n', make_diamond('E'))
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
if __name__ == '__main__':
|
|
33
|
+
unittest.main()
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
def make_diamond(letter):
|
|
2
|
+
rows = ord(letter) - 64
|
|
3
|
+
cols = rows * 2 - 1
|
|
4
|
+
half = make_half(rows, cols)
|
|
5
|
+
return ''.join(half + half[-2::-1])
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def make_half(rows, cols):
|
|
9
|
+
diamond_half = []
|
|
10
|
+
for x in range(rows):
|
|
11
|
+
row = [' '] * cols
|
|
12
|
+
row[rows - 1 - x] = chr(x + 65)
|
|
13
|
+
row[rows - 1 + x] = chr(x + 65)
|
|
14
|
+
diamond_half.append(''.join(row) + '\n')
|
|
15
|
+
return diamond_half
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
class Node(object):
|
|
2
|
+
def __init__(self, value, next=None, prev=None):
|
|
3
|
+
self.value = value
|
|
4
|
+
self.next = next
|
|
5
|
+
self.prev = prev
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class LinkedList(object):
|
|
9
|
+
def __init__(self):
|
|
10
|
+
self.head = None
|
|
11
|
+
self.tail = None
|
|
12
|
+
|
|
13
|
+
def push(self, value):
|
|
14
|
+
new_node = Node(value)
|
|
15
|
+
if not self.head:
|
|
16
|
+
self.head = self.tail = new_node
|
|
17
|
+
else:
|
|
18
|
+
new_node.prev = self.tail
|
|
19
|
+
self.tail.next = new_node
|
|
20
|
+
self.tail = new_node
|
|
21
|
+
|
|
22
|
+
def pop(self):
|
|
23
|
+
node = self.tail
|
|
24
|
+
if node is None or node.prev is None:
|
|
25
|
+
self.head = self.tail = None
|
|
26
|
+
else:
|
|
27
|
+
self.tail = self.tail.prev
|
|
28
|
+
self.tail.next = None
|
|
29
|
+
return node.value
|
|
30
|
+
|
|
31
|
+
def shift(self):
|
|
32
|
+
node = self.head
|
|
33
|
+
if node is None or node.next is None:
|
|
34
|
+
self.head = self.tail = None
|
|
35
|
+
else:
|
|
36
|
+
self.head = self.head.next
|
|
37
|
+
self.head.prev = None
|
|
38
|
+
return node.value
|
|
39
|
+
|
|
40
|
+
def unshift(self, value):
|
|
41
|
+
new_node = Node(value)
|
|
42
|
+
if not self.head:
|
|
43
|
+
self.head = self.tail = new_node
|
|
44
|
+
else:
|
|
45
|
+
new_node.next = self.head
|
|
46
|
+
self.head.prev = new_node
|
|
47
|
+
self.head = new_node
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Skeleton file for the Python "linked-list" exercise.
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class Node(object):
|
|
5
|
+
def __init__(self, value, next=None, prev=None):
|
|
6
|
+
self.value = value
|
|
7
|
+
self.next = next
|
|
8
|
+
self.prev = prev
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class LinkedList(object):
|
|
12
|
+
def __init__(self):
|
|
13
|
+
pass # Complete the Deque class ...
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import unittest
|
|
2
|
+
|
|
3
|
+
from linked_list import LinkedList
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class LinkedListTests(unittest.TestCase):
|
|
7
|
+
|
|
8
|
+
def setUp(self):
|
|
9
|
+
self.list = LinkedList()
|
|
10
|
+
|
|
11
|
+
def test_push_pop(self):
|
|
12
|
+
self.list.push(10)
|
|
13
|
+
self.list.push(20)
|
|
14
|
+
self.assertEqual(20, self.list.pop())
|
|
15
|
+
self.assertEqual(10, self.list.pop())
|
|
16
|
+
|
|
17
|
+
def test_push_shift(self):
|
|
18
|
+
self.list.push(10)
|
|
19
|
+
self.list.push(20)
|
|
20
|
+
self.assertEqual(10, self.list.shift())
|
|
21
|
+
self.assertEqual(20, self.list.shift())
|
|
22
|
+
|
|
23
|
+
def test_unshift_shift(self):
|
|
24
|
+
self.list.unshift(10)
|
|
25
|
+
self.list.unshift(20)
|
|
26
|
+
self.assertEqual(20, self.list.shift())
|
|
27
|
+
self.assertEqual(10, self.list.shift())
|
|
28
|
+
|
|
29
|
+
def test_unshift_pop(self):
|
|
30
|
+
self.list.unshift(10)
|
|
31
|
+
self.list.unshift(20)
|
|
32
|
+
self.assertEqual(10, self.list.pop())
|
|
33
|
+
self.assertEqual(20, self.list.pop())
|
|
34
|
+
|
|
35
|
+
def test_all(self):
|
|
36
|
+
self.list.push(10)
|
|
37
|
+
self.list.push(20)
|
|
38
|
+
self.assertEqual(20, self.list.pop())
|
|
39
|
+
self.list.push(30)
|
|
40
|
+
self.assertEqual(10, self.list.shift())
|
|
41
|
+
self.list.unshift(40)
|
|
42
|
+
self.list.push(50)
|
|
43
|
+
self.assertEqual(40, self.list.shift())
|
|
44
|
+
self.assertEqual(50, self.list.pop())
|
|
45
|
+
self.assertEqual(30, self.list.shift())
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
if __name__ == '__main__':
|
|
49
|
+
unittest.main()
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
def map_clone(function, xs):
|
|
2
|
+
return (function(elem) for elem in xs)
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def length(xs):
|
|
6
|
+
return sum(1 for x in xs)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def filter_clone(function, xs):
|
|
10
|
+
return (x for x in xs if function(x))
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def reverse(xs):
|
|
14
|
+
if not xs:
|
|
15
|
+
return []
|
|
16
|
+
else:
|
|
17
|
+
return xs[::-1]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def append(xs, y):
|
|
21
|
+
xs[len(xs):] = [y]
|
|
22
|
+
return xs
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def foldl(function, xs, acc):
|
|
26
|
+
if(len(xs) == 0):
|
|
27
|
+
return acc
|
|
28
|
+
else:
|
|
29
|
+
return foldl(function, xs[1:], function(acc, xs[0]))
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def foldr(function, xs, acc):
|
|
33
|
+
if(len(xs) == 0):
|
|
34
|
+
return acc
|
|
35
|
+
else:
|
|
36
|
+
return function(xs[0], foldr(function, xs[1:], acc))
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def flat(xs):
|
|
40
|
+
out = []
|
|
41
|
+
for item in xs:
|
|
42
|
+
if isinstance(item, (list, tuple)):
|
|
43
|
+
out.extend(flat(item))
|
|
44
|
+
else:
|
|
45
|
+
out.append(item)
|
|
46
|
+
return out
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def concat(xs, ys):
|
|
50
|
+
if not ys:
|
|
51
|
+
return xs
|
|
52
|
+
else:
|
|
53
|
+
for item in ys:
|
|
54
|
+
xs.append(item)
|
|
55
|
+
return xs
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Please, do not use the built-in python functions like map, reduce, len, etc.
|
|
2
|
+
# that solve the same problems and try to solve it yourself instead.
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
def map_clone(function, xs):
|
|
6
|
+
return xs
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def length(xs):
|
|
10
|
+
return xs
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def filter_clone(function, xs):
|
|
14
|
+
return xs
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def reverse(xs):
|
|
18
|
+
return xs
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def append(xs, y):
|
|
22
|
+
return xs
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def foldl(function, xs, acc):
|
|
26
|
+
return xs
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def foldr(function, xs, acc):
|
|
30
|
+
return xs
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def flat(xs):
|
|
34
|
+
return xs
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def concat(xs, ys):
|
|
38
|
+
return xs
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import unittest
|
|
2
|
+
import operator
|
|
3
|
+
|
|
4
|
+
import list_ops
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class ListOpsTest(unittest.TestCase):
|
|
8
|
+
|
|
9
|
+
# tests for map
|
|
10
|
+
def test_map_square(self):
|
|
11
|
+
self.assertEqual(
|
|
12
|
+
(1, 4, 9, 16, 25, 36, 49, 64, 81, 100),
|
|
13
|
+
tuple(list_ops.map_clone(
|
|
14
|
+
lambda x: x**2, (1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
|
|
15
|
+
)
|
|
16
|
+
)
|
|
17
|
+
|
|
18
|
+
def test_map_cube(self):
|
|
19
|
+
self.assertEqual(
|
|
20
|
+
(-1, 8, -27, 64, -125, 216, -343, 512, -729, 1000),
|
|
21
|
+
tuple(list_ops.map_clone(
|
|
22
|
+
lambda x: x**3, (-1, 2, -3, 4, -5, 6, -7, 8, -9, 10))
|
|
23
|
+
)
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
def test_map_absolute(self):
|
|
27
|
+
self.assertEqual(
|
|
28
|
+
(1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
|
|
29
|
+
tuple(list_ops.map_clone(
|
|
30
|
+
lambda x: abs(x), (-1, 2, -3, 4, -5, 6, -7, 8, -9, 10))
|
|
31
|
+
)
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
def test_map_empty(self):
|
|
35
|
+
self.assertEqual([], list(list_ops.map_clone(operator.index, [])))
|
|
36
|
+
|
|
37
|
+
# tests for length
|
|
38
|
+
def test_pos_leng(self):
|
|
39
|
+
self.assertEqual(10, list_ops.length((-1, 2, -3, 4, -5, 6, -7, 8, -9, 10)))
|
|
40
|
+
|
|
41
|
+
def test_empty_len(self):
|
|
42
|
+
self.assertEqual(0, list_ops.length([]))
|
|
43
|
+
|
|
44
|
+
# tests for filter
|
|
45
|
+
def test_filter_odd(self):
|
|
46
|
+
self.assertEqual(
|
|
47
|
+
(1, 3, 5),
|
|
48
|
+
tuple(list_ops.filter_clone(lambda x: x % 2 != 0, [1, 2, 3, 4, 5, 6]))
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
def test_filter_even(self):
|
|
52
|
+
self.assertEqual(
|
|
53
|
+
(2, 4, 6),
|
|
54
|
+
tuple(list_ops.filter_clone(lambda x: x % 2 == 0, [1, 2, 3, 4, 5, 6]))
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
# tests for reverse
|
|
58
|
+
def test_reverse_small(self):
|
|
59
|
+
self.assertEqual([1, 2, 3], list_ops.reverse([3, 2, 1]))
|
|
60
|
+
|
|
61
|
+
def test_reverse_mixed_types(self):
|
|
62
|
+
self.assertEqual(
|
|
63
|
+
(1, "cat", 4.0, "xyz"),
|
|
64
|
+
list_ops.reverse(("xyz", 4.0, "cat", 1))
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
def test_reverse_empty(self):
|
|
68
|
+
self.assertEqual([], list_ops.reverse(()))
|
|
69
|
+
|
|
70
|
+
# tests for append
|
|
71
|
+
def test_append_tuple(self):
|
|
72
|
+
self.assertEqual(
|
|
73
|
+
["10", "python", "hello"],
|
|
74
|
+
list_ops.append(["10", "python"], "hello")
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
def test_append_range(self):
|
|
78
|
+
self.assertEqual([100, range(1000)], list_ops.append([100], range(1000)))
|
|
79
|
+
|
|
80
|
+
def test_append_to_empty(self):
|
|
81
|
+
self.assertEqual([42], list_ops.append([], 42))
|
|
82
|
+
|
|
83
|
+
# tests for foldl
|
|
84
|
+
def test_foldl_sum(self):
|
|
85
|
+
self.assertEqual(21, list_ops.foldl(operator.add, [1, 2, 3, 4, 5, 6], 0))
|
|
86
|
+
|
|
87
|
+
def test_foldl_product(self):
|
|
88
|
+
self.assertEqual(720, list_ops.foldl(operator.mul, [1, 2, 3, 4, 5, 6], 1))
|
|
89
|
+
|
|
90
|
+
def test_foldl_div(self):
|
|
91
|
+
self.assertEqual(0, list_ops.foldl(operator.floordiv, [1, 2, 3, 4, 5, 6], 1))
|
|
92
|
+
|
|
93
|
+
def test_foldl_sub(self):
|
|
94
|
+
self.assertEqual(-15, list_ops.foldl(operator.sub, [1, 2, 3, 4, 5], 0))
|
|
95
|
+
|
|
96
|
+
# tests for foldr
|
|
97
|
+
def test_foldr_sub(self):
|
|
98
|
+
self.assertEqual(3, list_ops.foldr(operator.sub, [1, 2, 3, 4, 5], 0))
|
|
99
|
+
|
|
100
|
+
def test_foldr_add_str(self):
|
|
101
|
+
self.assertEqual(
|
|
102
|
+
"exercism!",
|
|
103
|
+
list_ops.foldr(operator.add, ["e", "x", "e", "r", "c", "i", "s", "m"], "!"))
|
|
104
|
+
|
|
105
|
+
# tests for flatten
|
|
106
|
+
def test_flatten_nested(self):
|
|
107
|
+
self.assertEqual([1, 2, 3, 4], list_ops.flat([[[1, 2], [3]], [[4]]]))
|
|
108
|
+
|
|
109
|
+
def test_flatten_once(self):
|
|
110
|
+
self.assertEqual(["x", "y", "z"], list_ops.flat([["x", "y", "z"]]))
|
|
111
|
+
|
|
112
|
+
def test_flatten_empty(self):
|
|
113
|
+
self.assertEqual([], list_ops.flat([]))
|
|
114
|
+
|
|
115
|
+
# tests for concat
|
|
116
|
+
def test_concat_two(self):
|
|
117
|
+
self.assertEqual(
|
|
118
|
+
[1, 3, 5, 8, 9, 4, 5, 6],
|
|
119
|
+
list_ops.concat([1, 3, 5, 8], [9, 4, 5, 6])
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
def test_concat_nothing(self):
|
|
123
|
+
self.assertEqual(
|
|
124
|
+
["orange", "apple", "banana"],
|
|
125
|
+
list_ops.concat(['orange', 'apple', 'banana'], None)
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
def test_concat_empty(self):
|
|
129
|
+
self.assertEqual(
|
|
130
|
+
[],
|
|
131
|
+
list_ops.concat([], [])
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
if __name__ == '__main__':
|
|
136
|
+
unittest.main()
|
data/tracks/ruby/bin/generate
CHANGED
|
@@ -1,10 +1,29 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
2
|
|
|
3
|
+
require_relative '../lib/helper'
|
|
4
|
+
require 'generator'
|
|
5
|
+
|
|
6
|
+
def available_generators
|
|
7
|
+
cases = File.join( __dir__, '../lib/*_cases.rb')
|
|
8
|
+
Dir[cases].map {|filename| /([^\/]*)_cases\.rb$/.match(filename).captures}
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def usage
|
|
12
|
+
"Usage: #{$PROGRAM_NAME} exercise_generator\n\n" +
|
|
13
|
+
"Available exercise generators:\n" +
|
|
14
|
+
available_generators.sort.join(' ')
|
|
15
|
+
end
|
|
16
|
+
|
|
3
17
|
exercise = ARGV[0]
|
|
18
|
+
|
|
19
|
+
unless exercise
|
|
20
|
+
STDERR.puts "Exercise name required!\n"
|
|
21
|
+
puts usage
|
|
22
|
+
exit
|
|
23
|
+
end
|
|
24
|
+
|
|
4
25
|
cases = "#{exercise.tr('-','_')}_cases"
|
|
5
26
|
|
|
6
|
-
require_relative '../lib/helper'
|
|
7
|
-
require 'generator'
|
|
8
27
|
begin
|
|
9
28
|
require "#{cases}"
|
|
10
29
|
rescue LoadError
|
|
@@ -14,3 +33,4 @@ end
|
|
|
14
33
|
|
|
15
34
|
klass = Object.const_get(cases.split('_').map(&:capitalize).join)
|
|
16
35
|
Generator.new(exercise, klass).generate
|
|
36
|
+
|