trackler 2.2.1.41 → 2.2.1.42
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitmodules +0 -3
- data/lib/trackler/version.rb +1 -1
- data/problem-specifications/exercises/change/metadata.yml +0 -3
- data/tracks/c/exercises/allergies/src/allergies.h +12 -12
- data/tracks/c/exercises/allergies/src/example.c +4 -4
- data/tracks/c/exercises/allergies/src/example.h +14 -14
- data/tracks/c/exercises/allergies/test/test_allergies.c +45 -45
- data/tracks/cfml/config.json +139 -193
- data/tracks/cfml/config/maintainers.json +11 -11
- data/tracks/csharp/exercises/etl/Etl.cs +1 -1
- data/tracks/csharp/exercises/etl/EtlTest.cs +102 -0
- data/tracks/csharp/exercises/etl/Example.cs +1 -1
- data/tracks/csharp/exercises/pascals-triangle/Example.cs +10 -1
- data/tracks/csharp/exercises/pascals-triangle/PascalsTriangle.cs +1 -0
- data/tracks/csharp/exercises/pascals-triangle/PascalsTriangleTest.cs +17 -50
- data/tracks/csharp/exercises/saddle-points/SaddlePointsTest.cs +75 -0
- data/tracks/csharp/generators/Exercises/Etl.cs +61 -0
- data/tracks/csharp/generators/Exercises/PascalsTriangle.cs +28 -0
- data/tracks/csharp/generators/Exercises/SaddlePoints.cs +50 -0
- data/tracks/csharp/generators/Output/ValueFormatter.cs +29 -0
- data/tracks/java/config.json +40 -5
- data/tracks/java/exercises/triangle/.meta/src/reference/java/Triangle.java +11 -10
- data/tracks/java/exercises/triangle/src/main/java/Triangle.java +9 -1
- data/tracks/java/exercises/triangle/src/test/java/TriangleTest.java +12 -12
- data/tracks/python/exercises/phone-number/phone_number.py +1 -1
- data/tracks/python/exercises/rna-transcription/rna_transcription.py +1 -1
- data/tracks/python/exercises/run-length-encoding/run_length_encoding.py +2 -2
- data/tracks/python/exercises/saddle-points/saddle_points.py +1 -1
- data/tracks/rust/exercises/etl/README.md +1 -1
- data/tracks/rust/exercises/ocr-numbers/README.md +1 -1
- data/tracks/rust/exercises/pascals-triangle/README.md +1 -1
- data/tracks/rust/exercises/rna-transcription/README.md +1 -1
- data/tracks/scala/exercises/meetup/src/test/scala/MeetupTest.scala +118 -93
- data/tracks/scala/testgen/src/main/scala/MeetupTestGenerator.scala +48 -0
- data/tracks/scala/testgen/src/main/scala/testgen/CanonicalDataParser.scala +1 -1
- data/tracks/typescript/config.json +13 -0
- data/tracks/typescript/exercises/bob/bob.ts +7 -0
- data/tracks/typescript/exercises/hello-world/hello-world.ts +7 -0
- data/tracks/typescript/exercises/leap/leap.ts +5 -0
- data/tracks/typescript/exercises/pangram/pangram.ts +11 -0
- data/tracks/typescript/exercises/prime-factors/README.md +73 -0
- data/tracks/typescript/exercises/prime-factors/package.json +36 -0
- data/tracks/typescript/exercises/prime-factors/prime-factors.example.ts +14 -0
- data/tracks/typescript/exercises/prime-factors/prime-factors.test.ts +25 -0
- data/tracks/{coldfusion/exercises/acronym/.meta/HINTS.md → typescript/exercises/prime-factors/prime-factors.ts} +0 -0
- data/tracks/typescript/exercises/prime-factors/tsconfig.json +22 -0
- data/tracks/typescript/exercises/prime-factors/tslint.json +127 -0
- data/tracks/typescript/exercises/prime-factors/yarn.lock +2305 -0
- data/tracks/typescript/exercises/rna-transcription/rna-transcription.ts +7 -0
- metadata +16 -242
- data/tracks/coldfusion/.gitignore +0 -5
- data/tracks/coldfusion/.travis.yml +0 -18
- data/tracks/coldfusion/CONTRIBUTING.md +0 -10
- data/tracks/coldfusion/LICENSE +0 -21
- data/tracks/coldfusion/README.md +0 -92
- data/tracks/coldfusion/bin/fetch-configlet +0 -32
- data/tracks/coldfusion/config.json +0 -223
- data/tracks/coldfusion/config/exercise_readme.go.tmpl +0 -16
- data/tracks/coldfusion/config/maintainers.json +0 -13
- data/tracks/coldfusion/docs/ABOUT.md +0 -10
- data/tracks/coldfusion/docs/EXERCISE_README_INSERT.md +0 -15
- data/tracks/coldfusion/docs/INSTALLATION.md +0 -35
- data/tracks/coldfusion/docs/LEARNING.md +0 -37
- data/tracks/coldfusion/docs/RESOURCES.md +0 -29
- data/tracks/coldfusion/docs/SNIPPET.txt +0 -8
- data/tracks/coldfusion/docs/TESTS.md +0 -13
- data/tracks/coldfusion/exercises/acronym/Acronym.cfc +0 -13
- data/tracks/coldfusion/exercises/acronym/AcronymTest.cfc +0 -43
- data/tracks/coldfusion/exercises/acronym/Solution.cfc +0 -22
- data/tracks/coldfusion/exercises/acronym/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/acronym/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/acronym/box.json +0 -8
- data/tracks/coldfusion/exercises/acronym/index.cfm +0 -37
- data/tracks/coldfusion/exercises/atbash-cipher/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/atbash-cipher/AtbashCipher.cfc +0 -14
- data/tracks/coldfusion/exercises/atbash-cipher/AtbashCipherTest.cfc +0 -71
- data/tracks/coldfusion/exercises/atbash-cipher/Solution.cfc +0 -56
- data/tracks/coldfusion/exercises/atbash-cipher/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/atbash-cipher/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/atbash-cipher/box.json +0 -8
- data/tracks/coldfusion/exercises/atbash-cipher/index.cfm +0 -37
- data/tracks/coldfusion/exercises/bob/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/bob/Bob.cfc +0 -13
- data/tracks/coldfusion/exercises/bob/BobTest.cfc +0 -115
- data/tracks/coldfusion/exercises/bob/Solution.cfc +0 -27
- data/tracks/coldfusion/exercises/bob/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/bob/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/bob/box.json +0 -8
- data/tracks/coldfusion/exercises/bob/index.cfm +0 -37
- data/tracks/coldfusion/exercises/diamond/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/diamond/Diamond.cfc +0 -13
- data/tracks/coldfusion/exercises/diamond/DiamondTest.cfc +0 -35
- data/tracks/coldfusion/exercises/diamond/Solution.cfc +0 -35
- data/tracks/coldfusion/exercises/diamond/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/diamond/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/diamond/box.json +0 -8
- data/tracks/coldfusion/exercises/diamond/index.cfm +0 -37
- data/tracks/coldfusion/exercises/difference-of-squares/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/difference-of-squares/DifferenceOfSquares.cfc +0 -18
- data/tracks/coldfusion/exercises/difference-of-squares/DifferenceOfSquaresTest.cfc +0 -63
- data/tracks/coldfusion/exercises/difference-of-squares/Solution.cfc +0 -28
- data/tracks/coldfusion/exercises/difference-of-squares/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/difference-of-squares/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/difference-of-squares/box.json +0 -8
- data/tracks/coldfusion/exercises/difference-of-squares/index.cfm +0 -37
- data/tracks/coldfusion/exercises/flatten-array/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/flatten-array/FlattenArray.cfc +0 -13
- data/tracks/coldfusion/exercises/flatten-array/FlattenArrayTest.cfc +0 -42
- data/tracks/coldfusion/exercises/flatten-array/Solution.cfc +0 -26
- data/tracks/coldfusion/exercises/flatten-array/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/flatten-array/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/flatten-array/box.json +0 -8
- data/tracks/coldfusion/exercises/flatten-array/index.cfm +0 -37
- data/tracks/coldfusion/exercises/gigasecond/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/gigasecond/Gigasecond.cfc +0 -13
- data/tracks/coldfusion/exercises/gigasecond/GigasecondTest.cfc +0 -39
- data/tracks/coldfusion/exercises/gigasecond/Solution.cfc +0 -16
- data/tracks/coldfusion/exercises/gigasecond/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/gigasecond/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/gigasecond/box.json +0 -8
- data/tracks/coldfusion/exercises/gigasecond/index.cfm +0 -37
- data/tracks/coldfusion/exercises/grains/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/grains/Grains.cfc +0 -14
- data/tracks/coldfusion/exercises/grains/GrainsTest.cfc +0 -63
- data/tracks/coldfusion/exercises/grains/Solution.cfc +0 -22
- data/tracks/coldfusion/exercises/grains/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/grains/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/grains/box.json +0 -8
- data/tracks/coldfusion/exercises/grains/index.cfm +0 -37
- data/tracks/coldfusion/exercises/hamming/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/hamming/Hamming.cfc +0 -13
- data/tracks/coldfusion/exercises/hamming/HammingTest.cfc +0 -75
- data/tracks/coldfusion/exercises/hamming/Solution.cfc +0 -25
- data/tracks/coldfusion/exercises/hamming/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/hamming/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/hamming/box.json +0 -8
- data/tracks/coldfusion/exercises/hamming/index.cfm +0 -37
- data/tracks/coldfusion/exercises/hello-world/HelloWorld.cfc +0 -13
- data/tracks/coldfusion/exercises/hello-world/HelloWorldTest.cfc +0 -18
- data/tracks/coldfusion/exercises/hello-world/Solution.cfc +0 -13
- data/tracks/coldfusion/exercises/hello-world/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/hello-world/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/hello-world/box.json +0 -8
- data/tracks/coldfusion/exercises/hello-world/index.cfm +0 -37
- data/tracks/coldfusion/exercises/isogram/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/isogram/Isogram.cfc +0 -13
- data/tracks/coldfusion/exercises/isogram/IsogramTest.cfc +0 -55
- data/tracks/coldfusion/exercises/isogram/Solution.cfc +0 -23
- data/tracks/coldfusion/exercises/isogram/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/isogram/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/isogram/box.json +0 -8
- data/tracks/coldfusion/exercises/isogram/index.cfm +0 -37
- data/tracks/coldfusion/exercises/largest-series-product/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/largest-series-product/LargestSeriesProduct.cfc +0 -13
- data/tracks/coldfusion/exercises/largest-series-product/LargestSeriesProductTest.cfc +0 -75
- data/tracks/coldfusion/exercises/largest-series-product/Solution.cfc +0 -41
- data/tracks/coldfusion/exercises/largest-series-product/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/largest-series-product/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/largest-series-product/box.json +0 -8
- data/tracks/coldfusion/exercises/largest-series-product/index.cfm +0 -37
- data/tracks/coldfusion/exercises/leap/Leap.cfc +0 -15
- data/tracks/coldfusion/exercises/leap/LeapTest.cfc +0 -39
- data/tracks/coldfusion/exercises/leap/README.md +0 -33
- data/tracks/coldfusion/exercises/leap/Solution.cfc +0 -19
- data/tracks/coldfusion/exercises/leap/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/leap/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/leap/box.json +0 -8
- data/tracks/coldfusion/exercises/leap/index.cfm +0 -37
- data/tracks/coldfusion/exercises/luhn/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/luhn/Luhn.cfc +0 -13
- data/tracks/coldfusion/exercises/luhn/LuhnTest.cfc +0 -67
- data/tracks/coldfusion/exercises/luhn/Solution.cfc +0 -38
- data/tracks/coldfusion/exercises/luhn/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/luhn/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/luhn/box.json +0 -8
- data/tracks/coldfusion/exercises/luhn/index.cfm +0 -37
- data/tracks/coldfusion/exercises/nth-prime/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/nth-prime/NthPrime.cfc +0 -13
- data/tracks/coldfusion/exercises/nth-prime/NthPrimeTest.cfc +0 -35
- data/tracks/coldfusion/exercises/nth-prime/Solution.cfc +0 -33
- data/tracks/coldfusion/exercises/nth-prime/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/nth-prime/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/nth-prime/box.json +0 -8
- data/tracks/coldfusion/exercises/nth-prime/index.cfm +0 -37
- data/tracks/coldfusion/exercises/pangram/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/pangram/Pangram.cfc +0 -13
- data/tracks/coldfusion/exercises/pangram/PangramTest.cfc +0 -55
- data/tracks/coldfusion/exercises/pangram/Solution.cfc +0 -21
- data/tracks/coldfusion/exercises/pangram/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/pangram/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/pangram/box.json +0 -8
- data/tracks/coldfusion/exercises/pangram/index.cfm +0 -37
- data/tracks/coldfusion/exercises/pig-latin/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/pig-latin/PigLatin.cfc +0 -13
- data/tracks/coldfusion/exercises/pig-latin/PigLatinTest.cfc +0 -115
- data/tracks/coldfusion/exercises/pig-latin/Solution.cfc +0 -30
- data/tracks/coldfusion/exercises/pig-latin/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/pig-latin/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/pig-latin/box.json +0 -8
- data/tracks/coldfusion/exercises/pig-latin/index.cfm +0 -37
- data/tracks/coldfusion/exercises/raindrops/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/raindrops/Raindrops.cfc +0 -13
- data/tracks/coldfusion/exercises/raindrops/RaindropsTest.cfc +0 -87
- data/tracks/coldfusion/exercises/raindrops/Solution.cfc +0 -33
- data/tracks/coldfusion/exercises/raindrops/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/raindrops/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/raindrops/box.json +0 -8
- data/tracks/coldfusion/exercises/raindrops/index.cfm +0 -37
- data/tracks/coldfusion/exercises/rna-transcription/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/rna-transcription/RnaTranscription.cfc +0 -13
- data/tracks/coldfusion/exercises/rna-transcription/RnaTranscriptionTest.cfc +0 -47
- data/tracks/coldfusion/exercises/rna-transcription/Solution.cfc +0 -35
- data/tracks/coldfusion/exercises/rna-transcription/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/rna-transcription/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/rna-transcription/box.json +0 -8
- data/tracks/coldfusion/exercises/rna-transcription/index.cfm +0 -37
- data/tracks/coldfusion/exercises/saddle-points/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/saddle-points/SaddlePoints.cfc +0 -13
- data/tracks/coldfusion/exercises/saddle-points/SaddlePointsTest.cfc +0 -35
- data/tracks/coldfusion/exercises/saddle-points/Solution.cfc +0 -59
- data/tracks/coldfusion/exercises/saddle-points/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/saddle-points/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/saddle-points/box.json +0 -8
- data/tracks/coldfusion/exercises/saddle-points/index.cfm +0 -37
- data/tracks/coldfusion/exercises/scrabble-score/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/scrabble-score/ScrabbleScore.cfc +0 -13
- data/tracks/coldfusion/exercises/scrabble-score/ScrabbleScoreTest.cfc +0 -59
- data/tracks/coldfusion/exercises/scrabble-score/Solution.cfc +0 -50
- data/tracks/coldfusion/exercises/scrabble-score/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/scrabble-score/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/scrabble-score/box.json +0 -8
- data/tracks/coldfusion/exercises/scrabble-score/index.cfm +0 -37
- data/tracks/coldfusion/exercises/secret-handshake/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/secret-handshake/SecretHandshake.cfc +0 -13
- data/tracks/coldfusion/exercises/secret-handshake/SecretHandshakeTest.cfc +0 -63
- data/tracks/coldfusion/exercises/secret-handshake/Solution.cfc +0 -31
- data/tracks/coldfusion/exercises/secret-handshake/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/secret-handshake/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/secret-handshake/box.json +0 -8
- data/tracks/coldfusion/exercises/secret-handshake/index.cfm +0 -37
- data/tracks/coldfusion/exercises/space-age/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/space-age/Solution.cfc +0 -28
- data/tracks/coldfusion/exercises/space-age/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/space-age/SpaceAge.cfc +0 -13
- data/tracks/coldfusion/exercises/space-age/SpaceAgeTest.cfc +0 -47
- data/tracks/coldfusion/exercises/space-age/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/space-age/box.json +0 -8
- data/tracks/coldfusion/exercises/space-age/index.cfm +0 -37
- data/tracks/coldfusion/exercises/sum-of-multiples/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/sum-of-multiples/Solution.cfc +0 -27
- data/tracks/coldfusion/exercises/sum-of-multiples/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/sum-of-multiples/SumOfMultiples.cfc +0 -13
- data/tracks/coldfusion/exercises/sum-of-multiples/SumOfMultiplesTest.cfc +0 -63
- data/tracks/coldfusion/exercises/sum-of-multiples/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/sum-of-multiples/box.json +0 -8
- data/tracks/coldfusion/exercises/sum-of-multiples/index.cfm +0 -37
- data/tracks/coldfusion/exercises/triangle/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/triangle/Solution.cfc +0 -53
- data/tracks/coldfusion/exercises/triangle/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/triangle/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/triangle/Triangle.cfc +0 -18
- data/tracks/coldfusion/exercises/triangle/TriangleTest.cfc +0 -95
- data/tracks/coldfusion/exercises/triangle/box.json +0 -8
- data/tracks/coldfusion/exercises/triangle/index.cfm +0 -37
- data/tracks/coldfusion/exercises/word-count/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/exercises/word-count/Solution.cfc +0 -22
- data/tracks/coldfusion/exercises/word-count/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/exercises/word-count/TestRunner.cfc +0 -103
- data/tracks/coldfusion/exercises/word-count/WordCount.cfc +0 -13
- data/tracks/coldfusion/exercises/word-count/WordCountTest.cfc +0 -55
- data/tracks/coldfusion/exercises/word-count/box.json +0 -8
- data/tracks/coldfusion/exercises/word-count/index.cfm +0 -37
- data/tracks/coldfusion/img/icon.png +0 -0
- data/tracks/coldfusion/tasks/GenerateTests.cfc +0 -179
- data/tracks/coldfusion/tasks/ScaffoldExercise.cfc +0 -85
- data/tracks/coldfusion/tasks/TestAllSolutions.cfc +0 -24
- data/tracks/coldfusion/tasks/exercise_template/.meta/HINTS.md +0 -0
- data/tracks/coldfusion/tasks/exercise_template/@@name@@.cfc +0 -13
- data/tracks/coldfusion/tasks/exercise_template/@@name@@Test.cfc +0 -15
- data/tracks/coldfusion/tasks/exercise_template/Solution.cfc +0 -6
- data/tracks/coldfusion/tasks/exercise_template/SolutionTest.cfc +0 -7
- data/tracks/coldfusion/tasks/exercise_template/TestRunner.cfc +0 -103
- data/tracks/coldfusion/tasks/exercise_template/box.json +0 -8
- data/tracks/coldfusion/tasks/exercise_template/index.cfm +0 -37
- data/tracks/csharp/exercises/etl/ETLTest.cs +0 -51
- data/tracks/csharp/exercises/saddle-points/SaddlePointTest.cs +0 -68
- data/tracks/java/exercises/triangle/.meta/src/reference/java/TriangleKind.java +0 -5
- data/tracks/java/exercises/triangle/src/main/java/TriangleKind.java +0 -5
@@ -1,13 +1,13 @@
|
|
1
1
|
{
|
2
|
+
"docs_url": "https://github.com/exercism/docs/blob/master/maintaining-a-track/maintainer-configuration.md",
|
2
3
|
"maintainers": [
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
]
|
12
|
-
|
13
|
-
}
|
4
|
+
{
|
5
|
+
"bio": "ColdBox/CommandBox Developer Advocate. Lucee Member. System Architect. CFML dev. DBA. Dad. Handyman. Ready for a revolution.",
|
6
|
+
"github_username": "bdw429s",
|
7
|
+
"link_text": "Tech Blog",
|
8
|
+
"link_url": "http://www.codersrevolution.com/",
|
9
|
+
"name": "Brad Wood",
|
10
|
+
"show_on_website": true
|
11
|
+
}
|
12
|
+
]
|
13
|
+
}
|
@@ -0,0 +1,102 @@
|
|
1
|
+
// This file was auto-generated based on version 1.0.0 of the canonical data.
|
2
|
+
|
3
|
+
using Xunit;
|
4
|
+
using System.Collections.Generic;
|
5
|
+
|
6
|
+
public class EtlTest
|
7
|
+
{
|
8
|
+
[Fact]
|
9
|
+
public void A_single_letter()
|
10
|
+
{
|
11
|
+
var input = new Dictionary<int, IList<string>>
|
12
|
+
{
|
13
|
+
[1] = new[] { "A" }
|
14
|
+
};
|
15
|
+
var expected = new Dictionary<string, int>
|
16
|
+
{
|
17
|
+
["a"] = 1
|
18
|
+
};
|
19
|
+
Assert.Equal(expected, Etl.Transform(input));
|
20
|
+
}
|
21
|
+
|
22
|
+
[Fact(Skip = "Remove to run test")]
|
23
|
+
public void Single_score_with_multiple_letters()
|
24
|
+
{
|
25
|
+
var input = new Dictionary<int, IList<string>>
|
26
|
+
{
|
27
|
+
[1] = new[] { "A", "E", "I", "O", "U" }
|
28
|
+
};
|
29
|
+
var expected = new Dictionary<string, int>
|
30
|
+
{
|
31
|
+
["a"] = 1,
|
32
|
+
["e"] = 1,
|
33
|
+
["i"] = 1,
|
34
|
+
["o"] = 1,
|
35
|
+
["u"] = 1
|
36
|
+
};
|
37
|
+
Assert.Equal(expected, Etl.Transform(input));
|
38
|
+
}
|
39
|
+
|
40
|
+
[Fact(Skip = "Remove to run test")]
|
41
|
+
public void Multiple_scores_with_multiple_letters()
|
42
|
+
{
|
43
|
+
var input = new Dictionary<int, IList<string>>
|
44
|
+
{
|
45
|
+
[1] = new[] { "A", "E" },
|
46
|
+
[2] = new[] { "D", "G" }
|
47
|
+
};
|
48
|
+
var expected = new Dictionary<string, int>
|
49
|
+
{
|
50
|
+
["a"] = 1,
|
51
|
+
["d"] = 2,
|
52
|
+
["e"] = 1,
|
53
|
+
["g"] = 2
|
54
|
+
};
|
55
|
+
Assert.Equal(expected, Etl.Transform(input));
|
56
|
+
}
|
57
|
+
|
58
|
+
[Fact(Skip = "Remove to run test")]
|
59
|
+
public void Multiple_scores_with_differing_numbers_of_letters()
|
60
|
+
{
|
61
|
+
var input = new Dictionary<int, IList<string>>
|
62
|
+
{
|
63
|
+
[1] = new[] { "A", "E", "I", "O", "U", "L", "N", "R", "S", "T" },
|
64
|
+
[2] = new[] { "D", "G" },
|
65
|
+
[3] = new[] { "B", "C", "M", "P" },
|
66
|
+
[4] = new[] { "F", "H", "V", "W", "Y" },
|
67
|
+
[5] = new[] { "K" },
|
68
|
+
[8] = new[] { "J", "X" },
|
69
|
+
[10] = new[] { "Q", "Z" }
|
70
|
+
};
|
71
|
+
var expected = new Dictionary<string, int>
|
72
|
+
{
|
73
|
+
["a"] = 1,
|
74
|
+
["b"] = 3,
|
75
|
+
["c"] = 3,
|
76
|
+
["d"] = 2,
|
77
|
+
["e"] = 1,
|
78
|
+
["f"] = 4,
|
79
|
+
["g"] = 2,
|
80
|
+
["h"] = 4,
|
81
|
+
["i"] = 1,
|
82
|
+
["j"] = 8,
|
83
|
+
["k"] = 5,
|
84
|
+
["l"] = 1,
|
85
|
+
["m"] = 3,
|
86
|
+
["n"] = 1,
|
87
|
+
["o"] = 1,
|
88
|
+
["p"] = 3,
|
89
|
+
["q"] = 10,
|
90
|
+
["r"] = 1,
|
91
|
+
["s"] = 1,
|
92
|
+
["t"] = 1,
|
93
|
+
["u"] = 1,
|
94
|
+
["v"] = 4,
|
95
|
+
["w"] = 4,
|
96
|
+
["x"] = 8,
|
97
|
+
["y"] = 4,
|
98
|
+
["z"] = 10
|
99
|
+
};
|
100
|
+
Assert.Equal(expected, Etl.Transform(input));
|
101
|
+
}
|
102
|
+
}
|
@@ -1,15 +1,24 @@
|
|
1
1
|
using System.Collections.Generic;
|
2
|
+
using System;
|
2
3
|
|
3
4
|
public static class PascalsTriangle
|
4
5
|
{
|
5
6
|
public static IEnumerable<IEnumerable<int>> Calculate(int rows)
|
7
|
+
{
|
8
|
+
if (rows < 0)
|
9
|
+
throw new ArgumentOutOfRangeException();
|
10
|
+
|
11
|
+
return IterateRows(rows);
|
12
|
+
}
|
13
|
+
|
14
|
+
private static IEnumerable<IEnumerable<int>> IterateRows(int rows)
|
6
15
|
{
|
7
16
|
for (var i = 1; i <= rows; i++)
|
8
17
|
{
|
9
18
|
yield return Row(i);
|
10
19
|
}
|
11
20
|
}
|
12
|
-
|
21
|
+
|
13
22
|
private static IEnumerable<int> Row(int row)
|
14
23
|
{
|
15
24
|
yield return 1;
|
@@ -1,80 +1,47 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
using System.Linq;
|
1
|
+
// This file was auto-generated based on version 1.0.0 of the canonical data.
|
2
|
+
|
4
3
|
using Xunit;
|
4
|
+
using System;
|
5
5
|
|
6
6
|
public class PascalsTriangleTest
|
7
7
|
{
|
8
8
|
[Fact]
|
9
|
-
public void
|
9
|
+
public void Zero_rows()
|
10
|
+
{
|
11
|
+
Assert.Empty(PascalsTriangle.Calculate(0));
|
12
|
+
}
|
13
|
+
|
14
|
+
[Fact(Skip = "Remove to run test")]
|
15
|
+
public void Single_row()
|
10
16
|
{
|
11
|
-
var actual = PascalsTriangle.Calculate(1);
|
12
17
|
var expected = new[] { new[] { 1 } };
|
13
|
-
Assert.Equal(expected,
|
18
|
+
Assert.Equal(expected, PascalsTriangle.Calculate(1));
|
14
19
|
}
|
15
|
-
|
20
|
+
|
16
21
|
[Fact(Skip = "Remove to run test")]
|
17
22
|
public void Two_rows()
|
18
23
|
{
|
19
|
-
var actual = PascalsTriangle.Calculate(2).ToArray();
|
20
24
|
var expected = new[] { new[] { 1 }, new[] { 1, 1 } };
|
21
|
-
Assert.Equal(expected,
|
25
|
+
Assert.Equal(expected, PascalsTriangle.Calculate(2));
|
22
26
|
}
|
23
27
|
|
24
28
|
[Fact(Skip = "Remove to run test")]
|
25
29
|
public void Three_rows()
|
26
30
|
{
|
27
|
-
var actual = PascalsTriangle.Calculate(3);
|
28
31
|
var expected = new[] { new[] { 1 }, new[] { 1, 1 }, new[] { 1, 2, 1 } };
|
29
|
-
Assert.Equal(expected,
|
32
|
+
Assert.Equal(expected, PascalsTriangle.Calculate(3));
|
30
33
|
}
|
31
34
|
|
32
35
|
[Fact(Skip = "Remove to run test")]
|
33
36
|
public void Four_rows()
|
34
37
|
{
|
35
|
-
var actual = PascalsTriangle.Calculate(4);
|
36
38
|
var expected = new[] { new[] { 1 }, new[] { 1, 1 }, new[] { 1, 2, 1 }, new[] { 1, 3, 3, 1 } };
|
37
|
-
Assert.Equal(expected,
|
38
|
-
}
|
39
|
-
|
40
|
-
[Fact(Skip = "Remove to run test")]
|
41
|
-
public void Five_rows()
|
42
|
-
{
|
43
|
-
var actual = PascalsTriangle.Calculate(5);
|
44
|
-
var expected = new[] { new[] { 1 }, new[] { 1, 1 }, new[] { 1, 2, 1 }, new[] { 1, 3, 3, 1 }, new[] { 1, 4, 6, 4, 1 } };
|
45
|
-
Assert.Equal(expected, actual, NestedEnumerableEqualityComparer<int>.Instance);
|
39
|
+
Assert.Equal(expected, PascalsTriangle.Calculate(4));
|
46
40
|
}
|
47
41
|
|
48
42
|
[Fact(Skip = "Remove to run test")]
|
49
|
-
public void
|
43
|
+
public void Negative_rows()
|
50
44
|
{
|
51
|
-
|
52
|
-
var expected = new[] { 1, 19, 171, 969, 3876, 11628, 27132, 50388, 75582, 92378, 92378, 75582, 50388, 27132, 11628, 3876, 969, 171, 19, 1 };
|
53
|
-
Assert.Equal(expected, actual);
|
54
|
-
}
|
55
|
-
|
56
|
-
private class EnumerableEqualityComparer<T> : IEqualityComparer<IEnumerable<T>>
|
57
|
-
{
|
58
|
-
public static readonly EnumerableEqualityComparer<T> Instance = new EnumerableEqualityComparer<T>();
|
59
|
-
|
60
|
-
public bool Equals(IEnumerable<T> x, IEnumerable<T> y) => x.SequenceEqual(y);
|
61
|
-
|
62
|
-
public int GetHashCode(IEnumerable<T> obj)
|
63
|
-
{
|
64
|
-
throw new NotImplementedException();
|
65
|
-
}
|
66
|
-
}
|
67
|
-
|
68
|
-
private class NestedEnumerableEqualityComparer<T> : IEqualityComparer<IEnumerable<IEnumerable<T>>>
|
69
|
-
{
|
70
|
-
public static readonly NestedEnumerableEqualityComparer<T> Instance = new NestedEnumerableEqualityComparer<T>();
|
71
|
-
|
72
|
-
public bool Equals(IEnumerable<IEnumerable<T>> x, IEnumerable<IEnumerable<T>> y)
|
73
|
-
=> x.SequenceEqual(y, EnumerableEqualityComparer<T>.Instance);
|
74
|
-
|
75
|
-
public int GetHashCode(IEnumerable<IEnumerable<T>> obj)
|
76
|
-
{
|
77
|
-
throw new NotImplementedException();
|
78
|
-
}
|
45
|
+
Assert.Throws<ArgumentOutOfRangeException>(() => PascalsTriangle.Calculate(-1));
|
79
46
|
}
|
80
47
|
}
|
@@ -0,0 +1,75 @@
|
|
1
|
+
// This file was auto-generated based on version 1.0.0 of the canonical data.
|
2
|
+
|
3
|
+
using Xunit;
|
4
|
+
using System;
|
5
|
+
|
6
|
+
public class SaddlePointsTest
|
7
|
+
{
|
8
|
+
[Fact]
|
9
|
+
public void Can_identify_single_saddle_point()
|
10
|
+
{
|
11
|
+
var input = new[,]
|
12
|
+
{
|
13
|
+
{ 9, 8, 7 },
|
14
|
+
{ 5, 3, 2 },
|
15
|
+
{ 6, 6, 7 }
|
16
|
+
};
|
17
|
+
var sut = new SaddlePoints(input);
|
18
|
+
var actual = sut.Calculate();
|
19
|
+
var expected = new[] { Tuple.Create(1, 0) };
|
20
|
+
Assert.Equal(expected, actual);
|
21
|
+
}
|
22
|
+
|
23
|
+
[Fact(Skip = "Remove to run test")]
|
24
|
+
public void Can_identify_that_empty_matrix_has_no_saddle_points()
|
25
|
+
{
|
26
|
+
var input = new int[,] { };
|
27
|
+
var sut = new SaddlePoints(input);
|
28
|
+
var actual = sut.Calculate();
|
29
|
+
Assert.Empty(actual);
|
30
|
+
}
|
31
|
+
|
32
|
+
[Fact(Skip = "Remove to run test")]
|
33
|
+
public void Can_identify_lack_of_saddle_points_when_there_are_none()
|
34
|
+
{
|
35
|
+
var input = new[,]
|
36
|
+
{
|
37
|
+
{ 1, 2, 3 },
|
38
|
+
{ 3, 1, 2 },
|
39
|
+
{ 2, 3, 1 }
|
40
|
+
};
|
41
|
+
var sut = new SaddlePoints(input);
|
42
|
+
var actual = sut.Calculate();
|
43
|
+
Assert.Empty(actual);
|
44
|
+
}
|
45
|
+
|
46
|
+
[Fact(Skip = "Remove to run test")]
|
47
|
+
public void Can_identify_multiple_saddle_points()
|
48
|
+
{
|
49
|
+
var input = new[,]
|
50
|
+
{
|
51
|
+
{ 4, 5, 4 },
|
52
|
+
{ 3, 5, 5 },
|
53
|
+
{ 1, 5, 4 }
|
54
|
+
};
|
55
|
+
var sut = new SaddlePoints(input);
|
56
|
+
var actual = sut.Calculate();
|
57
|
+
var expected = new[] { Tuple.Create(0, 1), Tuple.Create(1, 1), Tuple.Create(2, 1) };
|
58
|
+
Assert.Equal(expected, actual);
|
59
|
+
}
|
60
|
+
|
61
|
+
[Fact(Skip = "Remove to run test")]
|
62
|
+
public void Can_identify_saddle_point_in_bottom_right_corner()
|
63
|
+
{
|
64
|
+
var input = new[,]
|
65
|
+
{
|
66
|
+
{ 8, 7, 9 },
|
67
|
+
{ 6, 7, 6 },
|
68
|
+
{ 3, 2, 5 }
|
69
|
+
};
|
70
|
+
var sut = new SaddlePoints(input);
|
71
|
+
var actual = sut.Calculate();
|
72
|
+
var expected = new[] { Tuple.Create(2, 2) };
|
73
|
+
Assert.Equal(expected, actual);
|
74
|
+
}
|
75
|
+
}
|
@@ -0,0 +1,61 @@
|
|
1
|
+
using Generators.Input;
|
2
|
+
using Generators.Output;
|
3
|
+
using System.Collections.Generic;
|
4
|
+
using System.Linq;
|
5
|
+
|
6
|
+
namespace Generators.Exercises
|
7
|
+
{
|
8
|
+
public class Etl : Exercise
|
9
|
+
{
|
10
|
+
protected override void UpdateCanonicalData(CanonicalData canonicalData)
|
11
|
+
{
|
12
|
+
foreach (var canonicalDataCase in canonicalData.Cases)
|
13
|
+
{
|
14
|
+
canonicalDataCase.UseVariablesForInput = true;
|
15
|
+
canonicalDataCase.UseVariableForExpected = true;
|
16
|
+
// Make sure to convert keys to ints as stated in canonical data
|
17
|
+
canonicalDataCase.Properties["input"] = ConvertInput(canonicalDataCase.Properties["input"]);
|
18
|
+
canonicalDataCase.Expected = ConvertExpected(canonicalDataCase.Expected);
|
19
|
+
}
|
20
|
+
}
|
21
|
+
|
22
|
+
protected override string RenderTestMethodBodyArrange(TestMethodBody testMethodBody)
|
23
|
+
{
|
24
|
+
// The ValueFormatter doesn't handle Dictionary<int, IList<string>>. Need to format manually.
|
25
|
+
Dictionary<int, string[]> inputDictionary = testMethodBody.CanonicalDataCase.Properties["input"];
|
26
|
+
var newInput = FormatMultiLineEnumerable(
|
27
|
+
inputDictionary.Keys.Select((key, i) => $"[{ValueFormatter.Format(key)}] = {ValueFormatter.Format(inputDictionary[key])}" + (i < inputDictionary.Keys.Count - 1 ? "," : "")),
|
28
|
+
"input", "new Dictionary<int, IList<string>>");
|
29
|
+
newInput = AddTrailingSemicolon(newInput);
|
30
|
+
|
31
|
+
var arrangeVariables = testMethodBody.Data.Variables.ToList();
|
32
|
+
arrangeVariables.RemoveAt(0);
|
33
|
+
arrangeVariables.InsertRange(0, newInput);
|
34
|
+
testMethodBody.ArrangeTemplateParameters = new { Variables = arrangeVariables };
|
35
|
+
|
36
|
+
return base.RenderTestMethodBodyArrange(testMethodBody);
|
37
|
+
}
|
38
|
+
|
39
|
+
private static dynamic ConvertExpected(dynamic expected)
|
40
|
+
=> ((Dictionary<string, object>)expected).ToDictionary(kv => kv.Key, kv => int.Parse($"{kv.Value}"));
|
41
|
+
|
42
|
+
private static dynamic ConvertInput(dynamic input)
|
43
|
+
=> ((Dictionary<string, object>)input).ToDictionary(kv => int.Parse(kv.Key), kv => (string[])kv.Value);
|
44
|
+
|
45
|
+
private static string[] FormatMultiLineEnumerable(IEnumerable<string> enumerable, string name, string constructor = null)
|
46
|
+
=> FormatMultiLineVariable(enumerable.Prepend("{").Append("}"), name, constructor);
|
47
|
+
|
48
|
+
private static string[] FormatMultiLineVariable(IEnumerable<string> enumerable, string name, string constructor = null)
|
49
|
+
=> enumerable.Select(line => line == "{" || line == "}" ? line : line.Indent())
|
50
|
+
.Prepend($"var {name} = {constructor}")
|
51
|
+
.ToArray();
|
52
|
+
|
53
|
+
private static string[] AddTrailingSemicolon(string[] array)
|
54
|
+
{
|
55
|
+
array[array.Length - 1] += ";";
|
56
|
+
return array;
|
57
|
+
}
|
58
|
+
|
59
|
+
protected override HashSet<string> AddAdditionalNamespaces() => new HashSet<string> { typeof(Dictionary<string, int>).Namespace };
|
60
|
+
}
|
61
|
+
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
using System;
|
2
|
+
using System.Linq;
|
3
|
+
using Generators.Input;
|
4
|
+
using Newtonsoft.Json.Linq;
|
5
|
+
|
6
|
+
namespace Generators.Exercises
|
7
|
+
{
|
8
|
+
public class PascalsTriangle : Exercise
|
9
|
+
{
|
10
|
+
protected override void UpdateCanonicalData(CanonicalData canonicalData)
|
11
|
+
{
|
12
|
+
//remove null case until canonical data is updated
|
13
|
+
var cases = canonicalData.Cases.ToList();
|
14
|
+
cases.RemoveAll(x => x.Properties["count"] == null);
|
15
|
+
canonicalData.Cases = cases.ToArray();
|
16
|
+
|
17
|
+
foreach (var canonicalDataCase in canonicalData.Cases)
|
18
|
+
{
|
19
|
+
canonicalDataCase.UseVariableForExpected = true;
|
20
|
+
canonicalDataCase.Property = "calculate";
|
21
|
+
if (!(canonicalDataCase.Expected is JArray))
|
22
|
+
canonicalDataCase.ExceptionThrown = typeof(ArgumentOutOfRangeException);
|
23
|
+
if (canonicalDataCase.Properties["count"] == null)
|
24
|
+
canonicalDataCase.Properties["count"] = -1;
|
25
|
+
}
|
26
|
+
}
|
27
|
+
}
|
28
|
+
}
|