trackler 2.2.1.55 → 2.2.1.56

Sign up to get free protection for your applications and to get access to all the features.
Files changed (133) hide show
  1. checksums.yaml +4 -4
  2. data/lib/trackler/version.rb +1 -1
  3. data/problem-specifications/CONTRIBUTING.md +1 -1
  4. data/problem-specifications/exercises/phone-number/description.md +1 -1
  5. data/tracks/clojure/config.json +9 -1
  6. data/tracks/clojure/exercises/complex-numbers/README.md +37 -0
  7. data/tracks/clojure/exercises/complex-numbers/project.clj +4 -0
  8. data/tracks/clojure/exercises/complex-numbers/src/complex_numbers.clj +17 -0
  9. data/tracks/clojure/exercises/complex-numbers/src/example.clj +20 -0
  10. data/tracks/clojure/exercises/complex-numbers/test/complex_numbers_test.clj +141 -0
  11. data/tracks/dart/exercises/hello-world/lib/example.dart +3 -1
  12. data/tracks/dart/exercises/hello-world/lib/hello_world.dart +1 -1
  13. data/tracks/dart/exercises/hello-world/test/hello_world_test.dart +2 -16
  14. data/tracks/dart/exercises/leap/test/leap_test.dart +1 -1
  15. data/tracks/dart/tool/create-exercise +35 -25
  16. data/tracks/ecmascript/config.json +13 -0
  17. data/tracks/ecmascript/exercises/accumulate/README.md +1 -1
  18. data/tracks/ecmascript/exercises/acronym/README.md +1 -1
  19. data/tracks/ecmascript/exercises/all-your-base/README.md +1 -1
  20. data/tracks/ecmascript/exercises/allergies/README.md +1 -1
  21. data/tracks/ecmascript/exercises/alphametics/README.md +1 -1
  22. data/tracks/ecmascript/exercises/anagram/README.md +1 -1
  23. data/tracks/ecmascript/exercises/atbash-cipher/README.md +1 -1
  24. data/tracks/ecmascript/exercises/beer-song/README.md +1 -1
  25. data/tracks/ecmascript/exercises/binary-search-tree/README.md +1 -1
  26. data/tracks/ecmascript/exercises/binary-search/README.md +1 -1
  27. data/tracks/ecmascript/exercises/binary/README.md +1 -1
  28. data/tracks/ecmascript/exercises/bob/README.md +1 -1
  29. data/tracks/ecmascript/exercises/bowling/README.md +1 -1
  30. data/tracks/ecmascript/exercises/bracket-push/README.md +1 -1
  31. data/tracks/ecmascript/exercises/change/README.md +1 -1
  32. data/tracks/ecmascript/exercises/circular-buffer/README.md +1 -1
  33. data/tracks/ecmascript/exercises/clock/README.md +1 -1
  34. data/tracks/ecmascript/exercises/collatz-conjecture/README.md +1 -1
  35. data/tracks/ecmascript/exercises/connect/README.md +1 -1
  36. data/tracks/ecmascript/exercises/crypto-square/README.md +1 -1
  37. data/tracks/ecmascript/exercises/custom-set/README.md +1 -1
  38. data/tracks/ecmascript/exercises/diamond/README.md +1 -1
  39. data/tracks/ecmascript/exercises/difference-of-squares/README.md +1 -1
  40. data/tracks/ecmascript/exercises/diffie-hellman/README.md +1 -1
  41. data/tracks/ecmascript/exercises/etl/README.md +1 -1
  42. data/tracks/ecmascript/exercises/flatten-array/README.md +1 -1
  43. data/tracks/ecmascript/exercises/food-chain/README.md +1 -1
  44. data/tracks/ecmascript/exercises/gigasecond/README.md +1 -1
  45. data/tracks/ecmascript/exercises/grade-school/README.md +1 -1
  46. data/tracks/ecmascript/exercises/grains/README.md +1 -1
  47. data/tracks/ecmascript/exercises/hamming/README.md +1 -1
  48. data/tracks/ecmascript/exercises/hello-world/README.md +1 -1
  49. data/tracks/ecmascript/exercises/hexadecimal/README.md +1 -1
  50. data/tracks/ecmascript/exercises/isbn-verifier/README.md +1 -1
  51. data/tracks/ecmascript/exercises/isogram/README.md +1 -1
  52. data/tracks/ecmascript/exercises/kindergarten-garden/README.md +1 -1
  53. data/tracks/ecmascript/exercises/largest-series-product/README.md +1 -1
  54. data/tracks/ecmascript/exercises/leap/README.md +1 -1
  55. data/tracks/ecmascript/exercises/linked-list/README.md +1 -1
  56. data/tracks/ecmascript/exercises/list-ops/README.md +1 -1
  57. data/tracks/ecmascript/exercises/luhn/README.md +1 -1
  58. data/tracks/ecmascript/exercises/matrix/README.md +1 -1
  59. data/tracks/ecmascript/exercises/meetup/README.md +1 -1
  60. data/tracks/ecmascript/exercises/minesweeper/README.md +1 -1
  61. data/tracks/ecmascript/exercises/nth-prime/README.md +1 -1
  62. data/tracks/ecmascript/exercises/ocr-numbers/README.md +1 -1
  63. data/tracks/ecmascript/exercises/octal/README.md +1 -1
  64. data/tracks/ecmascript/exercises/palindrome-products/README.md +1 -1
  65. data/tracks/ecmascript/exercises/pangram/README.md +1 -1
  66. data/tracks/ecmascript/exercises/pascals-triangle/README.md +1 -1
  67. data/tracks/ecmascript/exercises/perfect-numbers/README.md +1 -1
  68. data/tracks/ecmascript/exercises/phone-number/README.md +1 -1
  69. data/tracks/ecmascript/exercises/pig-latin/README.md +1 -1
  70. data/tracks/ecmascript/exercises/prime-factors/README.md +1 -1
  71. data/tracks/ecmascript/exercises/protein-translation/README.md +78 -0
  72. data/tracks/ecmascript/exercises/protein-translation/example.js +45 -0
  73. data/tracks/ecmascript/exercises/protein-translation/package.json +71 -0
  74. data/tracks/ecmascript/exercises/protein-translation/protein-translation.spec.js +59 -0
  75. data/tracks/ecmascript/exercises/proverb/README.md +1 -1
  76. data/tracks/ecmascript/exercises/pythagorean-triplet/README.md +1 -1
  77. data/tracks/ecmascript/exercises/queen-attack/README.md +1 -1
  78. data/tracks/ecmascript/exercises/raindrops/README.md +1 -1
  79. data/tracks/ecmascript/exercises/rna-transcription/README.md +1 -1
  80. data/tracks/ecmascript/exercises/robot-name/README.md +1 -1
  81. data/tracks/ecmascript/exercises/robot-simulator/README.md +1 -1
  82. data/tracks/ecmascript/exercises/roman-numerals/README.md +1 -1
  83. data/tracks/ecmascript/exercises/run-length-encoding/README.md +1 -1
  84. data/tracks/ecmascript/exercises/saddle-points/README.md +1 -1
  85. data/tracks/ecmascript/exercises/say/README.md +1 -1
  86. data/tracks/ecmascript/exercises/scrabble-score/README.md +1 -1
  87. data/tracks/ecmascript/exercises/secret-handshake/README.md +1 -1
  88. data/tracks/ecmascript/exercises/series/README.md +1 -1
  89. data/tracks/ecmascript/exercises/sieve/README.md +1 -1
  90. data/tracks/ecmascript/exercises/simple-cipher/README.md +1 -1
  91. data/tracks/ecmascript/exercises/simple-linked-list/README.md +1 -1
  92. data/tracks/ecmascript/exercises/space-age/README.md +1 -1
  93. data/tracks/ecmascript/exercises/strain/README.md +1 -1
  94. data/tracks/ecmascript/exercises/sublist/README.md +1 -1
  95. data/tracks/ecmascript/exercises/sum-of-multiples/README.md +1 -1
  96. data/tracks/ecmascript/exercises/transpose/README.md +1 -1
  97. data/tracks/ecmascript/exercises/triangle/README.md +1 -1
  98. data/tracks/ecmascript/exercises/trinary/README.md +1 -1
  99. data/tracks/ecmascript/exercises/twelve-days/README.md +1 -1
  100. data/tracks/ecmascript/exercises/two-bucket/README.md +1 -1
  101. data/tracks/ecmascript/exercises/two-fer/README.md +1 -1
  102. data/tracks/ecmascript/exercises/word-count/README.md +1 -1
  103. data/tracks/ecmascript/exercises/word-search/README.md +1 -1
  104. data/tracks/ecmascript/exercises/wordy/README.md +1 -1
  105. data/tracks/erlang/exercises/bob/src/bob.erl +4 -4
  106. data/tracks/erlang/exercises/bob/src/example.erl +30 -15
  107. data/tracks/erlang/exercises/bob/test/bob_tests.erl +84 -45
  108. data/tracks/erlang/exercises/collatz-conjecture/test/collatz_conjecture_tests.erl +2 -0
  109. data/tracks/erlang/exercises/hamming/src/example.erl +10 -10
  110. data/tracks/erlang/exercises/hamming/src/hamming.erl +4 -4
  111. data/tracks/erlang/exercises/hamming/test/hamming_tests.erl +54 -13
  112. data/tracks/erlang/exercises/hello-world/test/hello_world_tests.erl +2 -0
  113. data/tracks/erlang/exercises/leap/test/leap_tests.erl +2 -0
  114. data/tracks/erlang/exercises/rna-transcription/src/example.erl +6 -2
  115. data/tracks/erlang/exercises/rna-transcription/src/rna_transcription.erl +3 -3
  116. data/tracks/erlang/exercises/rna-transcription/test/rna_transcription_tests.erl +24 -14
  117. data/tracks/erlang/testgen/src/tgen.erl +1 -0
  118. data/tracks/erlang/testgen/src/tgen_bob.erl +29 -0
  119. data/tracks/erlang/testgen/src/tgen_hamming.erl +41 -0
  120. data/tracks/erlang/testgen/src/tgen_rna-transcription.erl +38 -0
  121. data/tracks/fsharp/exercises/etl/Etl.fs +2 -2
  122. data/tracks/fsharp/exercises/etl/EtlTest.fs +72 -29
  123. data/tracks/fsharp/exercises/etl/Example.fs +10 -5
  124. data/tracks/fsharp/exercises/nth-prime/NthPrimeTest.fs +1 -1
  125. data/tracks/fsharp/exercises/nucleotide-count/Example.fs +7 -3
  126. data/tracks/fsharp/exercises/nucleotide-count/NucleotideCount.fs +1 -3
  127. data/tracks/fsharp/exercises/nucleotide-count/NucleotideCountTest.fs +51 -33
  128. data/tracks/fsharp/generators/Generators.fs +48 -2
  129. data/tracks/gnu-apl/README.md +49 -14
  130. data/tracks/python/exercises/flatten-array/flatten_array_test.py +18 -11
  131. data/tracks/python/exercises/pig-latin/example.py +2 -1
  132. data/tracks/python/exercises/pig-latin/pig_latin_test.py +10 -4
  133. metadata +14 -2
