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.
- checksums.yaml +4 -4
- data/lib/trackler/version.rb +1 -1
- data/problem-specifications/CONTRIBUTING.md +1 -1
- data/problem-specifications/exercises/phone-number/description.md +1 -1
- data/tracks/clojure/config.json +9 -1
- data/tracks/clojure/exercises/complex-numbers/README.md +37 -0
- data/tracks/clojure/exercises/complex-numbers/project.clj +4 -0
- data/tracks/clojure/exercises/complex-numbers/src/complex_numbers.clj +17 -0
- data/tracks/clojure/exercises/complex-numbers/src/example.clj +20 -0
- data/tracks/clojure/exercises/complex-numbers/test/complex_numbers_test.clj +141 -0
- data/tracks/dart/exercises/hello-world/lib/example.dart +3 -1
- data/tracks/dart/exercises/hello-world/lib/hello_world.dart +1 -1
- data/tracks/dart/exercises/hello-world/test/hello_world_test.dart +2 -16
- data/tracks/dart/exercises/leap/test/leap_test.dart +1 -1
- data/tracks/dart/tool/create-exercise +35 -25
- data/tracks/ecmascript/config.json +13 -0
- data/tracks/ecmascript/exercises/accumulate/README.md +1 -1
- data/tracks/ecmascript/exercises/acronym/README.md +1 -1
- data/tracks/ecmascript/exercises/all-your-base/README.md +1 -1
- data/tracks/ecmascript/exercises/allergies/README.md +1 -1
- data/tracks/ecmascript/exercises/alphametics/README.md +1 -1
- data/tracks/ecmascript/exercises/anagram/README.md +1 -1
- data/tracks/ecmascript/exercises/atbash-cipher/README.md +1 -1
- data/tracks/ecmascript/exercises/beer-song/README.md +1 -1
- data/tracks/ecmascript/exercises/binary-search-tree/README.md +1 -1
- data/tracks/ecmascript/exercises/binary-search/README.md +1 -1
- data/tracks/ecmascript/exercises/binary/README.md +1 -1
- data/tracks/ecmascript/exercises/bob/README.md +1 -1
- data/tracks/ecmascript/exercises/bowling/README.md +1 -1
- data/tracks/ecmascript/exercises/bracket-push/README.md +1 -1
- data/tracks/ecmascript/exercises/change/README.md +1 -1
- data/tracks/ecmascript/exercises/circular-buffer/README.md +1 -1
- data/tracks/ecmascript/exercises/clock/README.md +1 -1
- data/tracks/ecmascript/exercises/collatz-conjecture/README.md +1 -1
- data/tracks/ecmascript/exercises/connect/README.md +1 -1
- data/tracks/ecmascript/exercises/crypto-square/README.md +1 -1
- data/tracks/ecmascript/exercises/custom-set/README.md +1 -1
- data/tracks/ecmascript/exercises/diamond/README.md +1 -1
- data/tracks/ecmascript/exercises/difference-of-squares/README.md +1 -1
- data/tracks/ecmascript/exercises/diffie-hellman/README.md +1 -1
- data/tracks/ecmascript/exercises/etl/README.md +1 -1
- data/tracks/ecmascript/exercises/flatten-array/README.md +1 -1
- data/tracks/ecmascript/exercises/food-chain/README.md +1 -1
- data/tracks/ecmascript/exercises/gigasecond/README.md +1 -1
- data/tracks/ecmascript/exercises/grade-school/README.md +1 -1
- data/tracks/ecmascript/exercises/grains/README.md +1 -1
- data/tracks/ecmascript/exercises/hamming/README.md +1 -1
- data/tracks/ecmascript/exercises/hello-world/README.md +1 -1
- data/tracks/ecmascript/exercises/hexadecimal/README.md +1 -1
- data/tracks/ecmascript/exercises/isbn-verifier/README.md +1 -1
- data/tracks/ecmascript/exercises/isogram/README.md +1 -1
- data/tracks/ecmascript/exercises/kindergarten-garden/README.md +1 -1
- data/tracks/ecmascript/exercises/largest-series-product/README.md +1 -1
- data/tracks/ecmascript/exercises/leap/README.md +1 -1
- data/tracks/ecmascript/exercises/linked-list/README.md +1 -1
- data/tracks/ecmascript/exercises/list-ops/README.md +1 -1
- data/tracks/ecmascript/exercises/luhn/README.md +1 -1
- data/tracks/ecmascript/exercises/matrix/README.md +1 -1
- data/tracks/ecmascript/exercises/meetup/README.md +1 -1
- data/tracks/ecmascript/exercises/minesweeper/README.md +1 -1
- data/tracks/ecmascript/exercises/nth-prime/README.md +1 -1
- data/tracks/ecmascript/exercises/ocr-numbers/README.md +1 -1
- data/tracks/ecmascript/exercises/octal/README.md +1 -1
- data/tracks/ecmascript/exercises/palindrome-products/README.md +1 -1
- data/tracks/ecmascript/exercises/pangram/README.md +1 -1
- data/tracks/ecmascript/exercises/pascals-triangle/README.md +1 -1
- data/tracks/ecmascript/exercises/perfect-numbers/README.md +1 -1
- data/tracks/ecmascript/exercises/phone-number/README.md +1 -1
- data/tracks/ecmascript/exercises/pig-latin/README.md +1 -1
- data/tracks/ecmascript/exercises/prime-factors/README.md +1 -1
- data/tracks/ecmascript/exercises/protein-translation/README.md +78 -0
- data/tracks/ecmascript/exercises/protein-translation/example.js +45 -0
- data/tracks/ecmascript/exercises/protein-translation/package.json +71 -0
- data/tracks/ecmascript/exercises/protein-translation/protein-translation.spec.js +59 -0
- data/tracks/ecmascript/exercises/proverb/README.md +1 -1
- data/tracks/ecmascript/exercises/pythagorean-triplet/README.md +1 -1
- data/tracks/ecmascript/exercises/queen-attack/README.md +1 -1
- data/tracks/ecmascript/exercises/raindrops/README.md +1 -1
- data/tracks/ecmascript/exercises/rna-transcription/README.md +1 -1
- data/tracks/ecmascript/exercises/robot-name/README.md +1 -1
- data/tracks/ecmascript/exercises/robot-simulator/README.md +1 -1
- data/tracks/ecmascript/exercises/roman-numerals/README.md +1 -1
- data/tracks/ecmascript/exercises/run-length-encoding/README.md +1 -1
- data/tracks/ecmascript/exercises/saddle-points/README.md +1 -1
- data/tracks/ecmascript/exercises/say/README.md +1 -1
- data/tracks/ecmascript/exercises/scrabble-score/README.md +1 -1
- data/tracks/ecmascript/exercises/secret-handshake/README.md +1 -1
- data/tracks/ecmascript/exercises/series/README.md +1 -1
- data/tracks/ecmascript/exercises/sieve/README.md +1 -1
- data/tracks/ecmascript/exercises/simple-cipher/README.md +1 -1
- data/tracks/ecmascript/exercises/simple-linked-list/README.md +1 -1
- data/tracks/ecmascript/exercises/space-age/README.md +1 -1
- data/tracks/ecmascript/exercises/strain/README.md +1 -1
- data/tracks/ecmascript/exercises/sublist/README.md +1 -1
- data/tracks/ecmascript/exercises/sum-of-multiples/README.md +1 -1
- data/tracks/ecmascript/exercises/transpose/README.md +1 -1
- data/tracks/ecmascript/exercises/triangle/README.md +1 -1
- data/tracks/ecmascript/exercises/trinary/README.md +1 -1
- data/tracks/ecmascript/exercises/twelve-days/README.md +1 -1
- data/tracks/ecmascript/exercises/two-bucket/README.md +1 -1
- data/tracks/ecmascript/exercises/two-fer/README.md +1 -1
- data/tracks/ecmascript/exercises/word-count/README.md +1 -1
- data/tracks/ecmascript/exercises/word-search/README.md +1 -1
- data/tracks/ecmascript/exercises/wordy/README.md +1 -1
- data/tracks/erlang/exercises/bob/src/bob.erl +4 -4
- data/tracks/erlang/exercises/bob/src/example.erl +30 -15
- data/tracks/erlang/exercises/bob/test/bob_tests.erl +84 -45
- data/tracks/erlang/exercises/collatz-conjecture/test/collatz_conjecture_tests.erl +2 -0
- data/tracks/erlang/exercises/hamming/src/example.erl +10 -10
- data/tracks/erlang/exercises/hamming/src/hamming.erl +4 -4
- data/tracks/erlang/exercises/hamming/test/hamming_tests.erl +54 -13
- data/tracks/erlang/exercises/hello-world/test/hello_world_tests.erl +2 -0
- data/tracks/erlang/exercises/leap/test/leap_tests.erl +2 -0
- data/tracks/erlang/exercises/rna-transcription/src/example.erl +6 -2
- data/tracks/erlang/exercises/rna-transcription/src/rna_transcription.erl +3 -3
- data/tracks/erlang/exercises/rna-transcription/test/rna_transcription_tests.erl +24 -14
- data/tracks/erlang/testgen/src/tgen.erl +1 -0
- data/tracks/erlang/testgen/src/tgen_bob.erl +29 -0
- data/tracks/erlang/testgen/src/tgen_hamming.erl +41 -0
- data/tracks/erlang/testgen/src/tgen_rna-transcription.erl +38 -0
- data/tracks/fsharp/exercises/etl/Etl.fs +2 -2
- data/tracks/fsharp/exercises/etl/EtlTest.fs +72 -29
- data/tracks/fsharp/exercises/etl/Example.fs +10 -5
- data/tracks/fsharp/exercises/nth-prime/NthPrimeTest.fs +1 -1
- data/tracks/fsharp/exercises/nucleotide-count/Example.fs +7 -3
- data/tracks/fsharp/exercises/nucleotide-count/NucleotideCount.fs +1 -3
- data/tracks/fsharp/exercises/nucleotide-count/NucleotideCountTest.fs +51 -33
- data/tracks/fsharp/generators/Generators.fs +48 -2
- data/tracks/gnu-apl/README.md +49 -14
- data/tracks/python/exercises/flatten-array/flatten_array_test.py +18 -11
- data/tracks/python/exercises/pig-latin/example.py +2 -1
- data/tracks/python/exercises/pig-latin/pig_latin_test.py +10 -4
- 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,
|
6
|
+
-define(TEST_VERSION, 2).
|
5
7
|
-include("exercism.hrl").
|
6
8
|
|
7
9
|
|
8
|
-
|
9
|
-
|
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
|
-
|
12
|
-
|
43
|
+
same_nucleotides_in_different_positions_test() ->
|
44
|
+
?assertMatch(2, ?TESTED_MODULE:distance("TAG", "GAT")).
|
13
45
|
|
14
|
-
|
15
|
-
|
46
|
+
large_distance_test() ->
|
47
|
+
?assertMatch(4,
|
48
|
+
?TESTED_MODULE:distance("GATACA", "GCATAA")).
|
16
49
|
|
17
|
-
|
18
|
-
|
50
|
+
large_distance_in_off_by_one_strand_test() ->
|
51
|
+
?assertMatch(9,
|
52
|
+
?TESTED_MODULE:distance("GGACGGATTCTG",
|
53
|
+
"AGGACGGATTCT")).
|
19
54
|
|
20
|
-
|
21
|
-
|
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
|
-
|
24
|
-
|
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")).
|
@@ -2,10 +2,14 @@
|
|
2
2
|
-export([to_rna/1, test_version/0]).
|
3
3
|
|
4
4
|
to_rna(Strand) ->
|
5
|
-
|
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
|
-
|
12
|
+
2.
|
9
13
|
|
10
14
|
|
11
15
|
|
@@ -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,
|
6
|
+
-define(TEST_VERSION, 2).
|
5
7
|
-include("exercism.hrl").
|
6
8
|
|
7
9
|
|
8
|
-
|
9
|
-
|
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
|
-
|
12
|
-
|
22
|
+
rna_complement_test() ->
|
23
|
+
?assertMatch("UGCACCAGAAUU",
|
24
|
+
?TESTED_MODULE:to_rna("ACGTGGTCTTAA")).
|
13
25
|
|
14
|
-
|
15
|
-
|
26
|
+
correctly_handles_invalid_input_rna_instead_of_dna_test() ->
|
27
|
+
?assertMatch(error, ?TESTED_MODULE:to_rna("U")).
|
16
28
|
|
17
|
-
|
18
|
-
|
29
|
+
correctly_handles_completely_invalid_dna_input_test() ->
|
30
|
+
?assertMatch(error, ?TESTED_MODULE:to_rna("XXX")).
|
19
31
|
|
20
|
-
|
21
|
-
|
22
|
-
|
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
|
1
|
+
module Etl
|
2
2
|
|
3
|
-
let transform (scoresWithLetters: Map<int,
|
3
|
+
let transform (scoresWithLetters: Map<int, char list>): Map<char, int> = failwith "You need to implement this function."
|
@@ -1,39 +1,82 @@
|
|
1
|
-
|
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
|
6
|
+
open Xunit
|
7
|
+
|
8
|
+
open Etl
|
6
9
|
|
7
10
|
[<Fact>]
|
8
|
-
let ``
|
9
|
-
let
|
10
|
-
let expected = [(
|
11
|
-
transform
|
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 ``
|
15
|
-
let
|
16
|
-
let expected =
|
17
|
-
|
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 ``
|
21
|
-
let
|
22
|
-
|
23
|
-
|
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 ``
|
27
|
-
let
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
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
|
1
|
+
module Etl
|
2
2
|
|
3
|
-
|
3
|
+
open System
|
4
4
|
|
5
|
-
let
|
5
|
+
let normalizeLetter letter = Char.ToLowerInvariant(letter)
|
6
6
|
|
7
|
-
let
|
7
|
+
let transformLetterWithScore score lettersWithScore letter =
|
8
|
+
Map.add (normalizeLetter letter) score lettersWithScore
|
8
9
|
|
9
|
-
let
|
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
|
-
module
|
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
|
-
|
14
|
-
|
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
|