trackler 2.2.1.54 → 2.2.1.55
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/dominoes/description.md +3 -3
- data/problem-specifications/exercises/two-fer/description.md +0 -28
- data/tracks/c/config.json +12 -0
- data/tracks/c/exercises/queen-attack/README.md +65 -0
- data/tracks/c/exercises/queen-attack/makefile +15 -0
- data/tracks/c/exercises/queen-attack/src/example.c +25 -0
- data/tracks/c/exercises/queen-attack/src/queen_attack.h +19 -0
- data/tracks/c/exercises/queen-attack/test/test_queen_attack.c +190 -0
- data/tracks/c/exercises/queen-attack/test/vendor/unity.c +1300 -0
- data/tracks/c/exercises/queen-attack/test/vendor/unity.h +274 -0
- data/tracks/c/exercises/queen-attack/test/vendor/unity_internals.h +701 -0
- data/tracks/common-lisp/exercises/acronym/README.md +1 -1
- data/tracks/delphi/exercises/two-fer/README.md +0 -28
- data/tracks/ecmascript/config.json +41 -0
- data/tracks/ecmascript/exercises/accumulate/package.json +5 -3
- data/tracks/ecmascript/exercises/acronym/package.json +5 -3
- data/tracks/ecmascript/exercises/all-your-base/package.json +5 -3
- data/tracks/ecmascript/exercises/allergies/package.json +5 -3
- data/tracks/ecmascript/exercises/alphametics/package.json +5 -3
- data/tracks/ecmascript/exercises/anagram/package.json +5 -3
- data/tracks/ecmascript/exercises/atbash-cipher/package.json +5 -3
- data/tracks/ecmascript/exercises/beer-song/package.json +5 -3
- data/tracks/ecmascript/exercises/binary-search-tree/package.json +5 -3
- data/tracks/ecmascript/exercises/binary-search/package.json +5 -3
- data/tracks/ecmascript/exercises/binary/package.json +5 -3
- data/tracks/ecmascript/exercises/bob/package.json +5 -3
- data/tracks/ecmascript/exercises/bowling/package.json +2 -2
- data/tracks/ecmascript/exercises/bracket-push/package.json +5 -3
- data/tracks/ecmascript/exercises/change/README.md +44 -0
- data/tracks/ecmascript/exercises/change/change.spec.js +80 -0
- data/tracks/ecmascript/exercises/change/example.js +120 -0
- data/tracks/ecmascript/exercises/change/package.json +69 -0
- data/tracks/ecmascript/exercises/circular-buffer/package.json +5 -3
- data/tracks/ecmascript/exercises/clock/package.json +5 -3
- data/tracks/ecmascript/exercises/collatz-conjecture/package.json +6 -4
- data/tracks/ecmascript/exercises/connect/package.json +5 -3
- data/tracks/ecmascript/exercises/crypto-square/package.json +5 -3
- data/tracks/ecmascript/exercises/custom-set/package.json +5 -3
- data/tracks/ecmascript/exercises/diamond/package.json +5 -3
- data/tracks/ecmascript/exercises/difference-of-squares/package.json +5 -3
- data/tracks/ecmascript/exercises/diffie-hellman/package.json +5 -3
- data/tracks/ecmascript/exercises/etl/package.json +5 -3
- data/tracks/ecmascript/exercises/flatten-array/package.json +5 -3
- data/tracks/ecmascript/exercises/food-chain/package.json +5 -3
- data/tracks/ecmascript/exercises/gigasecond/package.json +5 -3
- data/tracks/ecmascript/exercises/grade-school/package.json +5 -3
- data/tracks/ecmascript/exercises/grains/package.json +5 -3
- data/tracks/ecmascript/exercises/hamming/package.json +5 -3
- data/tracks/ecmascript/exercises/hello-world/package.json +5 -3
- data/tracks/ecmascript/exercises/hexadecimal/package.json +5 -3
- data/tracks/ecmascript/exercises/isbn-verifier/README.md +62 -0
- data/tracks/ecmascript/exercises/isbn-verifier/example.js +17 -0
- data/tracks/ecmascript/exercises/isbn-verifier/isbn-verifier.spec.js +81 -0
- data/tracks/ecmascript/exercises/isbn-verifier/package.json +71 -0
- data/tracks/ecmascript/exercises/isogram/package.json +5 -3
- data/tracks/ecmascript/exercises/kindergarten-garden/package.json +5 -3
- data/tracks/ecmascript/exercises/largest-series-product/package.json +5 -3
- data/tracks/ecmascript/exercises/leap/package.json +5 -3
- data/tracks/ecmascript/exercises/linked-list/package.json +5 -3
- data/tracks/ecmascript/exercises/list-ops/package.json +5 -3
- data/tracks/ecmascript/exercises/luhn/package.json +5 -3
- data/tracks/ecmascript/exercises/matrix/package.json +5 -3
- data/tracks/ecmascript/exercises/meetup/package.json +5 -3
- data/tracks/ecmascript/exercises/minesweeper/package.json +5 -3
- data/tracks/ecmascript/exercises/nth-prime/package.json +5 -3
- data/tracks/ecmascript/exercises/ocr-numbers/package.json +5 -3
- data/tracks/ecmascript/exercises/octal/package.json +5 -3
- data/tracks/ecmascript/exercises/palindrome-products/package.json +5 -3
- data/tracks/ecmascript/exercises/pangram/package.json +5 -3
- data/tracks/ecmascript/exercises/pascals-triangle/package.json +5 -3
- data/tracks/ecmascript/exercises/perfect-numbers/package.json +5 -3
- data/tracks/ecmascript/exercises/phone-number/package.json +5 -3
- data/tracks/ecmascript/exercises/pig-latin/package.json +5 -3
- data/tracks/ecmascript/exercises/prime-factors/package.json +5 -3
- data/tracks/ecmascript/exercises/proverb/package.json +5 -3
- data/tracks/ecmascript/exercises/pythagorean-triplet/package.json +5 -3
- data/tracks/ecmascript/exercises/queen-attack/package.json +5 -3
- data/tracks/ecmascript/exercises/raindrops/package.json +5 -3
- data/tracks/ecmascript/exercises/rna-transcription/package.json +5 -3
- data/tracks/ecmascript/exercises/robot-name/package.json +5 -3
- data/tracks/ecmascript/exercises/robot-simulator/package.json +5 -3
- data/tracks/ecmascript/exercises/roman-numerals/package.json +5 -3
- data/tracks/ecmascript/exercises/run-length-encoding/package.json +5 -3
- data/tracks/ecmascript/exercises/saddle-points/package.json +5 -3
- data/tracks/ecmascript/exercises/say/package.json +5 -3
- data/tracks/ecmascript/exercises/scrabble-score/package.json +5 -3
- data/tracks/ecmascript/exercises/secret-handshake/package.json +5 -3
- data/tracks/ecmascript/exercises/series/package.json +5 -3
- data/tracks/ecmascript/exercises/sieve/package.json +5 -3
- data/tracks/ecmascript/exercises/simple-cipher/package.json +5 -3
- data/tracks/ecmascript/exercises/simple-linked-list/package.json +5 -3
- data/tracks/ecmascript/exercises/space-age/package.json +5 -3
- data/tracks/ecmascript/exercises/strain/package.json +5 -3
- data/tracks/ecmascript/exercises/sublist/package.json +5 -3
- data/tracks/ecmascript/exercises/sum-of-multiples/package.json +5 -3
- data/tracks/ecmascript/exercises/transpose/README.md +94 -0
- data/tracks/ecmascript/exercises/transpose/example.js +12 -0
- data/tracks/ecmascript/exercises/transpose/package.json +71 -0
- data/tracks/ecmascript/exercises/transpose/transpose.spec.js +67 -0
- data/tracks/ecmascript/exercises/triangle/package.json +5 -3
- data/tracks/ecmascript/exercises/trinary/package.json +5 -3
- data/tracks/ecmascript/exercises/twelve-days/package.json +5 -3
- data/tracks/ecmascript/exercises/two-bucket/package.json +5 -3
- data/tracks/ecmascript/exercises/two-fer/package.json +5 -3
- data/tracks/ecmascript/exercises/word-count/package.json +5 -3
- data/tracks/ecmascript/exercises/word-search/package.json +5 -3
- data/tracks/ecmascript/exercises/wordy/package.json +5 -3
- data/tracks/ecmascript/package-lock.json +6219 -0
- data/tracks/ecmascript/package.json +5 -3
- data/tracks/erlang/exercises/collatz-conjecture/src/collatz_conjecture.erl +3 -4
- data/tracks/erlang/exercises/collatz-conjecture/src/example.erl +3 -3
- data/tracks/erlang/exercises/collatz-conjecture/test/collatz_conjecture_tests.erl +13 -9
- data/tracks/erlang/exercises/hello-world/src/hello_world.erl +2 -2
- data/tracks/erlang/exercises/leap/src/example.erl +1 -1
- data/tracks/erlang/exercises/leap/src/leap.erl +3 -3
- data/tracks/erlang/exercises/leap/test/leap_tests.erl +9 -9
- data/tracks/erlang/testgen/src/testgen.erl +16 -13
- data/tracks/erlang/testgen/src/tgen.erl +65 -38
- data/tracks/erlang/testgen/src/tgen_collatz-conjecture.erl +38 -0
- data/tracks/erlang/testgen/src/tgen_hello-world.erl +11 -19
- data/tracks/erlang/testgen/src/tgen_leap.erl +31 -0
- data/tracks/erlang/testgen/src/tgs.erl +80 -0
- data/tracks/fsharp/exercises/alphametics/AlphameticsTest.fs +78 -23
- data/tracks/fsharp/exercises/anagram/AnagramTest.fs +66 -34
- data/tracks/fsharp/exercises/connect/ConnectTest.fs +81 -68
- data/tracks/fsharp/exercises/connect/Example.fs +9 -5
- data/tracks/fsharp/exercises/food-chain/Example.fs +5 -9
- data/tracks/fsharp/exercises/food-chain/FoodChain.fs +2 -2
- data/tracks/fsharp/exercises/food-chain/FoodChainTest.fs +143 -75
- data/tracks/fsharp/exercises/hamming/Example.fs +8 -4
- data/tracks/fsharp/exercises/hamming/Hamming.fs +1 -1
- data/tracks/fsharp/exercises/hamming/HammingTest.fs +53 -13
- data/tracks/fsharp/exercises/house/Example.fs +5 -6
- data/tracks/fsharp/exercises/house/House.fs +3 -1
- data/tracks/fsharp/exercises/house/HouseTest.fs +272 -96
- data/tracks/fsharp/exercises/meetup/Example.fs +1 -1
- data/tracks/fsharp/exercises/meetup/Meetup.fs +1 -1
- data/tracks/fsharp/exercises/meetup/MeetupTest.fs +384 -73
- data/tracks/fsharp/exercises/ocr-numbers/Example.fs +43 -35
- data/tracks/fsharp/exercises/ocr-numbers/OcrNumbersTest.fs +160 -125
- data/tracks/fsharp/exercises/two-fer/Example.fs +4 -2
- data/tracks/fsharp/exercises/two-fer/TwoFer.fs +1 -1
- data/tracks/fsharp/exercises/two-fer/TwoFerTest.fs +7 -4
- data/tracks/fsharp/generators/Common.fs +6 -2
- data/tracks/fsharp/generators/Exercise.fs +14 -13
- data/tracks/fsharp/generators/Generators.fs +145 -2
- data/tracks/fsharp/generators/Options.fs +4 -6
- data/tracks/fsharp/generators/Output.fs +2 -2
- data/tracks/fsharp/generators/Program.fs +4 -3
- data/tracks/java/exercises/saddle-points/README.md +1 -1
- data/tracks/java/exercises/two-fer/README.md +0 -28
- data/tracks/javascript/exercises/beer-song/example.js +18 -14
- data/tracks/kotlin/exercises/saddle-points/README.md +1 -1
- data/tracks/kotlin/exercises/two-fer/README.md +0 -28
- data/tracks/lua/config.json +12 -0
- data/tracks/lua/exercises/collatz-conjecture/README.md +43 -0
- data/tracks/lua/exercises/collatz-conjecture/collatz-conjecture_spec.lua +33 -0
- data/tracks/lua/exercises/collatz-conjecture/example.lua +16 -0
- data/tracks/python/config.json +4 -1
- data/tracks/python/exercises/binary-search/binary_search_test.py +2 -0
- data/tracks/python/exercises/change/change_test.py +2 -0
- data/tracks/python/exercises/circular-buffer/circular_buffer_test.py +56 -50
- data/tracks/python/exercises/forth/example.py +3 -1
- data/tracks/python/exercises/forth/forth_test.py +43 -26
- data/tracks/python/exercises/nth-prime/nth_prime.py +1 -1
- data/tracks/python/exercises/rna-transcription/README.md +5 -0
- data/tracks/python/exercises/rna-transcription/example.py +1 -1
- data/tracks/python/exercises/rna-transcription/rna_transcription_test.py +7 -4
- data/tracks/python/exercises/robot-simulator/robot_simulator_test.py +9 -7
- data/tracks/python/exercises/saddle-points/saddle_points_test.py +15 -5
- data/tracks/python/exercises/simple-cipher/simple_cipher.py +7 -1
- data/tracks/python/exercises/word-count/example.py +6 -4
- data/tracks/python/exercises/word-count/word_count_test.py +49 -22
- data/tracks/python/exercises/word-search/word_search_test.py +104 -12
- data/tracks/rust/.travis.yml +2 -0
- data/tracks/rust/README.md +5 -0
- data/tracks/rust/_test/check-exercises.sh +0 -6
- data/tracks/rust/_test/ensure-lib-src-rs-exist.sh +19 -0
- data/tracks/rust/_test/ensure-stubs-compile.sh +26 -0
- data/tracks/rust/config.json +12 -0
- data/tracks/rust/config/exercise-readme-insert.md +3 -2
- data/tracks/rust/docs/ABOUT.md +2 -2
- data/tracks/rust/docs/LEARNING.md +1 -1
- data/tracks/rust/docs/RESOURCES.md +1 -1
- data/tracks/rust/docs/TESTS.md +2 -2
- data/tracks/rust/exercises/accumulate/README.md +3 -2
- data/tracks/rust/exercises/acronym/README.md +3 -2
- data/tracks/rust/exercises/all-your-base/README.md +3 -2
- data/tracks/rust/exercises/allergies/README.md +3 -2
- data/tracks/rust/exercises/alphametics/README.md +3 -2
- data/tracks/rust/exercises/anagram/README.md +3 -2
- data/tracks/rust/exercises/atbash-cipher/README.md +3 -2
- data/tracks/rust/exercises/beer-song/README.md +3 -2
- data/tracks/rust/exercises/beer-song/src/lib.rs +2 -2
- data/tracks/rust/exercises/binary-search/README.md +3 -2
- data/tracks/rust/exercises/bob/README.md +3 -2
- data/tracks/rust/exercises/bob/src/lib.rs +1 -1
- data/tracks/rust/exercises/bowling/README.md +3 -2
- data/tracks/rust/exercises/bracket-push/HINTS.md +1 -1
- data/tracks/rust/exercises/bracket-push/README.md +4 -3
- data/tracks/rust/exercises/circular-buffer/README.md +3 -2
- data/tracks/rust/exercises/clock/README.md +3 -2
- data/tracks/rust/exercises/collatz-conjecture/README.md +3 -2
- data/tracks/rust/exercises/collatz-conjecture/src/lib.rs +1 -1
- data/tracks/rust/exercises/crypto-square/README.md +3 -2
- data/tracks/rust/exercises/custom-set/README.md +3 -2
- data/tracks/rust/exercises/decimal/.meta/ALLOWED_TO_NOT_COMPILE +2 -0
- data/tracks/rust/exercises/decimal/README.md +3 -2
- data/tracks/rust/exercises/difference-of-squares/README.md +3 -2
- data/tracks/rust/exercises/difference-of-squares/src/lib.rs +3 -3
- data/tracks/rust/exercises/dominoes/README.md +3 -2
- data/tracks/rust/exercises/etl/README.md +3 -2
- data/tracks/rust/exercises/forth/README.md +3 -2
- data/tracks/rust/exercises/forth/src/lib.rs +3 -0
- data/tracks/rust/exercises/gigasecond/README.md +3 -2
- data/tracks/rust/exercises/grade-school/README.md +3 -2
- data/tracks/rust/exercises/grains/README.md +3 -2
- data/tracks/rust/exercises/hamming/README.md +3 -2
- data/tracks/rust/exercises/hello-world/GETTING_STARTED.md +1 -1
- data/tracks/rust/exercises/hello-world/README.md +3 -2
- data/tracks/rust/exercises/hexadecimal/README.md +3 -2
- data/tracks/rust/exercises/isogram/.gitignore +8 -0
- data/tracks/rust/exercises/isogram/Cargo.toml +3 -0
- data/tracks/rust/exercises/isogram/README.md +52 -0
- data/tracks/rust/exercises/isogram/example.rs +12 -0
- data/tracks/rust/exercises/isogram/src/lib.rs +0 -0
- data/tracks/rust/exercises/isogram/tests/isogram.rs +72 -0
- data/tracks/rust/exercises/largest-series-product/README.md +3 -2
- data/tracks/rust/exercises/leap/README.md +3 -2
- data/tracks/rust/exercises/leap/src/lib.rs +1 -1
- data/tracks/rust/exercises/luhn-from/README.md +3 -2
- data/tracks/rust/exercises/luhn-trait/.meta/description.md +2 -2
- data/tracks/rust/exercises/luhn-trait/README.md +5 -4
- data/tracks/rust/exercises/luhn/README.md +3 -2
- data/tracks/rust/exercises/minesweeper/README.md +3 -2
- data/tracks/rust/exercises/nth-prime/README.md +3 -2
- data/tracks/rust/exercises/nucleotide-codons/README.md +3 -2
- data/tracks/rust/exercises/nucleotide-count/README.md +3 -2
- data/tracks/rust/exercises/ocr-numbers/README.md +3 -2
- data/tracks/rust/exercises/pangram/README.md +3 -2
- data/tracks/rust/exercises/parallel-letter-frequency/HINTS.md +1 -1
- data/tracks/rust/exercises/parallel-letter-frequency/README.md +4 -3
- data/tracks/rust/exercises/pascals-triangle/README.md +3 -2
- data/tracks/rust/exercises/perfect-numbers/README.md +3 -2
- data/tracks/rust/exercises/phone-number/README.md +3 -2
- data/tracks/rust/exercises/pig-latin/README.md +3 -2
- data/tracks/rust/exercises/poker/README.md +3 -2
- data/tracks/rust/exercises/prime-factors/README.md +3 -2
- data/tracks/rust/exercises/protein-translation/README.md +3 -2
- data/tracks/rust/exercises/proverb/README.md +3 -2
- data/tracks/rust/exercises/proverb/src/lib.rs +1 -1
- data/tracks/rust/exercises/pythagorean-triplet/README.md +3 -2
- data/tracks/rust/exercises/queen-attack/README.md +3 -2
- data/tracks/rust/exercises/raindrops/README.md +3 -2
- data/tracks/rust/exercises/raindrops/src/lib.rs +1 -1
- data/tracks/rust/exercises/react/README.md +3 -2
- data/tracks/rust/exercises/rectangles/README.md +3 -2
- data/tracks/rust/exercises/rna-transcription/README.md +3 -2
- data/tracks/rust/exercises/robot-name/README.md +3 -2
- data/tracks/rust/exercises/robot-simulator/README.md +3 -2
- data/tracks/rust/exercises/roman-numerals/README.md +3 -2
- data/tracks/rust/exercises/rotational-cipher/README.md +3 -2
- data/tracks/rust/exercises/run-length-encoding/README.md +3 -2
- data/tracks/rust/exercises/say/README.md +3 -2
- data/tracks/rust/exercises/scrabble-score/README.md +3 -2
- data/tracks/rust/exercises/sieve/README.md +3 -2
- data/tracks/rust/exercises/space-age/README.md +3 -2
- data/tracks/rust/exercises/sublist/README.md +3 -2
- data/tracks/rust/exercises/sum-of-multiples/README.md +3 -2
- data/tracks/rust/exercises/sum-of-multiples/src/lib.rs +1 -1
- data/tracks/rust/exercises/tournament/README.md +3 -2
- data/tracks/rust/exercises/triangle/HINTS.md +2 -2
- data/tracks/rust/exercises/triangle/README.md +5 -4
- data/tracks/rust/exercises/variable-length-quantity/README.md +3 -2
- data/tracks/rust/exercises/word-count/README.md +3 -2
- data/tracks/rust/exercises/wordy/README.md +3 -2
- metadata +38 -3
- data/tracks/ecmascript/yarn.lock +0 -3144
@@ -1,18 +1,21 @@
|
|
1
|
+
// This file was auto-generated based on version 1.1.0 of the canonical data.
|
2
|
+
|
1
3
|
module TwoFerTest
|
2
4
|
|
3
|
-
open Xunit
|
4
5
|
open FsUnit.Xunit
|
6
|
+
open Xunit
|
5
7
|
|
6
8
|
open TwoFer
|
7
9
|
|
8
10
|
[<Fact>]
|
9
11
|
let ``No name given`` () =
|
10
|
-
|
12
|
+
name None |> should equal "One for you, one for me."
|
11
13
|
|
12
14
|
[<Fact(Skip = "Remove to run test")>]
|
13
15
|
let ``A name given`` () =
|
14
|
-
|
16
|
+
name (Some "Alice") |> should equal "One for Alice, one for me."
|
15
17
|
|
16
18
|
[<Fact(Skip = "Remove to run test")>]
|
17
19
|
let ``Another name given`` () =
|
18
|
-
|
20
|
+
name (Some "Bob") |> should equal "One for Bob, one for me."
|
21
|
+
|
@@ -2,7 +2,6 @@
|
|
2
2
|
module Generators.Common
|
3
3
|
|
4
4
|
open System
|
5
|
-
open System.IO
|
6
5
|
open Serilog
|
7
6
|
open Newtonsoft.Json.Linq
|
8
7
|
|
@@ -55,7 +54,7 @@ module Option =
|
|
55
54
|
match value with
|
56
55
|
| :? int64 as i -> if i < 0L then None else Some value
|
57
56
|
| :? int32 as i -> if i < 0 then None else Some value
|
58
|
-
| _ ->
|
57
|
+
| _ -> Some value
|
59
58
|
|
60
59
|
let ofNonFalse (value: obj) =
|
61
60
|
match value with
|
@@ -67,6 +66,11 @@ module Option =
|
|
67
66
|
| :? JToken as jToken when not (isNull jToken.["error"]) -> None
|
68
67
|
| _ -> Some value
|
69
68
|
|
69
|
+
let ofNonEmptyString (value: string) =
|
70
|
+
match String.IsNullOrEmpty value with
|
71
|
+
| true -> None
|
72
|
+
| false -> Some value
|
73
|
+
|
70
74
|
module String =
|
71
75
|
open Humanizer
|
72
76
|
|
@@ -1,14 +1,11 @@
|
|
1
1
|
module Generators.Exercise
|
2
2
|
|
3
3
|
open System
|
4
|
-
open System.Globalization
|
5
|
-
open System.Collections.Generic
|
6
4
|
open System.IO
|
7
5
|
open System.Reflection
|
8
6
|
open Newtonsoft.Json.Linq
|
9
7
|
open Humanizer
|
10
8
|
open Serilog
|
11
|
-
open Input
|
12
9
|
open Output
|
13
10
|
|
14
11
|
[<AbstractClass>]
|
@@ -16,6 +13,7 @@ type Exercise() =
|
|
16
13
|
// Allow changes in canonical data
|
17
14
|
abstract member MapCanonicalData : CanonicalData -> CanonicalData
|
18
15
|
abstract member MapCanonicalDataCase : CanonicalDataCase -> CanonicalDataCase
|
16
|
+
abstract member MapCanonicalDataCaseProperties : CanonicalDataCase * Map<string, obj> -> Map<string, obj>
|
19
17
|
abstract member MapCanonicalDataCaseProperty : CanonicalDataCase * string * obj -> obj
|
20
18
|
|
21
19
|
// Convert canonical data to representation used when rendering
|
@@ -81,11 +79,12 @@ type Exercise() =
|
|
81
79
|
{ canonicalData with Cases = List.map this.MapCanonicalDataCase canonicalData.Cases }
|
82
80
|
|
83
81
|
default this.MapCanonicalDataCase canonicalDataCase =
|
84
|
-
|
85
|
-
canonicalDataCase.Properties
|
86
|
-
|> Map.map (fun key value -> this.MapCanonicalDataCaseProperty (canonicalDataCase, key, value))
|
82
|
+
{ canonicalDataCase with
|
83
|
+
Properties = this.MapCanonicalDataCaseProperties (canonicalDataCase, canonicalDataCase.Properties) }
|
87
84
|
|
88
|
-
|
85
|
+
default this.MapCanonicalDataCaseProperties (canonicalDataCase, properties) =
|
86
|
+
properties
|
87
|
+
|> Map.map (fun key value -> this.MapCanonicalDataCaseProperty (canonicalDataCase, key, value))
|
89
88
|
|
90
89
|
default this.MapCanonicalDataCaseProperty (canonicalDataCase, key, value) = value
|
91
90
|
|
@@ -234,17 +233,19 @@ type Exercise() =
|
|
234
233
|
|
235
234
|
default this.AdditionalNamespaces = []
|
236
235
|
|
237
|
-
let createExercises
|
236
|
+
let createExercises filteredExercise =
|
238
237
|
|
239
238
|
let isConcreteExercise (exerciseType: Type) =
|
240
239
|
not exerciseType.IsAbstract && typeof<Exercise>.IsAssignableFrom(exerciseType)
|
241
240
|
|
242
|
-
let
|
243
|
-
|
244
|
-
|
245
|
-
Seq.exists (String.equals (exerciseType.Name.Kebaberize())) filteredExercises
|
241
|
+
let isFilteredExercise exercise (exerciseType: Type) =
|
242
|
+
String.equals exercise exerciseType.Name ||
|
243
|
+
String.equals exercise (exerciseType.Name.Kebaberize())
|
246
244
|
|
247
|
-
let includeExercise (exerciseType: Type) =
|
245
|
+
let includeExercise (exerciseType: Type) =
|
246
|
+
match filteredExercise with
|
247
|
+
| None -> isConcreteExercise exerciseType
|
248
|
+
| Some exercise -> isConcreteExercise exerciseType && isFilteredExercise exercise exerciseType
|
248
249
|
|
249
250
|
let assemblyTypes = Assembly.GetEntryAssembly().GetTypes()
|
250
251
|
|
@@ -2,7 +2,6 @@ module Generators.Generators
|
|
2
2
|
|
3
3
|
open System
|
4
4
|
open System.Globalization
|
5
|
-
open Humanizer
|
6
5
|
open Newtonsoft.Json.Linq
|
7
6
|
open Output
|
8
7
|
open Exercise
|
@@ -56,6 +55,34 @@ type Allergies() =
|
|
56
55
|
| "substance" -> string value
|
57
56
|
| _ -> base.RenderInput (canonicalDataCase, key, value)
|
58
57
|
|
58
|
+
type Alphametics() =
|
59
|
+
inherit Exercise()
|
60
|
+
|
61
|
+
member this.formatMap<'TKey, 'TValue> (value: obj) =
|
62
|
+
if isNull value then
|
63
|
+
"None"
|
64
|
+
else
|
65
|
+
let input = value :?> JObject
|
66
|
+
let dict = input.ToObject<Collections.Generic.Dictionary<'TKey, 'TValue>>();
|
67
|
+
let formattedList =
|
68
|
+
dict
|
69
|
+
|> Seq.map (fun kv -> formatTuple (kv.Key, kv.Value))
|
70
|
+
|> formatMultiLineList
|
71
|
+
|
72
|
+
if (formattedList.Contains("\n")) then
|
73
|
+
sprintf "%s\n%s\n%s" formattedList (indent 2 "|> Map.ofList") (indent 2 "|> Some")
|
74
|
+
else
|
75
|
+
sprintf "%s |> Map.ofList |> Some" formattedList
|
76
|
+
|
77
|
+
override this.RenderExpected (canonicalDataCase, key, value) = this.formatMap<char, int> value
|
78
|
+
|
79
|
+
override this.PropertiesWithIdentifier canonicalDataCase = this.Properties canonicalDataCase
|
80
|
+
|
81
|
+
type Anagram() =
|
82
|
+
inherit Exercise()
|
83
|
+
|
84
|
+
override this.PropertiesWithIdentifier canonicalDataCase = ["candidates"]
|
85
|
+
|
59
86
|
type BeerSong() =
|
60
87
|
inherit Exercise()
|
61
88
|
|
@@ -134,6 +161,25 @@ type Clock() =
|
|
134
161
|
| _ ->
|
135
162
|
base.RenderSut canonicalDataCase
|
136
163
|
|
164
|
+
type Connect() =
|
165
|
+
inherit Exercise()
|
166
|
+
|
167
|
+
override this.RenderExpected (canonicalDataCase, key, value) =
|
168
|
+
match string value with
|
169
|
+
| "O" -> "(Some White)"
|
170
|
+
| "X" -> "(Some Black)"
|
171
|
+
| _ -> "None"
|
172
|
+
|
173
|
+
override this.RenderInput (canonicalDataCase, key, value) =
|
174
|
+
let lines = (value :?> JArray).ToObject<string seq>() |> List.ofSeq
|
175
|
+
let padSize = List.last lines |> String.length
|
176
|
+
|
177
|
+
lines
|
178
|
+
|> List.map (fun line -> line.PadRight(padSize) |> formatValue)
|
179
|
+
|> formatMultiLineList
|
180
|
+
|
181
|
+
override this.PropertiesWithIdentifier canonicalDataCase = this.PropertiesUsedAsSutParameter canonicalDataCase
|
182
|
+
|
137
183
|
type CryptoSquare() =
|
138
184
|
inherit Exercise()
|
139
185
|
|
@@ -155,6 +201,29 @@ type Dominoes() =
|
|
155
201
|
|
156
202
|
override this.PropertiesWithIdentifier canonicalDataCase = this.PropertiesUsedAsSutParameter canonicalDataCase
|
157
203
|
|
204
|
+
type FoodChain() =
|
205
|
+
inherit Exercise()
|
206
|
+
|
207
|
+
let hasMultipleVerses canonicalDataCase = Map.containsKey "end verse" canonicalDataCase.Properties
|
208
|
+
|
209
|
+
override this.RenderSutProperty canonicalDataCase =
|
210
|
+
match hasMultipleVerses canonicalDataCase with
|
211
|
+
| true -> "verses"
|
212
|
+
| false -> "verse"
|
213
|
+
|
214
|
+
override this.PropertiesUsedAsSutParameter canonicalDataCase =
|
215
|
+
match hasMultipleVerses canonicalDataCase with
|
216
|
+
| true -> ["start verse"; "end verse"]
|
217
|
+
| false -> ["start verse"]
|
218
|
+
|
219
|
+
override this.PropertiesWithIdentifier canonicalDataCase = ["expected"]
|
220
|
+
|
221
|
+
override this.RenderExpected (canonicalDataCase, key, value) =
|
222
|
+
(value :?> JArray)
|
223
|
+
|> normalizeJArray
|
224
|
+
|> Seq.map formatValue
|
225
|
+
|> formatMultiLineList
|
226
|
+
|
158
227
|
type Gigasecond() =
|
159
228
|
inherit Exercise()
|
160
229
|
|
@@ -179,9 +248,34 @@ type Grains() =
|
|
179
248
|
| "-1" -> "Error \"Invalid input\""
|
180
249
|
| x -> sprintf "Ok %sUL" x
|
181
250
|
|
251
|
+
type Hamming() =
|
252
|
+
inherit Exercise()
|
253
|
+
|
254
|
+
override this.RenderExpected (canonicalDataCase, key, value) =
|
255
|
+
value
|
256
|
+
|> Option.ofNonError
|
257
|
+
|> formatValue
|
258
|
+
|> parenthesizeOption
|
259
|
+
|
182
260
|
type HelloWorld() =
|
183
261
|
inherit Exercise()
|
184
262
|
|
263
|
+
type House() =
|
264
|
+
inherit Exercise()
|
265
|
+
|
266
|
+
override this.PropertiesUsedAsSutParameter canonicalDataCase =
|
267
|
+
match canonicalDataCase.Property with
|
268
|
+
| "verses" -> ["start verse"; "end verse"]
|
269
|
+
| _ -> base.PropertiesUsedAsSutParameter canonicalDataCase
|
270
|
+
|
271
|
+
override this.PropertiesWithIdentifier canonicalDataCase = ["expected"]
|
272
|
+
|
273
|
+
override this.RenderExpected (canonicalDataCase, key, value) =
|
274
|
+
(value :?> JArray)
|
275
|
+
|> normalizeJArray
|
276
|
+
|> Seq.map formatValue
|
277
|
+
|> formatMultiLineList
|
278
|
+
|
185
279
|
type Isogram() =
|
186
280
|
inherit Exercise()
|
187
281
|
|
@@ -215,6 +309,32 @@ type Leap() =
|
|
215
309
|
|
216
310
|
type Luhn() =
|
217
311
|
inherit Exercise()
|
312
|
+
|
313
|
+
type Meetup() =
|
314
|
+
inherit Exercise()
|
315
|
+
|
316
|
+
override this.RenderExpected (canonicalDataCase, key, value) =
|
317
|
+
let year = canonicalDataCase.Properties.["year"] :?> int64 |> int
|
318
|
+
let month = canonicalDataCase.Properties.["month"] :?> int64 |> int
|
319
|
+
let day = canonicalDataCase.Properties.["dayofmonth"] :?> int64 |> int
|
320
|
+
DateTime(year, month, day) |> formatDateTime |> parenthesize
|
321
|
+
|
322
|
+
override this.RenderInput (canonicalDataCase, key, value) =
|
323
|
+
match key with
|
324
|
+
| "dayofweek" ->
|
325
|
+
sprintf "DayOfWeek.%s" (string canonicalDataCase.Properties.["dayofweek"])
|
326
|
+
| "week" ->
|
327
|
+
sprintf "Schedule.%s" (string canonicalDataCase.Properties.["week"] |> String.upperCaseFirst)
|
328
|
+
| _ ->
|
329
|
+
base.RenderInput (canonicalDataCase, key, value)
|
330
|
+
|
331
|
+
override this.MapCanonicalDataCaseProperties (canonicalDataCase, properties) =
|
332
|
+
properties |> Map.add "expected" null // Ensure that the "expected" key exists
|
333
|
+
|
334
|
+
override this.PropertiesUsedAsSutParameter canonicalDataCase =
|
335
|
+
["year"; "month"; "dayofweek"; "week"]
|
336
|
+
|
337
|
+
override this.AdditionalNamespaces = [typeof<DateTime>.Namespace]
|
218
338
|
|
219
339
|
type Minesweeper() =
|
220
340
|
inherit Exercise()
|
@@ -241,6 +361,23 @@ type NthPrime() =
|
|
241
361
|
|> formatValue
|
242
362
|
|> parenthesizeOption
|
243
363
|
|
364
|
+
type OcrNumbers() =
|
365
|
+
inherit Exercise()
|
366
|
+
|
367
|
+
override this.PropertiesWithIdentifier canonicalDataCase = this.PropertiesUsedAsSutParameter canonicalDataCase
|
368
|
+
|
369
|
+
override this.RenderExpected (canonicalDataCase, key, value) =
|
370
|
+
value
|
371
|
+
|> Option.ofNonNegativeInt
|
372
|
+
|> formatValue
|
373
|
+
|> parenthesizeOption
|
374
|
+
|
375
|
+
override this.RenderInput (canonicalDataCase, key, value) =
|
376
|
+
value :?> JArray
|
377
|
+
|> normalizeJArray
|
378
|
+
|> Seq.map formatValue
|
379
|
+
|> formatMultiLineList
|
380
|
+
|
244
381
|
type Pangram() =
|
245
382
|
inherit Exercise()
|
246
383
|
|
@@ -471,4 +608,10 @@ type RomanNumerals() =
|
|
471
608
|
inherit Exercise()
|
472
609
|
|
473
610
|
type ScrabbleScore() =
|
474
|
-
inherit Exercise()
|
611
|
+
inherit Exercise()
|
612
|
+
|
613
|
+
type TwoFer() =
|
614
|
+
inherit Exercise()
|
615
|
+
|
616
|
+
override this.RenderInput (canonicalDataCase, key, value) =
|
617
|
+
value |> Option.ofObj |> formatValue |> parenthesizeOption
|
@@ -3,15 +3,13 @@ module Generators.Options
|
|
3
3
|
open System
|
4
4
|
open System.IO
|
5
5
|
open CommandLine
|
6
|
-
open Serilog
|
7
|
-
open Humanizer
|
8
6
|
|
9
7
|
type Options = {
|
10
|
-
[<
|
11
|
-
HelpText = "
|
12
|
-
[<
|
8
|
+
[<Option('e', "exercise", Required = false,
|
9
|
+
HelpText = "Exercise to generate (if not specified, defaults to all exercises).")>] Exercise : string;
|
10
|
+
[<Option('d', "canonicaldatadirectory", Required = false,
|
13
11
|
HelpText = "Canonical data directory. If the directory does not exist, the canonical data will be downloaded.")>] CanonicalDataDirectory : string;
|
14
|
-
[<
|
12
|
+
[<Option('s', "skipupdatecanonicaldata", Required = false,
|
15
13
|
HelpText = "Don't update the canonical data.")>] SkipUpdateCanonicalData : bool;
|
16
14
|
}
|
17
15
|
|
@@ -149,11 +149,11 @@ let formatMultiLineCollection (openPrefix, closePostfix) collection =
|
|
149
149
|
let formatLine i line =
|
150
150
|
match i with
|
151
151
|
| 0 ->
|
152
|
-
sprintf "%s %s" openPrefix line
|
152
|
+
sprintf "%s %s;" openPrefix line
|
153
153
|
| _ when i = length - 1 ->
|
154
154
|
sprintf "%s %s %s" lineIndent line closePostfix
|
155
155
|
| _ ->
|
156
|
-
sprintf "%s %s" lineIndent line
|
156
|
+
sprintf "%s %s;" lineIndent line
|
157
157
|
|
158
158
|
collection
|
159
159
|
|> Seq.mapi formatLine
|
@@ -16,8 +16,9 @@ let regenerateTestClasses options =
|
|
16
16
|
Log.Information("Re-generating test classes...")
|
17
17
|
|
18
18
|
let regenerateTestClass' = regenerateTestClass options
|
19
|
+
let filteredExercise = Option.ofNonEmptyString options.Exercise
|
19
20
|
|
20
|
-
createExercises
|
21
|
+
createExercises filteredExercise
|
21
22
|
|> Seq.iter regenerateTestClass'
|
22
23
|
|
23
24
|
Log.Information("Re-generated test classes.")
|
@@ -27,9 +28,9 @@ let main argv =
|
|
27
28
|
Logging.setupLogger()
|
28
29
|
|
29
30
|
match parseOptions argv with
|
30
|
-
|
|
31
|
+
| Ok(options) ->
|
31
32
|
regenerateTestClasses options
|
32
33
|
0
|
33
|
-
|
|
34
|
+
| Error(errors) ->
|
34
35
|
Log.Error("Error(s) parsing commandline arguments: {Errors}", errors)
|
35
36
|
1
|
@@ -15,7 +15,7 @@ So say you have a matrix like so:
|
|
15
15
|
It has a saddle point at (1, 0).
|
16
16
|
|
17
17
|
It's called a "saddle point" because it is greater than or equal to
|
18
|
-
every element in its row and
|
18
|
+
every element in its row and less than or equal to every element in
|
19
19
|
its column.
|
20
20
|
|
21
21
|
A matrix may have zero or more saddle points.
|
@@ -11,34 +11,6 @@ When X is a name or "you".
|
|
11
11
|
If the given name is "Alice", the result should be "One for Alice, one for me."
|
12
12
|
If no name is given, the result should be "One for you, one for me."
|
13
13
|
|
14
|
-
## Test-Driven Development
|
15
|
-
|
16
|
-
As programmers mature, they eventually want to test their code.
|
17
|
-
|
18
|
-
Here at Exercism we simulate [Test-Driven
|
19
|
-
Development](http://en.wikipedia.org/wiki/Test-driven_development) (TDD), where
|
20
|
-
you write your tests before writing any functionality. The simulation comes in
|
21
|
-
the form of a pre-written test suite, which will signal that you have solved
|
22
|
-
the problem.
|
23
|
-
|
24
|
-
It will also provide you with a safety net to explore other solutions without
|
25
|
-
breaking the functionality.
|
26
|
-
|
27
|
-
### A typical TDD workflow on Exercism:
|
28
|
-
|
29
|
-
1. Run the test file and pick one test that's failing.
|
30
|
-
2. Write some code to fix the test you picked.
|
31
|
-
3. Re-run the tests to confirm the test is now passing.
|
32
|
-
4. Repeat from step 1.
|
33
|
-
5. Submit your solution (`exercism submit /path/to/file`)
|
34
|
-
|
35
|
-
## Instructions
|
36
|
-
|
37
|
-
Submissions are encouraged to be general, within reason. Having said that, it's
|
38
|
-
also important not to over-engineer a solution.
|
39
|
-
|
40
|
-
It's important to remember that the goal is to make code as expressive and
|
41
|
-
readable as we can.
|
42
14
|
|
43
15
|
# Java Tips
|
44
16
|
|
@@ -15,39 +15,43 @@
|
|
15
15
|
return str;
|
16
16
|
}
|
17
17
|
|
18
|
-
function action(
|
19
|
-
var sbj
|
18
|
+
function action(currentVerse) {
|
19
|
+
var sbj;
|
20
|
+
var str = '';
|
20
21
|
|
21
|
-
if (
|
22
|
+
if (currentVerse === 0) {
|
22
23
|
str = 'Go to the store and buy some more, ';
|
23
24
|
} else {
|
24
|
-
sbj = (
|
25
|
+
sbj = (currentVerse === 1 ? 'it' : 'one');
|
25
26
|
str = 'Take ' + sbj + ' down and pass it around, ';
|
26
27
|
}
|
27
28
|
|
28
29
|
return str;
|
29
30
|
}
|
30
31
|
|
31
|
-
function
|
32
|
-
return bottles(
|
32
|
+
function nextBottle(currentVerse) {
|
33
|
+
return bottles(nextVerse(currentVerse)).toLowerCase() + ' of beer on the wall.\n';
|
33
34
|
}
|
34
35
|
|
35
|
-
function
|
36
|
-
return
|
36
|
+
function nextVerse(currentVerse) {
|
37
|
+
return currentVerse === 0 ? 99 : (currentVerse - 1);
|
37
38
|
}
|
38
39
|
|
39
40
|
function BeerSong() {}
|
40
41
|
|
41
42
|
BeerSong.prototype.sing = function (first, last) {
|
42
|
-
|
43
|
-
|
43
|
+
var firstVerseBottleCount = first;
|
44
|
+
var lastVerseBottleCount = last;
|
45
|
+
|
46
|
+
if (typeof (firstVerseBottleCount) === 'undefined') {
|
47
|
+
firstVerseBottleCount = 99;
|
44
48
|
}
|
45
|
-
if (typeof (
|
46
|
-
|
49
|
+
if (typeof (lastVerseBottleCount) === 'undefined') {
|
50
|
+
lastVerseBottleCount = 0;
|
47
51
|
}
|
48
52
|
|
49
53
|
var verses = [];
|
50
|
-
for (var i =
|
54
|
+
for (var i = firstVerseBottleCount; i >= lastVerseBottleCount; i--) {
|
51
55
|
verses.push(this.verse(i));
|
52
56
|
}
|
53
57
|
|
@@ -58,7 +62,7 @@
|
|
58
62
|
var line1 = bottles(number) + ' of beer on the wall, ';
|
59
63
|
var line2 = bottles(number).toLowerCase() + ' of beer.\n';
|
60
64
|
var line3 = action(number);
|
61
|
-
var line4 =
|
65
|
+
var line4 = nextBottle(number);
|
62
66
|
|
63
67
|
return [line1, line2, line3, line4].join('');
|
64
68
|
};
|