@@ -1,24 +1,65 @@
1
1
  -module(hamming_tests).
2
2
 
3
+ % This file is automatically generated from the exercises canonical data.
4
+
3
5
  -define(TESTED_MODULE, (sut(hamming))).
4
- -define(TEST_VERSION, 1).
6
+ -define(TEST_VERSION, 2).
5
7
  -include("exercism.hrl").
6
8
 
7
9
 
8
- empty_test()->
9
- ?assertEqual(0, ?TESTED_MODULE:hamming_distance("", "")).
10
+ empty_strands_test() ->
11
+ ?assertMatch(0, ?TESTED_MODULE:distance([], [])).
12
+
13
+ identical_strands_test() ->
14
+ ?assertMatch(0, ?TESTED_MODULE:distance("A", "A")).
15
+
16
+ long_identical_strands_test() ->
17
+ ?assertMatch(0,
18
+ ?TESTED_MODULE:distance("GGACTGA", "GGACTGA")).
19
+
20
+ complete_distance_in_single_nucleotide_strands_test() ->
21
+ ?assertMatch(1, ?TESTED_MODULE:distance("A", "G")).
22
+
23
+ complete_distance_in_small_strands_test() ->
24
+ ?assertMatch(2, ?TESTED_MODULE:distance("AG", "CT")).
25
+
26
+ small_distance_in_small_strands_test() ->
27
+ ?assertMatch(1, ?TESTED_MODULE:distance("AT", "CT")).
28
+
29
+ small_distance_test() ->
30
+ ?assertMatch(1,
31
+ ?TESTED_MODULE:distance("GGACG", "GGTCG")).
32
+
33
+ small_distance_in_long_strands_test() ->
34
+ ?assertMatch(2,
35
+ ?TESTED_MODULE:distance("ACCAGGG", "ACTATGG")).
36
+
37
+ non_unique_character_in_first_strand_test() ->
38
+ ?assertMatch(1, ?TESTED_MODULE:distance("AAG", "AAA")).
39
+
40
+ non_unique_character_in_second_strand_test() ->
41
+ ?assertMatch(1, ?TESTED_MODULE:distance("AAA", "AAG")).
10
42
 
