trackler 2.2.1.53 → 2.2.1.54
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/problem-specifications/exercises/nth-prime/canonical-data.json +2 -7
- data/problem-specifications/exercises/zebra-puzzle/canonical-data.json +16 -0
- data/tracks/c/config.json +11 -1
- data/tracks/c/docs/C_STYLE_GUIDE.md +142 -0
- data/tracks/c/exercises/collatz-conjecture/README.md +65 -0
- data/tracks/c/exercises/collatz-conjecture/makefile +15 -0
- data/tracks/c/exercises/collatz-conjecture/src/collatz_conjecture.h +8 -0
- data/tracks/c/exercises/collatz-conjecture/src/example.c +23 -0
- data/tracks/c/exercises/collatz-conjecture/test/test_collatz_conjecture.c +48 -0
- data/tracks/c/exercises/collatz-conjecture/test/vendor/unity.c +1300 -0
- data/tracks/c/exercises/collatz-conjecture/test/vendor/unity.h +274 -0
- data/tracks/c/exercises/collatz-conjecture/test/vendor/unity_internals.h +701 -0
- data/tracks/cfml/tasks/GenerateReadme.cfc +5 -5
- data/tracks/erlang/testgen/src/testgen.erl +99 -17
- data/tracks/erlang/testgen/src/tg_file_tools.erl +3 -3
- data/tracks/erlang/testgen/src/tgen.erl +15 -7
- data/tracks/haskell/config.json +15 -3
- data/tracks/java/scripts/canonical_data_check.sh +1 -1
- data/tracks/javascript/config.json +12 -0
- data/tracks/javascript/exercises/difference-of-squares/README.md +1 -1
- data/tracks/javascript/exercises/sum-of-multiples/README.md +1 -1
- data/tracks/javascript/exercises/zipper/README.md +55 -0
- data/tracks/javascript/exercises/zipper/example.js +100 -0
- data/tracks/javascript/exercises/zipper/zipper.spec.js +77 -0
- data/tracks/julia/config.json +12 -0
- data/tracks/julia/exercises/triangle/README.md +30 -0
- data/tracks/julia/exercises/triangle/example.jl +25 -0
- data/tracks/julia/exercises/triangle/runtests.jl +64 -0
- data/tracks/julia/exercises/triangle/triangle.jl +8 -0
- data/tracks/kotlin/exercises/leap/.meta/version +1 -1
- data/tracks/kotlin/exercises/leap/src/test/kotlin/LeapTest.kt +1 -1
- data/tracks/kotlin/scripts/canonical_data_check.sh +1 -1
- data/tracks/perl6/bin/README.md +1 -4
- data/tracks/perl6/bin/exercise-gen.pl6 +3 -4
- data/tracks/perl6/exercises/accumulate/example.yaml +2 -2
- data/tracks/perl6/exercises/all-your-base/example.yaml +9 -9
- data/tracks/perl6/exercises/allergies/example.yaml +7 -7
- data/tracks/perl6/exercises/anagram/example.yaml +3 -3
- data/tracks/perl6/exercises/atbash-cipher/example.yaml +3 -3
- data/tracks/perl6/exercises/bob/example.yaml +4 -4
- data/tracks/perl6/exercises/clock/example.yaml +6 -6
- data/tracks/perl6/exercises/flatten-array/example.yaml +4 -4
- data/tracks/perl6/exercises/grade-school/example.yaml +6 -6
- data/tracks/perl6/exercises/grains/example.yaml +3 -3
- data/tracks/perl6/exercises/hello-world/example.yaml +5 -5
- data/tracks/perl6/exercises/leap/example.yaml +4 -4
- data/tracks/perl6/exercises/linked-list/example.yaml +14 -14
- data/tracks/perl6/exercises/luhn/example.yaml +3 -3
- data/tracks/perl6/exercises/phone-number/example.yaml +3 -3
- data/tracks/perl6/exercises/raindrops/example.yaml +3 -3
- data/tracks/perl6/exercises/rna-transcription/example.yaml +3 -3
- data/tracks/perl6/exercises/robot-name/example.yaml +8 -8
- data/tracks/perl6/exercises/scrabble-score/example.yaml +3 -3
- data/tracks/perl6/exercises/space-age/example.yaml +8 -8
- data/tracks/perl6/exercises/word-count/example.yaml +3 -3
- data/tracks/perl6/exercises/wordy/example.yaml +3 -3
- data/tracks/python/config.json +14 -0
- data/tracks/python/config/maintainers.json +30 -0
- data/tracks/python/docs/EXERCISE_README_INSERT.md +1 -2
- data/tracks/python/exercises/accumulate/README.md +1 -5
- data/tracks/python/exercises/acronym/README.md +1 -3
- data/tracks/python/exercises/all-your-base/README.md +2 -3
- data/tracks/python/exercises/all-your-base/all_your_base_test.py +13 -13
- data/tracks/python/exercises/allergies/README.md +1 -3
- data/tracks/python/exercises/alphametics/README.md +3 -4
- data/tracks/python/exercises/anagram/README.md +1 -2
- data/tracks/python/exercises/atbash-cipher/README.md +3 -3
- data/tracks/python/exercises/beer-song/README.md +2 -3
- data/tracks/python/exercises/binary-search/README.md +1 -2
- data/tracks/python/exercises/binary/README.md +3 -2
- data/tracks/python/exercises/bob/README.md +1 -2
- data/tracks/python/exercises/book-store/README.md +6 -7
- data/tracks/python/exercises/bracket-push/README.md +1 -2
- data/tracks/python/exercises/change/README.md +2 -3
- data/tracks/python/exercises/circular-buffer/README.md +14 -8
- data/tracks/python/exercises/clock/README.md +1 -2
- data/tracks/python/exercises/clock/clock_test.py +2 -0
- data/tracks/python/exercises/collatz-conjecture/.meta/hints.md +3 -0
- data/tracks/python/exercises/collatz-conjecture/README.md +6 -19
- data/tracks/python/exercises/complex-numbers/README.md +28 -2
- data/tracks/python/exercises/crypto-square/README.md +11 -10
- data/tracks/python/exercises/diamond/README.md +7 -8
- data/tracks/python/exercises/difference-of-squares/README.md +1 -2
- data/tracks/python/exercises/diffie-hellman/.meta/hints.md +1 -1
- data/tracks/python/exercises/diffie-hellman/README.md +3 -2
- data/tracks/python/exercises/error-handling/.meta/hints.md +8 -0
- data/tracks/python/exercises/error-handling/README.md +10 -2
- data/tracks/python/exercises/error-handling/error_handling_test.py +15 -3
- data/tracks/python/exercises/etl/README.md +3 -2
- data/tracks/python/exercises/flatten-array/README.md +2 -4
- data/tracks/python/exercises/food-chain/README.md +3 -4
- data/tracks/python/exercises/forth/README.md +2 -6
- data/tracks/python/exercises/gigasecond/README.md +1 -2
- data/tracks/python/exercises/grade-school/README.md +1 -3
- data/tracks/python/exercises/grains/README.md +1 -3
- data/tracks/python/exercises/grep/README.md +13 -14
- data/tracks/python/exercises/hamming/README.md +1 -2
- data/tracks/python/exercises/hamming/hamming_test.py +6 -6
- data/tracks/python/exercises/hello-world/README.md +1 -2
- data/tracks/python/exercises/hexadecimal/README.md +1 -2
- data/tracks/python/exercises/hexadecimal/example.py +6 -6
- data/tracks/python/exercises/house/README.md +2 -4
- data/tracks/python/exercises/isogram/README.md +3 -3
- data/tracks/python/exercises/kindergarten-garden/README.md +14 -15
- data/tracks/python/exercises/largest-series-product/README.md +1 -2
- data/tracks/python/exercises/leap/README.md +2 -3
- data/tracks/python/exercises/linked-list/README.md +11 -12
- data/tracks/python/exercises/list-ops/README.md +1 -2
- data/tracks/python/exercises/luhn/README.md +8 -9
- data/tracks/python/exercises/markdown/README.md +1 -6
- data/tracks/python/exercises/matrix/README.md +7 -6
- data/tracks/python/exercises/meetup/README.md +2 -4
- data/tracks/python/exercises/minesweeper/README.md +1 -2
- data/tracks/python/exercises/nth-prime/README.md +1 -2
- data/tracks/python/exercises/nucleotide-count/README.md +9 -24
- data/tracks/python/exercises/ocr-numbers/README.md +6 -7
- data/tracks/python/exercises/octal/README.md +7 -4
- data/tracks/python/exercises/palindrome-products/README.md +16 -18
- data/tracks/python/exercises/pangram/README.md +2 -3
- data/tracks/python/exercises/pascals-triangle/README.md +2 -3
- data/tracks/python/exercises/perfect-numbers/README.md +3 -4
- data/tracks/python/exercises/phone-number/README.md +4 -4
- data/tracks/python/exercises/pig-latin/README.md +1 -2
- data/tracks/python/exercises/point-mutations/README.md +1 -2
- data/tracks/python/exercises/poker/README.md +1 -2
- data/tracks/python/exercises/prime-factors/README.md +1 -2
- data/tracks/python/exercises/protein-translation/README.md +5 -7
- data/tracks/python/exercises/proverb/README.md +12 -11
- data/tracks/python/exercises/pythagorean-triplet/README.md +4 -5
- data/tracks/python/exercises/queen-attack/README.md +2 -3
- data/tracks/python/exercises/rail-fence-cipher/README.md +13 -9
- data/tracks/python/exercises/raindrops/README.md +1 -2
- data/tracks/python/exercises/rectangles/README.md +8 -9
- data/tracks/python/exercises/rectangles/example.py +3 -3
- data/tracks/python/exercises/rna-transcription/README.md +1 -2
- data/tracks/python/exercises/rna-transcription/rna_transcription_test.py +4 -3
- data/tracks/python/exercises/robot-name/README.md +1 -2
- data/tracks/python/exercises/robot-simulator/README.md +1 -2
- data/tracks/python/exercises/roman-numerals/README.md +2 -3
- data/tracks/python/exercises/rotational-cipher/README.md +3 -3
- data/tracks/python/exercises/run-length-encoding/README.md +5 -6
- data/tracks/python/exercises/run-length-encoding/example.py +2 -2
- data/tracks/python/exercises/saddle-points/README.md +2 -3
- data/tracks/python/exercises/say/README.md +1 -2
- data/tracks/python/exercises/scale-generator/README.md +1 -3
- data/tracks/python/exercises/scrabble-score/README.md +4 -3
- data/tracks/python/exercises/secret-handshake/README.md +2 -3
- data/tracks/python/exercises/series/README.md +1 -2
- data/tracks/python/exercises/sieve/README.md +1 -2
- data/tracks/python/exercises/simple-cipher/README.md +3 -4
- data/tracks/python/exercises/space-age/README.md +2 -3
- data/tracks/python/exercises/space-age/space_age_test.py +18 -29
- data/tracks/python/exercises/strain/README.md +1 -2
- data/tracks/python/exercises/sublist/README.md +1 -2
- data/tracks/python/exercises/sum-of-multiples/README.md +1 -5
- data/tracks/python/exercises/tournament/README.md +6 -7
- data/tracks/python/exercises/transpose/README.md +8 -9
- data/tracks/python/exercises/tree-building/README.md +25 -0
- data/tracks/python/exercises/tree-building/example.py +46 -0
- data/tracks/python/exercises/tree-building/tree_building.py +50 -0
- data/tracks/python/exercises/tree-building/tree_building_test.py +183 -0
- data/tracks/python/exercises/triangle/README.md +10 -8
- data/tracks/python/exercises/trinary/README.md +2 -3
- data/tracks/python/exercises/twelve-days/README.md +2 -3
- data/tracks/python/exercises/two-bucket/README.md +4 -5
- data/tracks/python/exercises/two-bucket/two_bucket_test.py +2 -0
- data/tracks/python/exercises/two-fer/README.md +4 -5
- data/tracks/python/exercises/two-fer/two_fer_test.py +5 -2
- data/tracks/python/exercises/variable-length-quantity/README.md +7 -9
- data/tracks/python/exercises/word-count/README.md +2 -4
- data/tracks/python/exercises/word-search/README.md +2 -3
- data/tracks/python/exercises/wordy/README.md +1 -7
- data/tracks/python/exercises/wordy/example.py +8 -8
- data/tracks/python/exercises/wordy/wordy_test.py +36 -32
- data/tracks/python/exercises/zebra-puzzle/README.md +1 -2
- data/tracks/python/requirements-travis.txt +1 -1
- data/tracks/ruby/config.json +11 -0
- data/tracks/ruby/docs/TESTS.md +6 -0
- data/tracks/ruby/exercises/pangram/.meta/.version +1 -1
- data/tracks/ruby/exercises/pangram/.meta/solutions/pangram.rb +1 -1
- data/tracks/ruby/exercises/pangram/pangram_test.rb +11 -4
- data/tracks/ruby/exercises/two-fer/.meta/.version +1 -0
- data/tracks/ruby/exercises/two-fer/.meta/generator/two_fer_case.rb +12 -0
- data/tracks/ruby/exercises/two-fer/.meta/solutions/two_fer.rb +9 -0
- data/tracks/ruby/exercises/two-fer/README.md +69 -0
- data/tracks/ruby/exercises/two-fer/two_fer_test.rb +42 -0
- data/tracks/rust/config.json +12 -0
- data/tracks/rust/exercises/binary-search/.meta/hints.md +38 -0
- data/tracks/rust/exercises/binary-search/Cargo.lock +4 -0
- data/tracks/rust/exercises/binary-search/Cargo.toml +6 -0
- data/tracks/rust/exercises/binary-search/README.md +113 -0
- data/tracks/rust/exercises/binary-search/example.rs +29 -0
- data/tracks/rust/exercises/binary-search/src/lib.rs +0 -0
- data/tracks/rust/exercises/binary-search/tests/binary-search.rs +96 -0
- data/tracks/typescript/common/package.json +6 -6
- data/tracks/typescript/common/yarn.lock +929 -610
- data/tracks/typescript/exercises/acronym/package.json +6 -6
- data/tracks/typescript/exercises/acronym/yarn.lock +929 -610
- data/tracks/typescript/exercises/anagram/package.json +6 -6
- data/tracks/typescript/exercises/anagram/yarn.lock +929 -610
- data/tracks/typescript/exercises/beer-song/package.json +6 -6
- data/tracks/typescript/exercises/beer-song/yarn.lock +929 -610
- data/tracks/typescript/exercises/binary-search-tree/package.json +6 -6
- data/tracks/typescript/exercises/binary-search-tree/yarn.lock +929 -610
- data/tracks/typescript/exercises/binary-search/package.json +6 -6
- data/tracks/typescript/exercises/binary-search/yarn.lock +929 -610
- data/tracks/typescript/exercises/bob/package.json +6 -6
- data/tracks/typescript/exercises/bob/yarn.lock +929 -610
- data/tracks/typescript/exercises/circular-buffer/package.json +6 -6
- data/tracks/typescript/exercises/circular-buffer/yarn.lock +929 -610
- data/tracks/typescript/exercises/clock/package.json +6 -6
- data/tracks/typescript/exercises/clock/yarn.lock +929 -610
- data/tracks/typescript/exercises/difference-of-squares/package.json +6 -6
- data/tracks/typescript/exercises/difference-of-squares/yarn.lock +929 -610
- data/tracks/typescript/exercises/etl/package.json +6 -6
- data/tracks/typescript/exercises/etl/yarn.lock +929 -610
- data/tracks/typescript/exercises/food-chain/package.json +6 -6
- data/tracks/typescript/exercises/food-chain/yarn.lock +929 -610
- data/tracks/typescript/exercises/gigasecond/package.json +6 -6
- data/tracks/typescript/exercises/gigasecond/yarn.lock +929 -610
- data/tracks/typescript/exercises/grade-school/package.json +6 -6
- data/tracks/typescript/exercises/grade-school/yarn.lock +929 -610
- data/tracks/typescript/exercises/hamming/package.json +6 -6
- data/tracks/typescript/exercises/hamming/yarn.lock +929 -610
- data/tracks/typescript/exercises/hello-world/README.md +354 -0
- data/tracks/typescript/exercises/hello-world/package.json +6 -6
- data/tracks/typescript/exercises/hello-world/yarn.lock +929 -610
- data/tracks/typescript/exercises/largest-series-product/package.json +6 -6
- data/tracks/typescript/exercises/largest-series-product/yarn.lock +929 -610
- data/tracks/typescript/exercises/leap/package.json +6 -6
- data/tracks/typescript/exercises/leap/yarn.lock +929 -610
- data/tracks/typescript/exercises/linked-list/package.json +6 -6
- data/tracks/typescript/exercises/linked-list/yarn.lock +929 -610
- data/tracks/typescript/exercises/nth-prime/package.json +6 -6
- data/tracks/typescript/exercises/nth-prime/yarn.lock +929 -610
- data/tracks/typescript/exercises/pangram/package.json +6 -6
- data/tracks/typescript/exercises/pangram/yarn.lock +929 -610
- data/tracks/typescript/exercises/pascals-triangle/package.json +6 -6
- data/tracks/typescript/exercises/pascals-triangle/yarn.lock +929 -610
- data/tracks/typescript/exercises/phone-number/package.json +6 -6
- data/tracks/typescript/exercises/phone-number/yarn.lock +929 -610
- data/tracks/typescript/exercises/prime-factors/package.json +6 -6
- data/tracks/typescript/exercises/prime-factors/yarn.lock +929 -610
- data/tracks/typescript/exercises/raindrops/package.json +6 -6
- data/tracks/typescript/exercises/raindrops/yarn.lock +929 -610
- data/tracks/typescript/exercises/rna-transcription/package.json +6 -6
- data/tracks/typescript/exercises/rna-transcription/yarn.lock +929 -610
- data/tracks/typescript/exercises/robot-name/package.json +6 -6
- data/tracks/typescript/exercises/robot-name/yarn.lock +929 -610
- data/tracks/typescript/exercises/robot-simulator/package.json +6 -6
- data/tracks/typescript/exercises/robot-simulator/yarn.lock +929 -610
- data/tracks/typescript/exercises/rotational-cipher/package.json +6 -6
- data/tracks/typescript/exercises/rotational-cipher/yarn.lock +929 -610
- data/tracks/typescript/exercises/say/package.json +6 -6
- data/tracks/typescript/exercises/say/yarn.lock +929 -610
- data/tracks/typescript/exercises/scrabble-score/package.json +6 -6
- data/tracks/typescript/exercises/scrabble-score/yarn.lock +929 -610
- data/tracks/typescript/exercises/series/package.json +6 -6
- data/tracks/typescript/exercises/series/yarn.lock +929 -610
- data/tracks/typescript/exercises/space-age/package.json +6 -6
- data/tracks/typescript/exercises/space-age/yarn.lock +929 -610
- data/tracks/typescript/exercises/strain/package.json +6 -6
- data/tracks/typescript/exercises/strain/yarn.lock +929 -610
- data/tracks/typescript/exercises/sum-of-multiples/package.json +6 -6
- data/tracks/typescript/exercises/sum-of-multiples/yarn.lock +929 -610
- data/tracks/typescript/exercises/triangle/package.json +6 -6
- data/tracks/typescript/exercises/triangle/yarn.lock +929 -610
- data/tracks/typescript/exercises/word-count/package.json +6 -6
- data/tracks/typescript/exercises/word-count/yarn.lock +929 -610
- data/tracks/typescript/exercises/wordy/package.json +6 -6
- data/tracks/typescript/exercises/wordy/yarn.lock +929 -610
- metadata +37 -2
@@ -0,0 +1,77 @@
|
|
1
|
+
var Zipper = require('./zipper');
|
2
|
+
|
3
|
+
// Tests adapted from `problem-specifications/zipper/canonical-data.json` @ v1.0.0
|
4
|
+
|
5
|
+
function bt(value, left, right) {
|
6
|
+
return {
|
7
|
+
value: value,
|
8
|
+
left: left,
|
9
|
+
right: right
|
10
|
+
};
|
11
|
+
}
|
12
|
+
|
13
|
+
function leaf(value) {
|
14
|
+
return bt(value, null, null);
|
15
|
+
}
|
16
|
+
|
17
|
+
describe('Zipper', function () {
|
18
|
+
var t1 = bt(1, bt(2, null, leaf(3)), leaf(4));
|
19
|
+
var t2 = bt(1, bt(5, null, leaf(3)), leaf(4));
|
20
|
+
var t3 = bt(1, bt(2, leaf(5), leaf(3)), leaf(4));
|
21
|
+
var t4 = bt(1, leaf(2), leaf(4));
|
22
|
+
var t5 = bt(1, bt(2, null, leaf(3)), bt(6, leaf(7), leaf(8)));
|
23
|
+
var t6 = bt(1, bt(2, null, leaf(5)), leaf(4));
|
24
|
+
var zipper;
|
25
|
+
|
26
|
+
beforeEach(function () {
|
27
|
+
zipper = Zipper.fromTree(t1);
|
28
|
+
});
|
29
|
+
|
30
|
+
it('data is retained', function () {
|
31
|
+
expect(zipper.toTree(t1)).toEqual(t1);
|
32
|
+
});
|
33
|
+
|
34
|
+
xit('left, right and value', function () {
|
35
|
+
expect(zipper.left().right().value()).toEqual(3);
|
36
|
+
});
|
37
|
+
|
38
|
+
xit('dead end', function () {
|
39
|
+
expect(zipper.left().left()).toBe(null);
|
40
|
+
});
|
41
|
+
|
42
|
+
xit('tree from deep focus', function () {
|
43
|
+
expect(zipper.left().right().toTree()).toEqual(t1);
|
44
|
+
});
|
45
|
+
|
46
|
+
xit('traversing up from top', function () {
|
47
|
+
expect(zipper.up()).toEqual(null);
|
48
|
+
});
|
49
|
+
|
50
|
+
xit('left, right and up', function () {
|
51
|
+
expect(zipper.left().up().right().up().left().right().value()).toEqual(3);
|
52
|
+
});
|
53
|
+
|
54
|
+
xit('setValue', function () {
|
55
|
+
expect(zipper.left().setValue(5).toTree()).toEqual(t2);
|
56
|
+
});
|
57
|
+
|
58
|
+
xit('setValue after traversing up', function () {
|
59
|
+
expect(zipper.left().right().up().setValue(5).toTree()).toEqual(t2);
|
60
|
+
});
|
61
|
+
|
62
|
+
xit('setLeft with leaf', function () {
|
63
|
+
expect(zipper.left().setLeft(leaf(5)).toTree()).toEqual(t3);
|
64
|
+
});
|
65
|
+
|
66
|
+
xit('setRight with null', function () {
|
67
|
+
expect(zipper.left().setRight(null).toTree()).toEqual(t4);
|
68
|
+
});
|
69
|
+
|
70
|
+
xit('setRight with subtree', function () {
|
71
|
+
expect(zipper.setRight(bt(6, leaf(7), leaf(8))).toTree()).toEqual(t5);
|
72
|
+
});
|
73
|
+
|
74
|
+
xit('setValue on deep focus', function () {
|
75
|
+
expect(zipper.left().right().setValue(5).toTree()).toEqual(t6);
|
76
|
+
});
|
77
|
+
});
|
data/tracks/julia/config.json
CHANGED
@@ -308,6 +308,18 @@
|
|
308
308
|
"regular_expressions"
|
309
309
|
]
|
310
310
|
},
|
311
|
+
{
|
312
|
+
"uuid": "7ea2903f-049b-ed80-3f87-73945ebf3d4577b715e",
|
313
|
+
"slug": "triangle",
|
314
|
+
"core": false,
|
315
|
+
"unlocked_by": null,
|
316
|
+
"difficulty": 1,
|
317
|
+
"topics": [
|
318
|
+
"conditionals",
|
319
|
+
"functional abstraction",
|
320
|
+
"mathematics"
|
321
|
+
]
|
322
|
+
},
|
311
323
|
{
|
312
324
|
"uuid": "e5a6d640-cd76-4453-8247-fd34ffed4fe5",
|
313
325
|
"slug": "transpose",
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# Triangle
|
2
|
+
|
3
|
+
Determine if a triangle is equilateral, isosceles, or scalene.
|
4
|
+
|
5
|
+
An _equilateral_ triangle has all three sides the same length.
|
6
|
+
|
7
|
+
An _isosceles_ triangle has at least two sides the same length. (It is sometimes
|
8
|
+
specified as having exactly two sides the same length, but for the purposes of
|
9
|
+
this exercise we'll say at least two.)
|
10
|
+
|
11
|
+
A _scalene_ triangle has all sides of different lengths.
|
12
|
+
|
13
|
+
## Note
|
14
|
+
|
15
|
+
For a shape to be a triangle at all, all sides have to be of length > 0, and
|
16
|
+
the sum of the lengths of any two sides must be greater than or equal to the
|
17
|
+
length of the third side. See [Triangle Inequality](https://en.wikipedia.org/wiki/Triangle_inequality).
|
18
|
+
|
19
|
+
## Dig Deeper
|
20
|
+
|
21
|
+
The case where the sum of the lengths of two sides _equals_ that of the
|
22
|
+
third is known as a _degenerate_ triangle - it has zero area and looks like
|
23
|
+
a single line. Feel free to add your own code/tests to check for degenerate triangles.
|
24
|
+
## Source
|
25
|
+
|
26
|
+
The Ruby Koans triangle project, parts 1 & 2 [http://rubykoans.com](http://rubykoans.com)
|
27
|
+
|
28
|
+
|
29
|
+
## Submitting Incomplete Solutions
|
30
|
+
It's possible to submit an incomplete solution so you can see how others have completed the exercise.
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# This problem gives practice on reusing procedures by extracting them as functions.
|
2
|
+
|
3
|
+
function is_equilateral(sides)
|
4
|
+
sides = sort(sides)
|
5
|
+
return verify_triangle(sides) && verify_equilateral(sides)
|
6
|
+
end
|
7
|
+
|
8
|
+
function is_isosceles(sides)
|
9
|
+
sides = sort(sides)
|
10
|
+
return verify_triangle(sides) && verify_isosceles(sides)
|
11
|
+
end
|
12
|
+
|
13
|
+
function is_scalene(sides)
|
14
|
+
sides = sort(sides)
|
15
|
+
return verify_triangle(sides) && verify_scalene(sides)
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
verify_equilateral(sorted) = (sorted[1] == sorted[3])
|
20
|
+
|
21
|
+
verify_isosceles(sorted) = (sorted[1] == sorted[2] || sorted[2] == sorted[3])
|
22
|
+
|
23
|
+
verify_scalene(sorted) = !verify_isosceles(sorted)
|
24
|
+
|
25
|
+
verify_triangle(sorted) = (sorted[3] < sorted[1] + sorted[2])
|
@@ -0,0 +1,64 @@
|
|
1
|
+
using Base.Test
|
2
|
+
|
3
|
+
include("triangle.jl")
|
4
|
+
|
5
|
+
@testset "check equilateral triangles" begin
|
6
|
+
@testset "true if all sides are equal" begin
|
7
|
+
@test is_equilateral([2, 2, 2]) == true
|
8
|
+
@test is_equilateral([0.5, 0.5, 0.5]) == true
|
9
|
+
end
|
10
|
+
|
11
|
+
@testset "false if any side is unequal" begin
|
12
|
+
@test is_equilateral([2, 3, 2]) == false
|
13
|
+
end
|
14
|
+
|
15
|
+
@testset "false if no sides are equal" begin
|
16
|
+
@test is_equilateral([5, 4, 6]) == false
|
17
|
+
end
|
18
|
+
|
19
|
+
@testset "false if invalid triangle" begin
|
20
|
+
@test is_equilateral([0, 0, 0]) == false
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
@testset "check isosceles triangles" begin
|
25
|
+
@testset "true if at least 2 sides are equal" begin
|
26
|
+
@test is_isosceles([3, 4, 4]) == true
|
27
|
+
@test is_isosceles([4, 3, 4]) == true
|
28
|
+
@test is_isosceles([4, 4, 3]) == true
|
29
|
+
@test is_isosceles([4, 4, 4]) == true
|
30
|
+
@test is_isosceles([0.4, 0.5, 0.5]) == true
|
31
|
+
@test is_isosceles([0.5, 0.4, 0.5]) == true
|
32
|
+
@test is_isosceles([0.5, 0.5, 0.4]) == true
|
33
|
+
end
|
34
|
+
|
35
|
+
@testset "false if no sides are equal" begin
|
36
|
+
@test is_isosceles([2, 3, 4]) == false
|
37
|
+
end
|
38
|
+
|
39
|
+
@testset "false if invalid triangle" begin
|
40
|
+
@test is_isosceles([1, 1, 3]) == false
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
@testset "check scalene triangles" begin
|
46
|
+
@testset "true if no sides are equal" begin
|
47
|
+
@test is_scalene([5, 4, 6]) == true
|
48
|
+
@test is_scalene([0.5, 0.4, 0.6]) == true
|
49
|
+
end
|
50
|
+
|
51
|
+
@testset "false if at least 2 sides are equal" begin
|
52
|
+
@test is_scalene([3, 4, 4]) == false
|
53
|
+
@test is_scalene([4, 3, 4]) == false
|
54
|
+
@test is_scalene([4, 4, 3]) == false
|
55
|
+
@test is_scalene([4, 4, 4]) == false
|
56
|
+
@test is_scalene([0.4, 0.5, 0.5]) == false
|
57
|
+
@test is_scalene([0.5, 0.4, 0.5]) == false
|
58
|
+
@test is_scalene([0.5, 0.5, 0.4]) == false
|
59
|
+
end
|
60
|
+
|
61
|
+
@testset "false if invalid triangle" begin
|
62
|
+
@test is_scalene([7, 3, 2]) == false
|
63
|
+
end
|
64
|
+
end
|
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.2.0
|
data/tracks/perl6/bin/README.md
CHANGED
@@ -38,7 +38,4 @@ example: |
|
|
38
38
|
}
|
39
39
|
```
|
40
40
|
|
41
|
-
You must have `Template::Mustache` and `
|
42
|
-
|
43
|
-
Note (2017-05-22): [YAMLish](http://modules.perl6.org/dist/YAMLish)
|
44
|
-
is not yet feature complete, so some valid YAML files may not parse.
|
41
|
+
You must have `Template::Mustache` and `YAML::Parser::LibYAML` to run `exercise-gen.pl6`.
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env perl6
|
2
2
|
use v6;
|
3
3
|
use Template::Mustache;
|
4
|
-
use
|
4
|
+
use YAML::Parser::LibYAML;
|
5
5
|
|
6
6
|
my $base-dir = $?FILE.IO.resolve.parent.parent;
|
7
7
|
my @exercises;
|
@@ -33,14 +33,13 @@ for @exercises -> $exercise {
|
|
33
33
|
push @dir-not-found, $exercise;
|
34
34
|
next;
|
35
35
|
}
|
36
|
-
if (my $yaml = $exercise-dir.child('example.yaml')) !~~ :f {
|
36
|
+
if (my $yaml-file = $exercise-dir.child('example.yaml')) !~~ :f {
|
37
37
|
push @yaml-not-found, $exercise;
|
38
38
|
next;
|
39
39
|
};
|
40
40
|
print "Generating $exercise... ";
|
41
41
|
|
42
|
-
my %data =
|
43
|
-
$_=.chomp when Str for @(%data.values);
|
42
|
+
my %data = yaml-parse $yaml-file.absolute;
|
44
43
|
|
45
44
|
my $cdata = $base-dir.child("problem-specifications/exercises/$exercise/canonical-data.json");
|
46
45
|
if $cdata ~~ :f {%data<cdata><json> = $cdata.slurp}
|
@@ -2,7 +2,7 @@ exercise: Accumulate
|
|
2
2
|
version: 1
|
3
3
|
plan: 7
|
4
4
|
imports: '&accumulate'
|
5
|
-
tests:
|
5
|
+
tests: |-
|
6
6
|
is-deeply accumulate([ ], sub {}),
|
7
7
|
[ ],
|
8
8
|
'test empty';
|
@@ -23,7 +23,7 @@ tests: |
|
|
23
23
|
'reverse strings';
|
24
24
|
|
25
25
|
unit: module
|
26
|
-
example:
|
26
|
+
example: |-
|
27
27
|
sub accumulate (@list, $function) is export {
|
28
28
|
my @accumulated;
|
29
29
|
for @list -> $element {
|
@@ -2,8 +2,8 @@ exercise: AllYourBase
|
|
2
2
|
version: 2
|
3
3
|
plan: 23
|
4
4
|
imports: '&convert-base'
|
5
|
-
tests:
|
6
|
-
|
5
|
+
tests: |-
|
6
|
+
|
7
7
|
for @($c-data<cases>) -> $case {
|
8
8
|
if $case<expected> ~~ Array:D { test }
|
9
9
|
else {
|
@@ -17,33 +17,33 @@ tests: |
|
|
17
17
|
flunk "$_; not tested" if %*ENV<EXERCISM>; # To ensure that no canonical-data cases are missed.
|
18
18
|
}
|
19
19
|
}
|
20
|
-
|
20
|
+
|
21
21
|
sub test (Array:D $expected = $case<expected>) {
|
22
22
|
is-deeply call-convert-base, $expected, $case<description>
|
23
23
|
}
|
24
|
-
|
24
|
+
|
25
25
|
sub call-convert-base { convert-base(|$case<input_base input_digits output_base>) }
|
26
26
|
}
|
27
27
|
|
28
28
|
unit: module
|
29
|
-
example:
|
29
|
+
example: |-
|
30
30
|
class X::AllYourBase::InvalidBase is Exception {
|
31
31
|
has $.payload;
|
32
32
|
method message {"$!payload is not a valid base."}
|
33
33
|
}
|
34
|
-
|
34
|
+
|
35
35
|
class X::AllYourBase::InvalidDigit is Exception {
|
36
36
|
has %.payload;
|
37
37
|
method message {"%!payload<digit> is not a valid digit for base %!payload<base>."}
|
38
38
|
}
|
39
|
-
|
39
|
+
|
40
40
|
sub convert-base (Int:D $input-base, @input-digits, Int:D $output-base --> Array:D) is export {
|
41
41
|
for $input-base, $output-base {
|
42
42
|
X::AllYourBase::InvalidBase.new(payload => $_).throw if $_ < 2;
|
43
43
|
}
|
44
44
|
from-decimal($output-base, (to-decimal $input-base, @input-digits));
|
45
45
|
}
|
46
|
-
|
46
|
+
|
47
47
|
sub to-decimal ($input-base, @input-digits) {
|
48
48
|
return [].Slip if !@input-digits;
|
49
49
|
my $elems = @input-digits.elems;
|
@@ -60,7 +60,7 @@ example: |
|
|
60
60
|
}
|
61
61
|
return $dec;
|
62
62
|
}
|
63
|
-
|
63
|
+
|
64
64
|
sub from-decimal ($output-base, $dec) {
|
65
65
|
my @output-digits;
|
66
66
|
my $num = $dec;
|
@@ -2,27 +2,27 @@ exercise: Allergies
|
|
2
2
|
version: 2
|
3
3
|
plan: 4
|
4
4
|
imports: '&allergic-to &list-allergies'
|
5
|
-
tests:
|
5
|
+
tests: |-
|
6
6
|
for $c-data<cases>.values -> %case-set {
|
7
|
-
|
7
|
+
|
8
8
|
subtest 'allergic-to' => {
|
9
9
|
plan 7;
|
10
10
|
for %case-set<cases>.values -> %case {
|
11
11
|
is allergic-to(%case<score>, .<substance>), .<result>, %case<description> ~ ': ' ~ .<substance> for %case<expected>.values;
|
12
12
|
}
|
13
13
|
} when %case-set<description> ~~ 'allergicTo';
|
14
|
-
|
14
|
+
|
15
15
|
subtest 'list-allergies' => {
|
16
16
|
plan 9;
|
17
17
|
for %case-set<cases>.values {
|
18
18
|
cmp-ok list-allergies(.<score>), '~~', .<expected>.Set, .<description>;
|
19
19
|
}
|
20
20
|
} when %case-set<description> ~~ 'list';
|
21
|
-
|
21
|
+
|
22
22
|
}
|
23
23
|
|
24
24
|
unit: module
|
25
|
-
example:
|
25
|
+
example: |-
|
26
26
|
our @allergens = <
|
27
27
|
eggs
|
28
28
|
peanuts
|
@@ -33,11 +33,11 @@ example: |
|
|
33
33
|
pollen
|
34
34
|
cats
|
35
35
|
>;
|
36
|
-
|
36
|
+
|
37
37
|
sub allergic-to($code,$substance) is export {
|
38
38
|
return so $code +& ( 2 ** @allergens.first({ $_ eq $substance},:k) )
|
39
39
|
}
|
40
|
-
|
40
|
+
|
41
41
|
sub list-allergies($code) is export {
|
42
42
|
return grep { allergic-to($code,$_) }, @allergens;
|
43
43
|
}
|
@@ -2,11 +2,11 @@ exercise: Anagram
|
|
2
2
|
version: 1
|
3
3
|
plan: 18
|
4
4
|
imports: '&match-anagrams'
|
5
|
-
tests:
|
5
|
+
tests: |-
|
6
6
|
is match-anagrams(|.<subject candidates>), |.<expected description> for @($c-data<cases>);
|
7
7
|
|
8
8
|
unit: module
|
9
|
-
example:
|
9
|
+
example: |-
|
10
10
|
sub match-anagrams ($word, @words) is export {
|
11
11
|
my @results;
|
12
12
|
my $canonical = canonize($word);
|
@@ -19,7 +19,7 @@ example: |
|
|
19
19
|
}
|
20
20
|
@results;
|
21
21
|
}
|
22
|
-
|
22
|
+
|
23
23
|
sub canonize ($str) {
|
24
24
|
(($str.lc.split('')).sort).join('');
|
25
25
|
}
|
@@ -2,7 +2,7 @@ exercise: AtbashCipher
|
|
2
2
|
version: 1
|
3
3
|
plan: 4
|
4
4
|
imports: '&encode &decode'
|
5
|
-
tests:
|
5
|
+
tests: |-
|
6
6
|
for @($c-data<cases>) {
|
7
7
|
my $test = .<description> ~~ 'encode' ?? 'encode' !! 'decode';
|
8
8
|
subtest $test => {
|
@@ -13,13 +13,13 @@ tests: |
|
|
13
13
|
}
|
14
14
|
|
15
15
|
unit: module
|
16
|
-
example:
|
16
|
+
example: |-
|
17
17
|
sub encode($input) is export {
|
18
18
|
decode($input.lc.trans( ['a'..'z', 0..9] => '', :complement ) )
|
19
19
|
.comb(5)
|
20
20
|
.join: ' ';
|
21
21
|
}
|
22
|
-
|
22
|
+
|
23
23
|
sub decode (Str $input) is export {
|
24
24
|
return $input
|
25
25
|
.lc
|