trackler 2.0.0.1 → 2.0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
|