11
- equal_test() ->
12
- ?assertEqual(0, ?TESTED_MODULE:hamming_distance("GAGCCTACTAACGGGAT", "GAGCCTACTAACGGGAT")).
43
+ same_nucleotides_in_different_positions_test() ->
44
+ ?assertMatch(2, ?TESTED_MODULE:distance("TAG", "GAT")).
13
45
 
14
- all_different_test() ->
15
- ?assertEqual(17, ?TESTED_MODULE:hamming_distance("GAGCCTACTAACGGGAT", "FFFFFFFFFFFFFFFFF")).
46
+ large_distance_test() ->
47
+ ?assertMatch(4,
48
+ ?TESTED_MODULE:distance("GATACA", "GCATAA")).
16
49
 
17
- ends_different_test()->
18
- ?assertEqual(2, ?TESTED_MODULE:hamming_distance("GAGCCTACTAACGGGAT", "TAGCCTACTAACGGGAG")).
50
+ large_distance_in_off_by_one_strand_test() ->
51
+ ?assertMatch(9,
52
+ ?TESTED_MODULE:distance("GGACGGATTCTG",
53
+ "AGGACGGATTCT")).
19
54
 
20
- middle_different_test() ->
21
- ?assertEqual(1, ?TESTED_MODULE:hamming_distance("GAGCCTACTAACGGGAT", "GAGCCTACCAACGGGAT")).
55
+ disallow_first_strand_longer_test() ->
56
+ ?assertMatch({error,
57
+ "left and right strands must be of equal "
58
+ "length"},
59
+ ?TESTED_MODULE:distance("AATG", "AAA")).
22
60
 
