trackler 2.2.1.40 → 2.2.1.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitmodules +3 -0
- data/lib/trackler/version.rb +1 -1
- data/problem-specifications/exercises/dot-dsl/metadata.yml +1 -0
- data/problem-specifications/exercises/etl/metadata.yml +1 -0
- data/problem-specifications/exercises/isogram/canonical-data.json +3 -3
- data/problem-specifications/exercises/ocr-numbers/metadata.yml +1 -0
- data/problem-specifications/exercises/pascals-triangle/metadata.yml +1 -0
- data/problem-specifications/exercises/pov/metadata.yml +1 -0
- data/problem-specifications/exercises/rna-transcription/metadata.yml +1 -0
- data/problem-specifications/exercises/sgf-parsing/metadata.yml +1 -0
- data/tracks/c/exercises/all-your-base/src/example.c +14 -14
- data/tracks/c/exercises/all-your-base/src/example.h +2 -2
- data/tracks/ceylon/exercises/hamming/source/hamming/HammingTest.ceylon +1 -1
- data/tracks/ceylon/exercises/rna-transcription/source/rnatranscription/{RNAtest.ceylon → RNATest.ceylon} +0 -0
- data/tracks/cfml/.git +1 -0
- data/tracks/cfml/.gitignore +5 -0
- data/tracks/cfml/.travis.yml +18 -0
- data/tracks/cfml/CONTRIBUTING.md +10 -0
- data/tracks/cfml/LICENSE +21 -0
- data/tracks/cfml/README.md +92 -0
- data/tracks/cfml/bin/fetch-configlet +32 -0
- data/tracks/cfml/config/exercise_readme.go.tmpl +16 -0
- data/tracks/cfml/config/maintainers.json +13 -0
- data/tracks/cfml/config.json +223 -0
- data/tracks/cfml/docs/ABOUT.md +10 -0
- data/tracks/cfml/docs/EXERCISE_README_INSERT.md +15 -0
- data/tracks/cfml/docs/INSTALLATION.md +35 -0
- data/tracks/cfml/docs/LEARNING.md +37 -0
- data/tracks/cfml/docs/RESOURCES.md +29 -0
- data/tracks/cfml/docs/SNIPPET.txt +8 -0
- data/tracks/cfml/docs/TESTS.md +13 -0
- data/tracks/cfml/exercises/acronym/.meta/HINTS.md +0 -0
- data/tracks/cfml/exercises/acronym/Acronym.cfc +13 -0
- data/tracks/cfml/exercises/acronym/AcronymTest.cfc +43 -0
- data/tracks/cfml/exercises/acronym/Solution.cfc +22 -0
- data/tracks/cfml/exercises/acronym/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/acronym/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/acronym/box.json +8 -0
- data/tracks/cfml/exercises/acronym/index.cfm +37 -0
- data/tracks/cfml/exercises/atbash-cipher/.meta/HINTS.md +0 -0
- data/tracks/cfml/exercises/atbash-cipher/AtbashCipher.cfc +14 -0
- data/tracks/cfml/exercises/atbash-cipher/AtbashCipherTest.cfc +71 -0
- data/tracks/cfml/exercises/atbash-cipher/Solution.cfc +56 -0
- data/tracks/cfml/exercises/atbash-cipher/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/atbash-cipher/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/atbash-cipher/box.json +8 -0
- data/tracks/cfml/exercises/atbash-cipher/index.cfm +37 -0
- data/tracks/cfml/exercises/bob/.meta/HINTS.md +0 -0
- data/tracks/cfml/exercises/bob/Bob.cfc +13 -0
- data/tracks/cfml/exercises/bob/BobTest.cfc +115 -0
- data/tracks/cfml/exercises/bob/Solution.cfc +27 -0
- data/tracks/cfml/exercises/bob/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/bob/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/bob/box.json +8 -0
- data/tracks/cfml/exercises/bob/index.cfm +37 -0
- data/tracks/cfml/exercises/diamond/.meta/HINTS.md +0 -0
- data/tracks/cfml/exercises/diamond/Diamond.cfc +13 -0
- data/tracks/cfml/exercises/diamond/DiamondTest.cfc +35 -0
- data/tracks/cfml/exercises/diamond/Solution.cfc +35 -0
- data/tracks/cfml/exercises/diamond/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/diamond/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/diamond/box.json +8 -0
- data/tracks/cfml/exercises/diamond/index.cfm +37 -0
- data/tracks/cfml/exercises/difference-of-squares/.meta/HINTS.md +0 -0
- data/tracks/cfml/exercises/difference-of-squares/DifferenceOfSquares.cfc +18 -0
- data/tracks/cfml/exercises/difference-of-squares/DifferenceOfSquaresTest.cfc +63 -0
- data/tracks/cfml/exercises/difference-of-squares/Solution.cfc +28 -0
- data/tracks/cfml/exercises/difference-of-squares/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/difference-of-squares/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/difference-of-squares/box.json +8 -0
- data/tracks/cfml/exercises/difference-of-squares/index.cfm +37 -0
- data/tracks/cfml/exercises/flatten-array/.meta/HINTS.md +0 -0
- data/tracks/cfml/exercises/flatten-array/FlattenArray.cfc +13 -0
- data/tracks/cfml/exercises/flatten-array/FlattenArrayTest.cfc +42 -0
- data/tracks/cfml/exercises/flatten-array/Solution.cfc +26 -0
- data/tracks/cfml/exercises/flatten-array/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/flatten-array/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/flatten-array/box.json +8 -0
- data/tracks/cfml/exercises/flatten-array/index.cfm +37 -0
- data/tracks/cfml/exercises/gigasecond/.meta/HINTS.md +0 -0
- data/tracks/cfml/exercises/gigasecond/Gigasecond.cfc +13 -0
- data/tracks/cfml/exercises/gigasecond/GigasecondTest.cfc +39 -0
- data/tracks/cfml/exercises/gigasecond/Solution.cfc +16 -0
- data/tracks/cfml/exercises/gigasecond/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/gigasecond/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/gigasecond/box.json +8 -0
- data/tracks/cfml/exercises/gigasecond/index.cfm +37 -0
- data/tracks/cfml/exercises/grains/.meta/HINTS.md +0 -0
- data/tracks/cfml/exercises/grains/Grains.cfc +14 -0
- data/tracks/cfml/exercises/grains/GrainsTest.cfc +63 -0
- data/tracks/cfml/exercises/grains/Solution.cfc +22 -0
- data/tracks/cfml/exercises/grains/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/grains/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/grains/box.json +8 -0
- data/tracks/cfml/exercises/grains/index.cfm +37 -0
- data/tracks/cfml/exercises/hamming/.meta/HINTS.md +0 -0
- data/tracks/cfml/exercises/hamming/Hamming.cfc +13 -0
- data/tracks/cfml/exercises/hamming/HammingTest.cfc +75 -0
- data/tracks/cfml/exercises/hamming/Solution.cfc +25 -0
- data/tracks/cfml/exercises/hamming/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/hamming/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/hamming/box.json +8 -0
- data/tracks/cfml/exercises/hamming/index.cfm +37 -0
- data/tracks/cfml/exercises/hello-world/HelloWorld.cfc +13 -0
- data/tracks/cfml/exercises/hello-world/HelloWorldTest.cfc +18 -0
- data/tracks/cfml/exercises/hello-world/Solution.cfc +13 -0
- data/tracks/cfml/exercises/hello-world/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/hello-world/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/hello-world/box.json +8 -0
- data/tracks/cfml/exercises/hello-world/index.cfm +37 -0
- data/tracks/cfml/exercises/isogram/.meta/HINTS.md +0 -0
- data/tracks/cfml/exercises/isogram/Isogram.cfc +13 -0
- data/tracks/cfml/exercises/isogram/IsogramTest.cfc +55 -0
- data/tracks/cfml/exercises/isogram/Solution.cfc +23 -0
- data/tracks/cfml/exercises/isogram/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/isogram/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/isogram/box.json +8 -0
- data/tracks/cfml/exercises/isogram/index.cfm +37 -0
- data/tracks/cfml/exercises/largest-series-product/.meta/HINTS.md +0 -0
- data/tracks/cfml/exercises/largest-series-product/LargestSeriesProduct.cfc +13 -0
- data/tracks/cfml/exercises/largest-series-product/LargestSeriesProductTest.cfc +75 -0
- data/tracks/cfml/exercises/largest-series-product/Solution.cfc +41 -0
- data/tracks/cfml/exercises/largest-series-product/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/largest-series-product/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/largest-series-product/box.json +8 -0
- data/tracks/cfml/exercises/largest-series-product/index.cfm +37 -0
- data/tracks/cfml/exercises/leap/Leap.cfc +15 -0
- data/tracks/cfml/exercises/leap/LeapTest.cfc +39 -0
- data/tracks/cfml/exercises/leap/README.md +33 -0
- data/tracks/cfml/exercises/leap/Solution.cfc +19 -0
- data/tracks/cfml/exercises/leap/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/leap/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/leap/box.json +8 -0
- data/tracks/cfml/exercises/leap/index.cfm +37 -0
- data/tracks/cfml/exercises/luhn/.meta/HINTS.md +0 -0
- data/tracks/cfml/exercises/luhn/Luhn.cfc +13 -0
- data/tracks/cfml/exercises/luhn/LuhnTest.cfc +67 -0
- data/tracks/cfml/exercises/luhn/Solution.cfc +38 -0
- data/tracks/cfml/exercises/luhn/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/luhn/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/luhn/box.json +8 -0
- data/tracks/cfml/exercises/luhn/index.cfm +37 -0
- data/tracks/cfml/exercises/nth-prime/.meta/HINTS.md +0 -0
- data/tracks/cfml/exercises/nth-prime/NthPrime.cfc +13 -0
- data/tracks/cfml/exercises/nth-prime/NthPrimeTest.cfc +35 -0
- data/tracks/cfml/exercises/nth-prime/Solution.cfc +33 -0
- data/tracks/cfml/exercises/nth-prime/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/nth-prime/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/nth-prime/box.json +8 -0
- data/tracks/cfml/exercises/nth-prime/index.cfm +37 -0
- data/tracks/cfml/exercises/pangram/.meta/HINTS.md +0 -0
- data/tracks/cfml/exercises/pangram/Pangram.cfc +13 -0
- data/tracks/cfml/exercises/pangram/PangramTest.cfc +55 -0
- data/tracks/cfml/exercises/pangram/Solution.cfc +21 -0
- data/tracks/cfml/exercises/pangram/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/pangram/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/pangram/box.json +8 -0
- data/tracks/cfml/exercises/pangram/index.cfm +37 -0
- data/tracks/cfml/exercises/pig-latin/.meta/HINTS.md +0 -0
- data/tracks/cfml/exercises/pig-latin/PigLatin.cfc +13 -0
- data/tracks/cfml/exercises/pig-latin/PigLatinTest.cfc +115 -0
- data/tracks/cfml/exercises/pig-latin/Solution.cfc +30 -0
- data/tracks/cfml/exercises/pig-latin/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/pig-latin/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/pig-latin/box.json +8 -0
- data/tracks/cfml/exercises/pig-latin/index.cfm +37 -0
- data/tracks/cfml/exercises/raindrops/.meta/HINTS.md +0 -0
- data/tracks/cfml/exercises/raindrops/Raindrops.cfc +13 -0
- data/tracks/cfml/exercises/raindrops/RaindropsTest.cfc +87 -0
- data/tracks/cfml/exercises/raindrops/Solution.cfc +33 -0
- data/tracks/cfml/exercises/raindrops/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/raindrops/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/raindrops/box.json +8 -0
- data/tracks/cfml/exercises/raindrops/index.cfm +37 -0
- data/tracks/cfml/exercises/rna-transcription/.meta/HINTS.md +0 -0
- data/tracks/cfml/exercises/rna-transcription/RnaTranscription.cfc +13 -0
- data/tracks/cfml/exercises/rna-transcription/RnaTranscriptionTest.cfc +47 -0
- data/tracks/cfml/exercises/rna-transcription/Solution.cfc +35 -0
- data/tracks/cfml/exercises/rna-transcription/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/rna-transcription/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/rna-transcription/box.json +8 -0
- data/tracks/cfml/exercises/rna-transcription/index.cfm +37 -0
- data/tracks/cfml/exercises/saddle-points/.meta/HINTS.md +0 -0
- data/tracks/cfml/exercises/saddle-points/SaddlePoints.cfc +13 -0
- data/tracks/cfml/exercises/saddle-points/SaddlePointsTest.cfc +35 -0
- data/tracks/cfml/exercises/saddle-points/Solution.cfc +59 -0
- data/tracks/cfml/exercises/saddle-points/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/saddle-points/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/saddle-points/box.json +8 -0
- data/tracks/cfml/exercises/saddle-points/index.cfm +37 -0
- data/tracks/cfml/exercises/scrabble-score/.meta/HINTS.md +0 -0
- data/tracks/cfml/exercises/scrabble-score/ScrabbleScore.cfc +13 -0
- data/tracks/cfml/exercises/scrabble-score/ScrabbleScoreTest.cfc +59 -0
- data/tracks/cfml/exercises/scrabble-score/Solution.cfc +50 -0
- data/tracks/cfml/exercises/scrabble-score/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/scrabble-score/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/scrabble-score/box.json +8 -0
- data/tracks/cfml/exercises/scrabble-score/index.cfm +37 -0
- data/tracks/cfml/exercises/secret-handshake/.meta/HINTS.md +0 -0
- data/tracks/cfml/exercises/secret-handshake/SecretHandshake.cfc +13 -0
- data/tracks/cfml/exercises/secret-handshake/SecretHandshakeTest.cfc +63 -0
- data/tracks/cfml/exercises/secret-handshake/Solution.cfc +31 -0
- data/tracks/cfml/exercises/secret-handshake/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/secret-handshake/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/secret-handshake/box.json +8 -0
- data/tracks/cfml/exercises/secret-handshake/index.cfm +37 -0
- data/tracks/cfml/exercises/space-age/.meta/HINTS.md +0 -0
- data/tracks/cfml/exercises/space-age/Solution.cfc +28 -0
- data/tracks/cfml/exercises/space-age/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/space-age/SpaceAge.cfc +13 -0
- data/tracks/cfml/exercises/space-age/SpaceAgeTest.cfc +47 -0
- data/tracks/cfml/exercises/space-age/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/space-age/box.json +8 -0
- data/tracks/cfml/exercises/space-age/index.cfm +37 -0
- data/tracks/cfml/exercises/sum-of-multiples/.meta/HINTS.md +0 -0
- data/tracks/cfml/exercises/sum-of-multiples/Solution.cfc +27 -0
- data/tracks/cfml/exercises/sum-of-multiples/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/sum-of-multiples/SumOfMultiples.cfc +13 -0
- data/tracks/cfml/exercises/sum-of-multiples/SumOfMultiplesTest.cfc +63 -0
- data/tracks/cfml/exercises/sum-of-multiples/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/sum-of-multiples/box.json +8 -0
- data/tracks/cfml/exercises/sum-of-multiples/index.cfm +37 -0
- data/tracks/cfml/exercises/triangle/.meta/HINTS.md +0 -0
- data/tracks/cfml/exercises/triangle/Solution.cfc +53 -0
- data/tracks/cfml/exercises/triangle/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/triangle/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/triangle/Triangle.cfc +18 -0
- data/tracks/cfml/exercises/triangle/TriangleTest.cfc +95 -0
- data/tracks/cfml/exercises/triangle/box.json +8 -0
- data/tracks/cfml/exercises/triangle/index.cfm +37 -0
- data/tracks/cfml/exercises/word-count/.meta/HINTS.md +0 -0
- data/tracks/cfml/exercises/word-count/Solution.cfc +22 -0
- data/tracks/cfml/exercises/word-count/SolutionTest.cfc +7 -0
- data/tracks/cfml/exercises/word-count/TestRunner.cfc +103 -0
- data/tracks/cfml/exercises/word-count/WordCount.cfc +13 -0
- data/tracks/cfml/exercises/word-count/WordCountTest.cfc +55 -0
- data/tracks/cfml/exercises/word-count/box.json +8 -0
- data/tracks/cfml/exercises/word-count/index.cfm +37 -0
- data/tracks/cfml/img/icon.png +0 -0
- data/tracks/cfml/tasks/GenerateTests.cfc +179 -0
- data/tracks/cfml/tasks/ScaffoldExercise.cfc +85 -0
- data/tracks/cfml/tasks/TestAllSolutions.cfc +24 -0
- data/tracks/cfml/tasks/exercise_template/.meta/HINTS.md +0 -0
- data/tracks/cfml/tasks/exercise_template/@@name@@.cfc +13 -0
- data/tracks/cfml/tasks/exercise_template/@@name@@Test.cfc +15 -0
- data/tracks/cfml/tasks/exercise_template/Solution.cfc +6 -0
- data/tracks/cfml/tasks/exercise_template/SolutionTest.cfc +7 -0
- data/tracks/cfml/tasks/exercise_template/TestRunner.cfc +103 -0
- data/tracks/cfml/tasks/exercise_template/box.json +8 -0
- data/tracks/cfml/tasks/exercise_template/index.cfm +37 -0
- data/tracks/coldfusion/docs/ABOUT.md +8 -6
- data/tracks/csharp/docs/GENERATORS.md +7 -0
- data/tracks/csharp/exercises/clock/ClockTest.cs +15 -15
- data/tracks/csharp/exercises/nucleotide-count/Example.cs +10 -11
- data/tracks/csharp/exercises/nucleotide-count/NucleotideCount.cs +2 -7
- data/tracks/csharp/exercises/nucleotide-count/NucleotideCountTest.cs +37 -47
- data/tracks/csharp/exercises/pig-latin/Example.cs +1 -1
- data/tracks/csharp/exercises/pig-latin/PigLatinTest.cs +19 -7
- data/tracks/csharp/exercises/sum-of-multiples/SumOfMultiplesTest.cs +7 -1
- data/tracks/csharp/exercises/tournament/Example.cs +1 -1
- data/tracks/csharp/exercises/tournament/TournamentTest.cs +151 -68
- data/tracks/csharp/exercises/triangle/Example.cs +26 -8
- data/tracks/csharp/exercises/triangle/Triangle.cs +16 -1
- data/tracks/csharp/exercises/triangle/TriangleTest.cs +44 -30
- data/tracks/csharp/generators/Exercise.cs +6 -1
- data/tracks/csharp/generators/Exercises/Clock.cs +17 -1
- data/tracks/csharp/generators/Exercises/NucleotideCount.cs +61 -0
- data/tracks/csharp/generators/Exercises/Tournament.cs +66 -0
- data/tracks/csharp/generators/Exercises/Triangle.cs +36 -0
- data/tracks/dart/config.json +15 -2
- data/tracks/dart/exercises/raindrops/lib/example.dart +23 -0
- data/tracks/dart/exercises/raindrops/lib/raindrops.dart +3 -0
- data/tracks/dart/exercises/raindrops/pubspec.lock +281 -0
- data/tracks/dart/exercises/raindrops/pubspec.yaml +3 -0
- data/tracks/dart/exercises/raindrops/test/raindrops_test.dart +94 -0
- data/tracks/delphi/exercises/pig-latin/uPigLatinExample.pas +1 -25
- data/tracks/haskell/config.json +9 -0
- data/tracks/haskell/exercises/acronym/README.md +0 -1
- data/tracks/haskell/exercises/all-your-base/README.md +1 -1
- data/tracks/haskell/exercises/allergies/README.md +0 -1
- data/tracks/haskell/exercises/alphametics/README.md +2 -2
- data/tracks/haskell/exercises/atbash-cipher/README.md +2 -1
- data/tracks/haskell/exercises/beer-song/README.md +1 -1
- data/tracks/haskell/exercises/binary/README.md +2 -0
- data/tracks/haskell/exercises/bowling/README.md +20 -6
- data/tracks/haskell/exercises/collatz-conjecture/README.md +1 -1
- data/tracks/haskell/exercises/connect/README.md +1 -1
- data/tracks/haskell/exercises/crypto-square/README.md +4 -4
- data/tracks/haskell/exercises/diamond/README.md +113 -0
- data/tracks/haskell/exercises/diamond/examples/success-standard/package.yaml +16 -0
- data/tracks/haskell/exercises/diamond/examples/success-standard/src/Diamond.hs +16 -0
- data/tracks/haskell/exercises/diamond/package.yaml +20 -0
- data/tracks/haskell/exercises/diamond/src/Diamond.hs +4 -0
- data/tracks/haskell/exercises/diamond/stack.yaml +1 -0
- data/tracks/haskell/exercises/diamond/test/Tests.hs +109 -0
- data/tracks/haskell/exercises/etl/README.md +3 -1
- data/tracks/haskell/exercises/food-chain/README.md +1 -1
- data/tracks/haskell/exercises/go-counting/README.md +1 -1
- data/tracks/haskell/exercises/grade-school/README.md +0 -1
- data/tracks/haskell/exercises/grains/README.md +0 -1
- data/tracks/haskell/exercises/house/README.md +1 -2
- data/tracks/haskell/exercises/isogram/README.md +2 -1
- data/tracks/haskell/exercises/kindergarten-garden/README.md +3 -3
- data/tracks/haskell/exercises/leap/README.md +1 -1
- data/tracks/haskell/exercises/linked-list/README.md +10 -10
- data/tracks/haskell/exercises/luhn/README.md +7 -7
- data/tracks/haskell/exercises/matrix/README.md +6 -4
- data/tracks/haskell/exercises/meetup/README.md +1 -2
- data/tracks/haskell/exercises/nucleotide-count/README.md +8 -22
- data/tracks/haskell/exercises/ocr-numbers/README.md +6 -6
- data/tracks/haskell/exercises/octal/README.md +6 -2
- data/tracks/haskell/exercises/palindrome-products/README.md +12 -6
- data/tracks/haskell/exercises/pangram/README.md +1 -1
- data/tracks/haskell/exercises/pascals-triangle/README.md +2 -2
- data/tracks/haskell/exercises/phone-number/README.md +3 -2
- data/tracks/haskell/exercises/pov/README.md +3 -3
- data/tracks/haskell/exercises/pythagorean-triplet/README.md +3 -3
- data/tracks/haskell/exercises/queen-attack/README.md +1 -1
- data/tracks/haskell/exercises/rna-transcription/README.md +1 -1
- data/tracks/haskell/exercises/roman-numerals/README.md +1 -1
- data/tracks/haskell/exercises/run-length-encoding/README.md +4 -4
- data/tracks/haskell/exercises/saddle-points/README.md +1 -1
- data/tracks/haskell/exercises/scrabble-score/README.md +3 -1
- data/tracks/haskell/exercises/secret-handshake/README.md +1 -1
- data/tracks/haskell/exercises/sgf-parsing/README.md +4 -4
- data/tracks/haskell/exercises/simple-cipher/README.md +1 -1
- data/tracks/haskell/exercises/spiral-matrix/README.md +2 -2
- data/tracks/haskell/exercises/triangle/README.md +9 -6
- data/tracks/haskell/exercises/trinary/README.md +1 -1
- data/tracks/haskell/exercises/word-count/README.md +1 -2
- data/tracks/haskell/exercises/wordy/README.md +0 -5
- data/tracks/java/config.json +56 -9
- data/tracks/java/exercises/binary-search-tree/src/test/java/BSTTest.java +4 -4
- data/tracks/javascript/exercises/two-bucket/example.js +66 -69
- data/tracks/javascript/exercises/two-bucket/two-bucket.spec.js +18 -18
- data/tracks/julia/config.json +1 -0
- data/tracks/julia/docs/ABOUT.md +3 -8
- data/tracks/prolog/README.md +1 -1
- data/tracks/purescript/.travis.yml +1 -0
- data/tracks/purescript/README.md +9 -0
- data/tracks/purescript/bin/check-bower.sh +42 -0
- data/tracks/purescript/bin/test-separate.sh +46 -0
- data/tracks/python/README.md +2 -2
- data/tracks/python/exercises/all-your-base/all_your_base.py +2 -0
- data/tracks/python/exercises/atbash-cipher/atbash_cipher.py +2 -2
- data/tracks/python/exercises/complex-numbers/complex_numbers_test.py +2 -2
- data/tracks/python/exercises/complex-numbers/example.py +2 -2
- data/tracks/python/exercises/gigasecond/gigasecond.py +1 -1
- data/tracks/python/exercises/hamming/hamming.py +1 -1
- data/tracks/python/exercises/hexadecimal/hexadecimal.py +1 -1
- data/tracks/python/exercises/leap/leap.py +1 -1
- data/tracks/python/exercises/meetup/meetup.py +1 -1
- data/tracks/python/exercises/phone-number/example.py +4 -2
- data/tracks/python/exercises/phone-number/phone_number_test.py +47 -16
- data/tracks/python/exercises/pig-latin/pig_latin.py +1 -1
- data/tracks/python/exercises/scrabble-score/scrabble_score.py +1 -1
- data/tracks/python/exercises/wordy/wordy.py +1 -1
- data/tracks/scala/exercises/meetup/example.scala +29 -10
- data/tracks/scala/exercises/meetup/src/main/scala/Meetup.scala +23 -0
- data/tracks/scala/exercises/meetup/src/test/scala/MeetupTest.scala +273 -183
- data/tracks/sml/config.json +13 -0
- data/tracks/sml/exercises/anagram/README.md +21 -5
- data/tracks/sml/exercises/anagram/anagram.sml +2 -6
- data/tracks/sml/exercises/anagram/example.sml +29 -24
- data/tracks/sml/exercises/anagram/test.sml +56 -50
- data/tracks/sml/exercises/anagram/testlib.sml +159 -0
- data/tracks/sml/exercises/diamond/README.md +89 -0
- data/tracks/sml/exercises/diamond/diamond.sml +2 -0
- data/tracks/sml/exercises/diamond/example.sml +25 -0
- data/tracks/sml/exercises/diamond/test.sml +27 -0
- data/tracks/sml/exercises/diamond/testlib.sml +159 -0
- data/tracks/sml/exercises/raindrops/raindrops.sml +2 -2
- data/tracks/sml/exercises/raindrops/test.sml +66 -95
- data/tracks/sml/exercises/raindrops/testlib.sml +159 -0
- metadata +265 -3
|
@@ -1,94 +1,108 @@
|
|
|
1
|
+
// This file was auto-generated based on version 1.0.0 of the canonical data.
|
|
2
|
+
|
|
1
3
|
using Xunit;
|
|
2
4
|
|
|
3
5
|
public class TriangleTest
|
|
4
6
|
{
|
|
5
7
|
[Fact]
|
|
6
|
-
public void
|
|
8
|
+
public void Returns_true_if_the_triangle_is_equilateral_true_if_all_sides_are_equal()
|
|
9
|
+
{
|
|
10
|
+
Assert.True(Triangle.IsEquilateral(2,2,2));
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
[Fact(Skip = "Remove to run test")]
|
|
14
|
+
public void Returns_true_if_the_triangle_is_equilateral_false_if_any_side_is_unequal()
|
|
15
|
+
{
|
|
16
|
+
Assert.False(Triangle.IsEquilateral(2,3,2));
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
[Fact(Skip = "Remove to run test")]
|
|
20
|
+
public void Returns_true_if_the_triangle_is_equilateral_false_if_no_sides_are_equal()
|
|
7
21
|
{
|
|
8
|
-
Assert.
|
|
22
|
+
Assert.False(Triangle.IsEquilateral(5,4,6));
|
|
9
23
|
}
|
|
10
24
|
|
|
11
25
|
[Fact(Skip = "Remove to run test")]
|
|
12
|
-
public void
|
|
26
|
+
public void Returns_true_if_the_triangle_is_equilateral_all_zero_sides_are_illegal_so_the_triangle_is_not_equilateral()
|
|
13
27
|
{
|
|
14
|
-
Assert.
|
|
28
|
+
Assert.False(Triangle.IsEquilateral(0,0,0));
|
|
15
29
|
}
|
|
16
30
|
|
|
17
31
|
[Fact(Skip = "Remove to run test")]
|
|
18
|
-
public void
|
|
32
|
+
public void Returns_true_if_the_triangle_is_equilateral_sides_may_be_floats()
|
|
19
33
|
{
|
|
20
|
-
Assert.
|
|
34
|
+
Assert.True(Triangle.IsEquilateral(0.5,0.5,0.5));
|
|
21
35
|
}
|
|
22
36
|
|
|
23
37
|
[Fact(Skip = "Remove to run test")]
|
|
24
|
-
public void
|
|
38
|
+
public void Returns_true_if_the_triangle_is_isosceles_true_if_last_two_sides_are_equal()
|
|
25
39
|
{
|
|
26
|
-
Assert.
|
|
40
|
+
Assert.True(Triangle.IsIsosceles(3,4,4));
|
|
27
41
|
}
|
|
28
42
|
|
|
29
43
|
[Fact(Skip = "Remove to run test")]
|
|
30
|
-
public void
|
|
44
|
+
public void Returns_true_if_the_triangle_is_isosceles_true_if_first_two_sides_are_equal()
|
|
31
45
|
{
|
|
32
|
-
Assert.
|
|
46
|
+
Assert.True(Triangle.IsIsosceles(4,4,3));
|
|
33
47
|
}
|
|
34
48
|
|
|
35
49
|
[Fact(Skip = "Remove to run test")]
|
|
36
|
-
public void
|
|
50
|
+
public void Returns_true_if_the_triangle_is_isosceles_true_if_first_and_last_sides_are_equal()
|
|
37
51
|
{
|
|
38
|
-
Assert.
|
|
52
|
+
Assert.True(Triangle.IsIsosceles(4,3,4));
|
|
39
53
|
}
|
|
40
54
|
|
|
41
55
|
[Fact(Skip = "Remove to run test")]
|
|
42
|
-
public void
|
|
56
|
+
public void Returns_true_if_the_triangle_is_isosceles_equilateral_triangles_are_also_isosceles()
|
|
43
57
|
{
|
|
44
|
-
Assert.
|
|
58
|
+
Assert.True(Triangle.IsIsosceles(4,4,4));
|
|
45
59
|
}
|
|
46
60
|
|
|
47
61
|
[Fact(Skip = "Remove to run test")]
|
|
48
|
-
public void
|
|
62
|
+
public void Returns_true_if_the_triangle_is_isosceles_false_if_no_sides_are_equal()
|
|
49
63
|
{
|
|
50
|
-
Assert.
|
|
64
|
+
Assert.False(Triangle.IsIsosceles(2,3,4));
|
|
51
65
|
}
|
|
52
66
|
|
|
53
67
|
[Fact(Skip = "Remove to run test")]
|
|
54
|
-
public void
|
|
68
|
+
public void Returns_true_if_the_triangle_is_isosceles_sides_that_violate_triangle_inequality_are_not_isosceles_even_if_two_are_equal()
|
|
55
69
|
{
|
|
56
|
-
Assert.
|
|
70
|
+
Assert.False(Triangle.IsIsosceles(1,1,3));
|
|
57
71
|
}
|
|
58
72
|
|
|
59
73
|
[Fact(Skip = "Remove to run test")]
|
|
60
|
-
public void
|
|
74
|
+
public void Returns_true_if_the_triangle_is_isosceles_sides_may_be_floats()
|
|
61
75
|
{
|
|
62
|
-
Assert.
|
|
76
|
+
Assert.True(Triangle.IsIsosceles(0.5,0.4,0.5));
|
|
63
77
|
}
|
|
64
78
|
|
|
65
79
|
[Fact(Skip = "Remove to run test")]
|
|
66
|
-
public void
|
|
80
|
+
public void Returns_true_if_the_triangle_is_scalene_true_if_no_sides_are_equal()
|
|
67
81
|
{
|
|
68
|
-
Assert.
|
|
82
|
+
Assert.True(Triangle.IsScalene(5,4,6));
|
|
69
83
|
}
|
|
70
84
|
|
|
71
85
|
[Fact(Skip = "Remove to run test")]
|
|
72
|
-
public void
|
|
86
|
+
public void Returns_true_if_the_triangle_is_scalene_false_if_all_sides_are_equal()
|
|
73
87
|
{
|
|
74
|
-
Assert.
|
|
88
|
+
Assert.False(Triangle.IsScalene(4,4,4));
|
|
75
89
|
}
|
|
76
90
|
|
|
77
91
|
[Fact(Skip = "Remove to run test")]
|
|
78
|
-
public void
|
|
92
|
+
public void Returns_true_if_the_triangle_is_scalene_false_if_two_sides_are_equal()
|
|
79
93
|
{
|
|
80
|
-
Assert.
|
|
94
|
+
Assert.False(Triangle.IsScalene(4,4,3));
|
|
81
95
|
}
|
|
82
96
|
|
|
83
97
|
[Fact(Skip = "Remove to run test")]
|
|
84
|
-
public void
|
|
98
|
+
public void Returns_true_if_the_triangle_is_scalene_sides_that_violate_triangle_inequality_are_not_scalene_even_if_they_are_all_different()
|
|
85
99
|
{
|
|
86
|
-
Assert.
|
|
100
|
+
Assert.False(Triangle.IsScalene(7,3,2));
|
|
87
101
|
}
|
|
88
102
|
|
|
89
103
|
[Fact(Skip = "Remove to run test")]
|
|
90
|
-
public void
|
|
104
|
+
public void Returns_true_if_the_triangle_is_scalene_sides_may_be_floats()
|
|
91
105
|
{
|
|
92
|
-
Assert.
|
|
106
|
+
Assert.True(Triangle.IsScalene(0.5,0.4,0.6));
|
|
93
107
|
}
|
|
94
108
|
}
|
|
@@ -40,6 +40,11 @@ namespace Generators
|
|
|
40
40
|
protected virtual string RenderTestMethodBodyAssert(TestMethodBody testMethodBody)
|
|
41
41
|
=> TemplateRenderer.RenderPartial(testMethodBody.AssertTemplateName, testMethodBody.AssertTemplateParameters);
|
|
42
42
|
|
|
43
|
+
protected virtual string[] RenderAdditionalMethods()
|
|
44
|
+
{
|
|
45
|
+
return new string[] { };
|
|
46
|
+
}
|
|
47
|
+
|
|
43
48
|
private HashSet<string> GetUsingNamespaces()
|
|
44
49
|
{
|
|
45
50
|
var usingNamespaces = new HashSet<string> { "Xunit" };
|
|
@@ -52,7 +57,7 @@ namespace Generators
|
|
|
52
57
|
return usingNamespaces;
|
|
53
58
|
}
|
|
54
59
|
|
|
55
|
-
private string[] RenderTestMethods() => _canonicalData.Cases.Select(RenderTestMethod).ToArray();
|
|
60
|
+
private string[] RenderTestMethods() => _canonicalData.Cases.Select(RenderTestMethod).Concat(RenderAdditionalMethods()).ToArray();
|
|
56
61
|
|
|
57
62
|
private TestClass CreateTestClass() => new TestClass
|
|
58
63
|
{
|
|
@@ -15,6 +15,7 @@ namespace Generators.Exercises
|
|
|
15
15
|
private const string PropertyEqual = "equal";
|
|
16
16
|
private const string PropertyEquals = "equals";
|
|
17
17
|
private const string PropertyToString = "to_string";
|
|
18
|
+
private const string PropertyEqualityExpectance = "expected";
|
|
18
19
|
|
|
19
20
|
protected override void UpdateCanonicalData(CanonicalData canonicalData)
|
|
20
21
|
{
|
|
@@ -47,7 +48,7 @@ namespace Generators.Exercises
|
|
|
47
48
|
{
|
|
48
49
|
if (testMethodBody.CanonicalDataCase.Property == PropertyEquals)
|
|
49
50
|
{
|
|
50
|
-
return
|
|
51
|
+
return RenderEqualToAssert(testMethodBody);
|
|
51
52
|
}
|
|
52
53
|
else if (testMethodBody.CanonicalDataCase.Property != PropertyToString)
|
|
53
54
|
{
|
|
@@ -65,5 +66,20 @@ namespace Generators.Exercises
|
|
|
65
66
|
|
|
66
67
|
return TemplateRenderer.RenderInline(template, testMethodBody.AssertTemplateParameters);
|
|
67
68
|
}
|
|
69
|
+
|
|
70
|
+
private static string RenderEqualToAssert(TestMethodBody testMethodBody)
|
|
71
|
+
{
|
|
72
|
+
var ExpectedParameter = testMethodBody.CanonicalDataCase.Input[ParamClock2];
|
|
73
|
+
var TestedValue = "sut";
|
|
74
|
+
var expectedEqual = testMethodBody.CanonicalDataCase.Properties[PropertyEqualityExpectance];
|
|
75
|
+
|
|
76
|
+
testMethodBody.AssertTemplateParameters = new { ExpectedParameter, TestedValue};
|
|
77
|
+
|
|
78
|
+
var template = expectedEqual
|
|
79
|
+
? $"Assert.Equal({{{{ ExpectedParameter }}}}, {{{{ TestedValue }}}}); "
|
|
80
|
+
: $"Assert.NotEqual({{{{ ExpectedParameter }}}}, {{{{ TestedValue }}}});";
|
|
81
|
+
|
|
82
|
+
return TemplateRenderer.RenderInline(template, testMethodBody.AssertTemplateParameters);
|
|
83
|
+
}
|
|
68
84
|
}
|
|
69
85
|
}
|
|
@@ -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 NucleotideCount : Exercise
|
|
9
|
+
{
|
|
10
|
+
protected override void UpdateCanonicalData(CanonicalData canonicalData)
|
|
11
|
+
{
|
|
12
|
+
foreach (var canonicalDataCase in canonicalData.Cases)
|
|
13
|
+
{
|
|
14
|
+
if (!((Dictionary<string, object>)canonicalDataCase.Expected).ContainsKey("error"))
|
|
15
|
+
{
|
|
16
|
+
canonicalDataCase.UseVariableForExpected = true;
|
|
17
|
+
canonicalDataCase.SetConstructorInputParameters("strand");
|
|
18
|
+
canonicalDataCase.Expected = ConvertExpected(canonicalDataCase.Expected);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
private static dynamic ConvertExpected(dynamic expected)
|
|
24
|
+
=> ((Dictionary<string, object>)expected).ToDictionary(kv => kv.Key[0], kv => int.Parse($"{kv.Value}"));
|
|
25
|
+
|
|
26
|
+
protected override HashSet<string> AddAdditionalNamespaces() => new HashSet<string>() { typeof(Dictionary<char, int>).Namespace };
|
|
27
|
+
|
|
28
|
+
protected override string RenderTestMethodBodyAssert(TestMethodBody testMethodBody)
|
|
29
|
+
{
|
|
30
|
+
if (testMethodBody.UseVariableForExpected)
|
|
31
|
+
{
|
|
32
|
+
return RenderEqualBodyAssert(testMethodBody);
|
|
33
|
+
}
|
|
34
|
+
return RenderThrowsBodyAssert(testMethodBody);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
private string RenderEqualBodyAssert(TestMethodBody testMethodBody)
|
|
38
|
+
{
|
|
39
|
+
const string template = @"Assert.Equal(expected, sut.{{ TestedMethodName }});";
|
|
40
|
+
|
|
41
|
+
var templateParameters = new
|
|
42
|
+
{
|
|
43
|
+
TestedMethodName = testMethodBody.CanonicalDataCase.Property.ToTestedMethodName()
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
return TemplateRenderer.RenderInline(template, templateParameters);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
private string RenderThrowsBodyAssert(TestMethodBody testMethodBody)
|
|
50
|
+
{
|
|
51
|
+
const string template = @"Assert.Throws<InvalidNucleotideException>(() => new NucleotideCount(""{{ Input }}""));";
|
|
52
|
+
|
|
53
|
+
var templateParameters = new
|
|
54
|
+
{
|
|
55
|
+
Input = testMethodBody.CanonicalDataCase.Input["strand"]
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
return TemplateRenderer.RenderInline(template, templateParameters);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
using System.Collections.Generic;
|
|
2
|
+
using Generators.Input;
|
|
3
|
+
using Generators.Output;
|
|
4
|
+
|
|
5
|
+
namespace Generators.Exercises
|
|
6
|
+
{
|
|
7
|
+
public class Tournament : Exercise
|
|
8
|
+
{
|
|
9
|
+
protected override void UpdateCanonicalData(CanonicalData canonicalData)
|
|
10
|
+
{
|
|
11
|
+
foreach (var canonicalDataCase in canonicalData.Cases)
|
|
12
|
+
{
|
|
13
|
+
canonicalDataCase.TestedMethodType = TestedMethodType.Static;
|
|
14
|
+
canonicalDataCase.UseVariablesForInput = true;
|
|
15
|
+
canonicalDataCase.UseVariableForExpected = true;
|
|
16
|
+
canonicalDataCase.Properties["input"] = ToMultiLineString(canonicalDataCase.Properties["input"]);
|
|
17
|
+
canonicalDataCase.Expected = ToMultiLineString(canonicalDataCase.Expected);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
protected override HashSet<string> AddAdditionalNamespaces()
|
|
22
|
+
{
|
|
23
|
+
return new HashSet<string>
|
|
24
|
+
{
|
|
25
|
+
typeof(System.String).Namespace,
|
|
26
|
+
typeof(System.IO.Stream).Namespace,
|
|
27
|
+
typeof(System.Text.UTF8Encoding).Namespace
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
protected override string RenderTestMethodBodyAssert(TestMethodBody testMethodBody)
|
|
32
|
+
{
|
|
33
|
+
string template = @"Assert.Equal(expected, RunTally(input).Trim());";
|
|
34
|
+
return TemplateRenderer.RenderInline(template, new { });
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
private UnescapedValue ToMultiLineString(string[] input)
|
|
38
|
+
{
|
|
39
|
+
const string template = @"{% if input.size == 0 %}string.Empty{% else %}{% for item in {{input}} %}{% if forloop.length == 1 %}""{{item}}""{% break %}{% endif %}""{{item}}""{% if forloop.last == false %} + Environment.NewLine +{% endif %}
|
|
40
|
+
{% endfor %}.Trim(){% endif %}";
|
|
41
|
+
|
|
42
|
+
return new UnescapedValue(TemplateRenderer.RenderInline(template, new { input }));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
protected override string[] RenderAdditionalMethods()
|
|
46
|
+
{
|
|
47
|
+
var methods = @"
|
|
48
|
+
private string RunTally(string input)
|
|
49
|
+
{
|
|
50
|
+
var encoding = new UTF8Encoding();
|
|
51
|
+
|
|
52
|
+
using (var inStream = new MemoryStream(encoding.GetBytes(input)))
|
|
53
|
+
{
|
|
54
|
+
using (var outStream = new MemoryStream())
|
|
55
|
+
{
|
|
56
|
+
Tournament.Tally(inStream, outStream);
|
|
57
|
+
return encoding.GetString(outStream.ToArray());
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}";
|
|
61
|
+
return methods.Split("", System.StringSplitOptions.None);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
using System.Collections;
|
|
2
|
+
using System.Collections.Generic;
|
|
3
|
+
using Generators.Input;
|
|
4
|
+
using Generators.Output;
|
|
5
|
+
namespace Generators.Exercises
|
|
6
|
+
{
|
|
7
|
+
public class Triangle : Exercise
|
|
8
|
+
{
|
|
9
|
+
protected override void UpdateCanonicalData(CanonicalData canonicalData)
|
|
10
|
+
{
|
|
11
|
+
foreach (var data in canonicalData.Cases)
|
|
12
|
+
{
|
|
13
|
+
if (data.Property == "equilateral")
|
|
14
|
+
data.Property = "IsEquilateral";
|
|
15
|
+
else if (data.Property == "isosceles")
|
|
16
|
+
data.Property = "IsIsosceles";
|
|
17
|
+
else if (data.Property == "scalene")
|
|
18
|
+
data.Property = "IsScalene";
|
|
19
|
+
|
|
20
|
+
data.Properties["sides"] = SplitArrayToValues(data.Properties["sides"]);
|
|
21
|
+
data.SetInputParameters("sides");
|
|
22
|
+
data.UseFullDescriptionPath = true;
|
|
23
|
+
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
private UnescapedValue SplitArrayToValues(IEnumerable input)
|
|
28
|
+
{
|
|
29
|
+
const string template = "{% for item in {{input}} %}{{item}}{% if forloop.last == false %},{% endif %}{% endfor %}";
|
|
30
|
+
|
|
31
|
+
return new UnescapedValue(TemplateRenderer.RenderInline(template, new { input }));
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
}
|
|
36
|
+
}
|
data/tracks/dart/config.json
CHANGED
|
@@ -76,6 +76,19 @@
|
|
|
76
76
|
"unlocked_by": "hamming",
|
|
77
77
|
"uuid": "0c0511fd-59aa-4480-a7cd-4de0e9303b86"
|
|
78
78
|
},
|
|
79
|
+
{
|
|
80
|
+
"core": true,
|
|
81
|
+
"difficulty": 2,
|
|
82
|
+
"slug": "raindrops",
|
|
83
|
+
"topics": [
|
|
84
|
+
"control_flow_conditionals",
|
|
85
|
+
"equality",
|
|
86
|
+
"mathematics",
|
|
87
|
+
"strings"
|
|
88
|
+
],
|
|
89
|
+
"unlocked_by": "gigasecond",
|
|
90
|
+
"uuid": "d6657d4a-0257-0c80-6667-fddd127a571f0ad1fd4"
|
|
91
|
+
},
|
|
79
92
|
{
|
|
80
93
|
"core": true,
|
|
81
94
|
"difficulty": 3,
|
|
@@ -84,7 +97,7 @@
|
|
|
84
97
|
"strings",
|
|
85
98
|
"transforming"
|
|
86
99
|
],
|
|
87
|
-
"unlocked_by": "
|
|
100
|
+
"unlocked_by": "raindrops",
|
|
88
101
|
"uuid": "99147c39-e8d3-4166-9215-c47fb4832781"
|
|
89
102
|
},
|
|
90
103
|
{
|
|
@@ -97,7 +110,7 @@
|
|
|
97
110
|
"equality",
|
|
98
111
|
"strings"
|
|
99
112
|
],
|
|
100
|
-
"unlocked_by":
|
|
113
|
+
"unlocked_by": "rna-transcription",
|
|
101
114
|
"uuid": "6e811b53-4eb1-40f9-a811-b5113d68ae8a"
|
|
102
115
|
}
|
|
103
116
|
],
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
class Raindrops {
|
|
2
|
+
String convert(int i) {
|
|
3
|
+
bool isDiv(int divisor) {
|
|
4
|
+
return i % divisor == 0;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
String out = "";
|
|
8
|
+
if (isDiv(3)) {
|
|
9
|
+
out += "Pling";
|
|
10
|
+
}
|
|
11
|
+
if (isDiv(5)) {
|
|
12
|
+
out += "Plang";
|
|
13
|
+
}
|
|
14
|
+
if (isDiv(7)) {
|
|
15
|
+
out += "Plong";
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (out == "") {
|
|
19
|
+
out = i.toString();
|
|
20
|
+
}
|
|
21
|
+
return out;
|
|
22
|
+
}
|
|
23
|
+
}
|