23
- some_differences_test() ->
24
- ?assertEqual(6, ?TESTED_MODULE:hamming_distance("GAGCCTACTAACGGGAT", "GAACCTCCCAAGGGATT")).
61
+ disallow_second_strand_longer_test() ->
62
+ ?assertMatch({error,
63
+ "left and right strands must be of equal "
64
+ "length"},
65
+ ?TESTED_MODULE:distance("ATA", "AGTG")).
@@ -1,5 +1,7 @@
1
1
  -module(hello_world_tests).
2
2
 
3
+ % This file is automatically generated from the exercises canonical data.
4
+
3
5
  -define(TESTED_MODULE, (sut(hello_world))).
4
6
  -define(TEST_VERSION, 2).
5
7
  -include("exercism.hrl").
@@ -1,5 +1,7 @@
1
1
  -module(leap_tests).
2
2
 
3
+ % This file is automatically generated from the exercises canonical data.
4
+
3
5
  -define(TESTED_MODULE, (sut(leap))).
4
6
  -define(TEST_VERSION, 3).
5
7
  -include("exercism.hrl").
@@ -2,10 +2,14 @@
2
2
  -export([to_rna/1, test_version/0]).
3
3
 
4
4
  to_rna(Strand) ->
5
- lists:map(fun transcribe_to_rna/1, Strand).
5
+ try lists:map(fun transcribe_to_rna/1, Strand) of
6
+ Result -> Result
7
+ catch
8
+ _:_ -> error
9
+ end.
6
10
 
7
11
  test_version() ->
8
- 1.
12
+ 2.
9
13
 
10
14
 
11
15
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  -export([to_rna/1, test_version/0]).
4
4
 
5
- to_rna(Strand) ->
6
- undefined.
7
5
 
8
- test_version() -> 1.
6
+ to_rna(Strand) -> undefined.
7
+
8
+ test_version() -> 2.
@@ -1,24 +1,34 @@
1
1
  -module(rna_transcription_tests).
2
2
 
3
+ % This file is automatically generated from the exercises canonical data.
4
+
3
5
  -define(TESTED_MODULE, (sut(rna_transcription))).
4
- -define(TEST_VERSION, 1).
6
+ -define(TEST_VERSION, 2).
5
7
  -include("exercism.hrl").
6
8
 
7
9
 
8
- transcribes_cytidine_to_guanosine_test() ->
9
- ?assertEqual("C", ?TESTED_MODULE:to_rna("G")).
10
+ rna_complement_of_cytosine_is_guanine_test() ->
11
+ ?assertMatch("G", ?TESTED_MODULE:to_rna("C")).
12
+
13
+ rna_complement_of_guanine_is_cytosine_test() ->
14
+ ?assertMatch("C", ?TESTED_MODULE:to_rna("G")).
15
+
16
+ rna_complement_of_thymine_is_adenine_test() ->
17
+ ?assertMatch("A", ?TESTED_MODULE:to_rna("T")).
18
+
19
+ rna_complement_of_adenine_is_uracil_test() ->
20
+ ?assertMatch("U", ?TESTED_MODULE:to_rna("A")).
10
21
 
11
- transcribes_guanosine_to_cytidine_test() ->
12
- ?assertEqual("G", ?TESTED_MODULE:to_rna("C")).
22
+ rna_complement_test() ->
23
+ ?assertMatch("UGCACCAGAAUU",
24
+ ?TESTED_MODULE:to_rna("ACGTGGTCTTAA")).
13
25
 
14
- transcribes_adenosine_to_thymidine_test() ->
15
- ?assertEqual("A", ?TESTED_MODULE:to_rna("T")).
26
+ correctly_handles_invalid_input_rna_instead_of_dna_test() ->
27
+ ?assertMatch(error, ?TESTED_MODULE:to_rna("U")).
16
28
 
17
- transcribes_thymidine_to_uracil_test() ->
18
- ?assertEqual("U", ?TESTED_MODULE:to_rna("A")).
29
+ correctly_handles_completely_invalid_dna_input_test() ->
30
+ ?assertMatch(error, ?TESTED_MODULE:to_rna("XXX")).
19
31
 
20
- transcribes_all_occurences_test() ->
21
- ?assertEqual(
22
- "UGCACCAGAAUU",
23
- ?TESTED_MODULE:to_rna("ACGTGGTCTTAA")
24
- ).
32
+ correctly_handles_partially_invalid_dna_input_test() ->
33
+ ?assertMatch(error,
34
+ ?TESTED_MODULE:to_rna("ACGTXXXCTTAA")).
@@ -130,6 +130,7 @@ generate_test_module(ModuleName, Tests, Version) ->
130
130
  Abstract = [
131
131
  tgs:module(SluggedModName ++ "_tests"),
132
132
  nl,
133
+ erl_syntax:comment([" This file is automatically generated from the exercises canonical data."]),
133
134
  tgs:define("TESTED_MODULE",
134
135
  tgs:parens(
135
136
  tgs:call_fun("sut", [tgs:atom(SluggedModName)]))),
@@ -0,0 +1,29 @@
1
+ -module('tgen_bob').
2
+
3
+ -behaviour(tgen).
4
+
5
+ -export([
6
+ available/0,
7
+ version/0,
8
+ generate_test/1
9
+ ]).
10
+
11
+ -spec available() -> true.
12
+ available() ->
13
+ true.
14
+
15
+ version() -> 2.
16
+
17
+ generate_test(F = #{description := Desc, expected := Exp, property := Prop, input := Input}) ->
18
+ TestName = tgen:to_test_name(Desc),
19
+ Property = binary_to_list(Prop),
20
+ Expected = binary_to_list(Exp),
21
+ Sentence = binary_to_list(Input),
22
+
23
+ Fn = tgs:simple_fun(TestName, [
24
+ tgs:call_macro("assertMatch", [
25
+ tgs:value(Expected),
26
+ tgs:call_macro("TESTED_MODULE:" ++ Property, [
27
+ tgs:value(Sentence)])])]),
28
+
29
+ {ok, Fn, [{Property, ["String"]}]}.
@@ -0,0 +1,41 @@
1
+ -module('tgen_hamming').
2
+
3
+ -behaviour(tgen).
4
+
5
+ -export([
6
+ available/0,
7
+ version/0,
8
+ generate_test/1
9
+ ]).
10
+
11
+ -spec available() -> true.
12
+ available() ->
13
+ true.
14
+
15
+ version() -> 2.
16
+
17
+ generate_test(#{description := Desc, expected := #{error := Message}, property := Prop, 'strand1' := S1, 'strand2' := S2}) ->
18
+ TestName = tgen:to_test_name(Desc),
19
+ Property = binary_to_list(Prop),
20
+ Reason = binary_to_list(Message),
21
+
22
+ Fn = tgs:simple_fun(TestName, [
23
+ tgs:call_macro("assertMatch", [
24
+ tgs:value({error, Reason}),
25
+ tgs:call_macro("TESTED_MODULE:" ++ Property, [
26
+ tgs:value(binary_to_list(S1)),
27
+ tgs:value(binary_to_list(S2))])])]),
28
+
29
+ {ok, Fn, [{Property, ["Strand1", "Strand2"]}]};
30
+ generate_test(#{description := Desc, expected := Exp, property := Prop, 'strand1' := S1, 'strand2' := S2}) ->
31
+ TestName = tgen:to_test_name(Desc),
32
+ Property = binary_to_list(Prop),
33
+
34
+ Fn = tgs:simple_fun(TestName, [
35
+ tgs:call_macro("assertMatch", [
36
+ tgs:value(Exp),
37
+ tgs:call_macro("TESTED_MODULE:" ++ Property, [
38
+ tgs:value(binary_to_list(S1)),
39
+ tgs:value(binary_to_list(S2))])])]),
40
+
41
+ {ok, Fn, [{Property, ["Strand1", "Strand2"]}]}.
@@ -0,0 +1,38 @@
1
+ -module('tgen_rna-transcription').
2
+
3
+ -behaviour(tgen).
4
+
5
+ -export([
6
+ available/0,
7
+ version/0,
8
+ generate_test/1
9
+ ]).
10
+
11
+ -spec available() -> true.
12
+ available() ->
13
+ true.
14
+
15
+ version() -> 2.
16
+
17
+ generate_test(#{description := Desc, expected := null, property := <<"toRna">>, dna := DNA}) ->
18
+ TestName = tgen:to_test_name(Desc),
19
+ Property = "to_rna",
20
+
21
+ Fn = tgs:simple_fun(TestName, [
22
+ tgs:call_macro("assertMatch", [
23
+ tgs:value(error),
24
+ tgs:call_macro("TESTED_MODULE:" ++ Property, [
25
+ tgs:value(binary_to_list(DNA))])])]),
26
+
27
+ {ok, Fn, [{Property, ["Strand"]}]};
28
+ generate_test(#{description := Desc, expected := Exp, property := <<"toRna">>, dna := DNA}) ->
29
+ TestName = tgen:to_test_name(Desc),
30
+ Property = "to_rna",
31
+
32
+ Fn = tgs:simple_fun(TestName, [
33
+ tgs:call_macro("assertMatch", [
34
+ tgs:value(binary_to_list(Exp)),
35
+ tgs:call_macro("TESTED_MODULE:" ++ Property, [
36
+ tgs:value(binary_to_list(DNA))])])]),
37
+
38
+ {ok, Fn, [{Property, ["Strand"]}]}.
@@ -1,3 +1,3 @@
1
- module ETL
1
+ module Etl
2
2
 
3
- let transform (scoresWithLetters: Map<int, string list>): Map<string, int> = failwith "You need to implement this function."
3
+ let transform (scoresWithLetters: Map<int, char list>): Map<char, int> = failwith "You need to implement this function."
@@ -1,39 +1,82 @@
1
- module ETLTest
1
+ // This file was auto-generated based on version 1.0.0 of the canonical data.
2
+
3
+ module EtlTest
2
4
 
3
- open Xunit
4
5
  open FsUnit.Xunit
5
- open ETL
6
+ open Xunit
7
+
8
+ open Etl
6
9
 
7
10
  [<Fact>]
8
- let ``Transforms one value`` () =
9
- let old = [(1, ["A"])] |> Map.ofSeq
10
- let expected = [("a", 1)] |> Map.ofSeq
11
- transform old |> should equal expected
11
+ let ``A single letter`` () =
12
+ let input = [(1, ['A'])] |> Map.ofList
13
+ let expected = [('a', 1)] |> Map.ofList
14
+ transform input |> should equal expected
12
15
 
13
16
  [<Fact(Skip = "Remove to run test")>]
14
- let ``Transforms multiple values`` () =
15
- let old = [(1, ["A"; "E"; "I"; "O"; "U"])] |> Map.ofSeq
16
- let expected = [("a", 1); ("e", 1); ("i", 1); ("o", 1); ("u", 1)] |> Map.ofSeq
17
- transform old |> should equal expected
17
+ let ``Single score with multiple letters`` () =
18
+ let input = [(1, ['A'; 'E'; 'I'; 'O'; 'U'])] |> Map.ofList
19
+ let expected =
20
+ [ ('a', 1)
21
+ ('e', 1)
22
+ ('i', 1)
23
+ ('o', 1)
24
+ ('u', 1) ]
25
+ |> Map.ofList
26
+ transform input |> should equal expected
18
27
 
19
28
  [<Fact(Skip = "Remove to run test")>]
20
- let ``Transforms multiple keys`` () =
21
- let old = [(1, ["A"; "E"]); (2, ["D"; "G"])] |> Map.ofSeq
22
- let expected = [("a", 1); ("e", 1); ("d", 2); ("g", 2); ] |> Map.ofSeq
23
- transform old |> should equal expected
29
+ let ``Multiple scores with multiple letters`` () =
30
+ let input =
31
+ [ (1, ['A'; 'E'])
32
+ (2, ['D'; 'G']) ]
33
+ |> Map.ofList
34
+ let expected =
35
+ [ ('a', 1)
36
+ ('d', 2)
37
+ ('e', 1)
38
+ ('g', 2) ]
39
+ |> Map.ofList
40
+ transform input |> should equal expected
24
41
 
25
42
  [<Fact(Skip = "Remove to run test")>]
26
- let ``Transforms a full dataset`` () =
27
- let old = [(1, ["A"; "E"; "I"; "O"; "U"; "L"; "N"; "R"; "S"; "T"]);
28
- (2, ["D"; "G"]);
29
- (3, ["B"; "C"; "M"; "P"]);
30
- (4, ["F"; "H"; "V"; "W"; "Y"]);
31
- (5, ["K"]);
32
- (8, ["J"; "X"]);
33
- (10, ["Q"; "Z"])] |> Map.ofSeq
34
-
35
- let expected = [("a", 1); ("b", 3); ("c", 3); ("d", 2); ("e", 1); ("f", 4); ("g", 2); ("h", 4); ("i", 1);
36
- ("j", 8); ("k", 5); ("l", 1); ("m", 3); ("n", 1); ("o", 1); ("p", 3); ("q", 10); ("r", 1);
37
- ("s", 1); ("t", 1); ("u", 1); ("v", 4); ("w", 4); ("x", 8); ("y", 4); ("z", 10 )] |> Map.ofSeq
38
-
39
- transform old |> should equal expected
43
+ let ``Multiple scores with differing numbers of letters`` () =
44
+ let input =
45
+ [ (1, ['A'; 'E'; 'I'; 'O'; 'U'; 'L'; 'N'; 'R'; 'S'; 'T'])
46
+ (2, ['D'; 'G'])
47
+ (3, ['B'; 'C'; 'M'; 'P'])
48
+ (4, ['F'; 'H'; 'V'; 'W'; 'Y'])
49
+ (5, ['K'])
50
+ (8, ['J'; 'X'])
51
+ (10, ['Q'; 'Z']) ]
52
+ |> Map.ofList
53
+ let expected =
54
+ [ ('a', 1)
55
+ ('b', 3)
56
+ ('c', 3)
57
+ ('d', 2)
58
+ ('e', 1)
59
+ ('f', 4)
60
+ ('g', 2)
61
+ ('h', 4)
62
+ ('i', 1)
63
+ ('j', 8)
64
+ ('k', 5)
65
+ ('l', 1)
66
+ ('m', 3)
67
+ ('n', 1)
68
+ ('o', 1)
69
+ ('p', 3)
70
+ ('q', 10)
71
+ ('r', 1)
72
+ ('s', 1)
73
+ ('t', 1)
74
+ ('u', 1)
75
+ ('v', 4)
76
+ ('w', 4)
77
+ ('x', 8)
78
+ ('y', 4)
79
+ ('z', 10) ]
80
+ |> Map.ofList
81
+ transform input |> should equal expected
82
+
@@ -1,9 +1,14 @@
1
- module ETL
1
+ module Etl
2
2
 
3
- let normalizeLetter (letter:string) = letter.ToLowerInvariant()
3
+ open System
4
4
 
5
- let transformLetterWithScore score lettersWithScore (letter:string) = Map.add (normalizeLetter letter) score lettersWithScore
5
+ let normalizeLetter letter = Char.ToLowerInvariant(letter)
6
6
 
7
- let transformScoreWithLetters lettersWithScore score letters = List.fold (transformLetterWithScore score) lettersWithScore letters
7
+ let transformLetterWithScore score lettersWithScore letter =
8
+ Map.add (normalizeLetter letter) score lettersWithScore
8
9
 
9
- let transform scoresWithLetters: Map<string, int> = Map.fold transformScoreWithLetters Map.empty scoresWithLetters
10
+ let transformScoreWithLetters lettersWithScore score letters =
11
+ List.fold (transformLetterWithScore score) lettersWithScore letters
12
+
13
+ let transform scoresWithLetters: Map<char, int> =
14
+ Map.fold transformScoreWithLetters Map.empty scoresWithLetters
@@ -1,4 +1,4 @@
1
- // This file was auto-generated based on version 1.0.0 of the canonical data.
1
+ // This file was auto-generated based on version 2.0.0 of the canonical data.
2
2
 
3
3
  module NthPrimeTest
4
4
 
@@ -1,4 +1,4 @@
1
- module NucleoTideCount
1
+ module NucleotideCount
2
2
 
3
3
  let private validNucleotides = ['A'; 'T'; 'C'; 'G']
4
4
 
@@ -10,5 +10,9 @@ let count (nucleotide:char) (strand:string) =
10
10
  | false -> failwith "Invalid nucleotide"
11
11
 
12
12
  let nucleotideCounts strand =
13
- List.map (fun nucleotide -> (nucleotide, count nucleotide strand)) validNucleotides
14
- |> Map.ofSeq
13
+ if String.forall isValid strand then
14
+ List.map (fun nucleotide -> (nucleotide, count nucleotide strand)) validNucleotides
15
+ |> Map.ofSeq
16
+ |> Some
17
+ else
18
+ None