trackler 2.0.8.6 → 2.0.8.7
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/bin/verify-metadata +7 -11
- data/lib/trackler/version.rb +1 -1
- data/tracks/clojure/config.json +5 -0
- data/tracks/clojure/exercises/luhn/luhn.mustache +9 -0
- data/tracks/clojure/exercises/luhn/src/example.clj +11 -9
- data/tracks/clojure/exercises/luhn/test/luhn_test.clj +29 -29
- data/tracks/clojure/exercises/nth-prime/project.clj +4 -0
- data/tracks/clojure/exercises/nth-prime/src/example.clj +33 -0
- data/tracks/clojure/exercises/nth-prime/test/nth_prime_test.clj +23 -0
- data/tracks/go/exercises/TRACK_HINTS.md +3 -0
- data/tracks/go/exercises/ocr-numbers/example.go +2 -0
- data/tracks/go/exercises/ocr-numbers/ocr_numbers_test.go +8 -0
- data/tracks/go/exercises/octal/octal_test.go +6 -6
- data/tracks/go/exercises/paasio/paasio_test.go +5 -3
- data/tracks/go/exercises/palindrome-products/palindrome_products_test.go +6 -6
- data/tracks/go/exercises/strain/strain_test.go +37 -39
- data/tracks/julia/config.json +19 -0
- data/tracks/julia/exercises/etl/etl.jl +4 -0
- data/tracks/julia/exercises/etl/example.jl +11 -0
- data/tracks/julia/exercises/etl/runtests.jl +36 -0
- data/tracks/julia/exercises/pascals-triangle/example.jl +1 -0
- data/tracks/julia/exercises/pascals-triangle/pascals-triangle.jl +3 -0
- data/tracks/julia/exercises/pascals-triangle/runtests.jl +14 -0
- data/tracks/rust/config.json +22 -1
- data/tracks/rust/exercises/luhn-from/.gitignore +7 -0
- data/tracks/rust/exercises/luhn-from/Cargo.toml +3 -0
- data/tracks/rust/exercises/luhn-from/description.md +9 -0
- data/tracks/rust/exercises/luhn-from/example.rs +62 -0
- data/tracks/rust/exercises/luhn-from/metadata.yml +3 -0
- data/tracks/rust/exercises/luhn-from/tests/luhn-from.rs +101 -0
- data/tracks/rust/exercises/luhn-trait/.gitignore +7 -0
- data/tracks/rust/exercises/luhn-trait/Cargo.toml +3 -0
- data/tracks/rust/exercises/luhn-trait/description.md +17 -0
- data/tracks/rust/exercises/luhn-trait/example.rs +55 -0
- data/tracks/rust/exercises/luhn-trait/metadata.yml +3 -0
- data/tracks/rust/exercises/luhn-trait/tests/luhn-trait.rs +59 -0
- data/tracks/rust/exercises/nucleotide-codons/tests/codons.rs +24 -5
- data/tracks/rust/exercises/protein-translation/Cargo.lock +4 -0
- data/tracks/rust/exercises/protein-translation/Cargo.toml +4 -0
- data/tracks/rust/exercises/protein-translation/example.rs +40 -0
- data/tracks/rust/exercises/protein-translation/tests/proteins.rs +116 -0
- metadata +28 -2
@@ -0,0 +1,59 @@
|
|
1
|
+
extern crate luhn_trait;
|
2
|
+
|
3
|
+
use luhn_trait::*;
|
4
|
+
|
5
|
+
#[test]
|
6
|
+
fn you_can_validate_from_a_str() {
|
7
|
+
assert!("046 454 286".valid_luhn());
|
8
|
+
assert!(!"046 454 287".valid_luhn());
|
9
|
+
}
|
10
|
+
|
11
|
+
#[test]
|
12
|
+
#[ignore]
|
13
|
+
fn you_can_validate_from_a_string() {
|
14
|
+
assert!(String::from("046 454 286").valid_luhn());
|
15
|
+
assert!(!String::from("046 454 287").valid_luhn());
|
16
|
+
}
|
17
|
+
|
18
|
+
#[test]
|
19
|
+
#[ignore]
|
20
|
+
fn you_can_validate_from_a_u8() {
|
21
|
+
assert!(240u8.valid_luhn());
|
22
|
+
assert!(!241u8.valid_luhn());
|
23
|
+
}
|
24
|
+
|
25
|
+
#[test]
|
26
|
+
#[ignore]
|
27
|
+
fn you_can_validate_from_a_u16() {
|
28
|
+
let valid = 64_436u16;
|
29
|
+
let invalid = 64_437u16;
|
30
|
+
assert!(valid.valid_luhn());
|
31
|
+
assert!(!invalid.valid_luhn());
|
32
|
+
}
|
33
|
+
|
34
|
+
#[test]
|
35
|
+
#[ignore]
|
36
|
+
fn you_can_validate_from_a_u32() {
|
37
|
+
let valid = 46_454_286u32;
|
38
|
+
let invalid = 46_454_287u32;
|
39
|
+
assert!(valid.valid_luhn());
|
40
|
+
assert!(!invalid.valid_luhn());
|
41
|
+
}
|
42
|
+
|
43
|
+
#[test]
|
44
|
+
#[ignore]
|
45
|
+
fn you_can_validate_from_a_u64() {
|
46
|
+
let valid = 8273_1232_7352_0562u64;
|
47
|
+
let invalid = 8273_1232_7352_0569u64;
|
48
|
+
assert!(valid.valid_luhn());
|
49
|
+
assert!(!invalid.valid_luhn());
|
50
|
+
}
|
51
|
+
|
52
|
+
#[test]
|
53
|
+
#[ignore]
|
54
|
+
fn you_can_validate_from_a_usize() {
|
55
|
+
let valid = 8273_1232_7352_0562usize;
|
56
|
+
let invalid = 8273_1232_7352_0569usize;
|
57
|
+
assert!(valid.valid_luhn());
|
58
|
+
assert!(!invalid.valid_luhn());
|
59
|
+
}
|
@@ -17,7 +17,8 @@ fn test_cysteine_tgt() {
|
|
17
17
|
#[ignore]
|
18
18
|
fn test_cysteine_tgy() { // "compressed" name for TGT and TGC
|
19
19
|
let info = codons::parse(make_pairs());
|
20
|
-
assert_eq!(info.name_for("
|
20
|
+
assert_eq!(info.name_for("TGT"), info.name_for("TGY"));
|
21
|
+
assert_eq!(info.name_for("TGC"), info.name_for("TGY"));
|
21
22
|
}
|
22
23
|
|
23
24
|
#[test]
|
@@ -54,12 +55,30 @@ fn test_arginine_name() {
|
|
54
55
|
|
55
56
|
#[test]
|
56
57
|
#[ignore]
|
57
|
-
fn
|
58
|
+
fn empty_is_invalid() {
|
58
59
|
let info = codons::parse(make_pairs());
|
59
60
|
assert!(info.name_for("").is_err());
|
60
|
-
|
61
|
-
|
62
|
-
|
61
|
+
}
|
62
|
+
|
63
|
+
#[test]
|
64
|
+
#[ignore]
|
65
|
+
fn x_is_not_shorthand_so_is_invalid() {
|
66
|
+
let info = codons::parse(make_pairs());
|
67
|
+
assert!(info.name_for("VWX").is_err());
|
68
|
+
}
|
69
|
+
|
70
|
+
#[test]
|
71
|
+
#[ignore]
|
72
|
+
fn too_short_is_invalid() {
|
73
|
+
let info = codons::parse(make_pairs());
|
74
|
+
assert!(info.name_for("AT").is_err());
|
75
|
+
}
|
76
|
+
|
77
|
+
#[test]
|
78
|
+
#[ignore]
|
79
|
+
fn too_long_is_invalid() {
|
80
|
+
let info = codons::parse(make_pairs());
|
81
|
+
assert!(info.name_for("ATTA").is_err());
|
63
82
|
}
|
64
83
|
|
65
84
|
// The input data constructor. Returns a list of codon, name pairs.
|
@@ -0,0 +1,40 @@
|
|
1
|
+
use std::collections::HashMap;
|
2
|
+
|
3
|
+
pub struct CodonInfo<'a> {
|
4
|
+
actual_codons: HashMap<&'a str, &'a str>
|
5
|
+
}
|
6
|
+
|
7
|
+
pub fn parse<'a>(pairs: Vec<(&'a str, &'a str)>) -> CodonInfo<'a> {
|
8
|
+
CodonInfo{
|
9
|
+
actual_codons: pairs.into_iter().collect()
|
10
|
+
}
|
11
|
+
}
|
12
|
+
|
13
|
+
impl<'a> CodonInfo<'a> {
|
14
|
+
pub fn name_for(&self, codon: &str) -> Result<&'a str, &'static str> {
|
15
|
+
if codon.len() != 3 {
|
16
|
+
return Err("invalid length")
|
17
|
+
}
|
18
|
+
|
19
|
+
let mut valid = true;
|
20
|
+
let lookup: String = codon.chars().map(|l| {
|
21
|
+
// Get an example of a "letter" represented by the possibly encoded letter.
|
22
|
+
// Since every codon represented by the compressed notation has to be of
|
23
|
+
// the desired amino acid just picking one at random will do.
|
24
|
+
match l {
|
25
|
+
'A' | 'W' | 'M' | 'R' | 'D' | 'H' | 'V' | 'N' => 'A',
|
26
|
+
'C' | 'S' | 'Y' | 'B' => 'C',
|
27
|
+
'G' | 'K' => 'G',
|
28
|
+
'T' => 'T',
|
29
|
+
_ => { valid = false; ' ' }
|
30
|
+
}
|
31
|
+
}).collect();
|
32
|
+
if !valid {
|
33
|
+
return Err("invalid char")
|
34
|
+
}
|
35
|
+
|
36
|
+
// If the input table is correct (which it is) every valid codon is in it
|
37
|
+
// so unwrap() shouldn't panic.
|
38
|
+
Ok(self.actual_codons.get(&lookup.as_ref()).unwrap())
|
39
|
+
}
|
40
|
+
}
|
@@ -0,0 +1,116 @@
|
|
1
|
+
extern crate protein_translation as proteins;
|
2
|
+
|
3
|
+
#[test]
|
4
|
+
fn test_methionine() {
|
5
|
+
let info = proteins::parse(make_pairs());
|
6
|
+
assert_eq!(info.name_for("ATG"), Ok("methionine"));
|
7
|
+
}
|
8
|
+
|
9
|
+
#[test]
|
10
|
+
#[ignore]
|
11
|
+
fn test_cysteine_tgt() {
|
12
|
+
let info = proteins::parse(make_pairs());
|
13
|
+
assert_eq!(info.name_for("TGT"), Ok("cysteine"));
|
14
|
+
}
|
15
|
+
|
16
|
+
#[test]
|
17
|
+
#[ignore]
|
18
|
+
fn test_cysteine_tgy() { // "compressed" name for TGT and TGC
|
19
|
+
let info = proteins::parse(make_pairs());
|
20
|
+
assert_eq!(info.name_for("TGT"), info.name_for("TGY"));
|
21
|
+
assert_eq!(info.name_for("TGC"), info.name_for("TGY"));
|
22
|
+
}
|
23
|
+
|
24
|
+
#[test]
|
25
|
+
#[ignore]
|
26
|
+
fn test_stop() {
|
27
|
+
let info = proteins::parse(make_pairs());
|
28
|
+
assert_eq!(info.name_for("TAA"), Ok("stop codon"));
|
29
|
+
}
|
30
|
+
|
31
|
+
#[test]
|
32
|
+
#[ignore]
|
33
|
+
fn test_valine() {
|
34
|
+
let info = proteins::parse(make_pairs());
|
35
|
+
assert_eq!(info.name_for("GTN"), Ok("valine"));
|
36
|
+
}
|
37
|
+
|
38
|
+
|
39
|
+
#[test]
|
40
|
+
#[ignore]
|
41
|
+
fn test_isoleucine() {
|
42
|
+
let info = proteins::parse(make_pairs());
|
43
|
+
assert_eq!(info.name_for("ATH"), Ok("isoleucine"));
|
44
|
+
}
|
45
|
+
|
46
|
+
#[test]
|
47
|
+
#[ignore]
|
48
|
+
fn test_arginine_name() {
|
49
|
+
// In arginine CGA can be "compresed" both as CGN and as MGR
|
50
|
+
let info = proteins::parse(make_pairs());
|
51
|
+
assert_eq!(info.name_for("CGA"), Ok("arginine"));
|
52
|
+
assert_eq!(info.name_for("CGN"), Ok("arginine"));
|
53
|
+
assert_eq!(info.name_for("MGR"), Ok("arginine"));
|
54
|
+
}
|
55
|
+
|
56
|
+
#[test]
|
57
|
+
#[ignore]
|
58
|
+
fn empty_is_invalid() {
|
59
|
+
let info = proteins::parse(make_pairs());
|
60
|
+
assert!(info.name_for("").is_err());
|
61
|
+
}
|
62
|
+
|
63
|
+
#[test]
|
64
|
+
#[ignore]
|
65
|
+
fn x_is_not_shorthand_so_is_invalid() {
|
66
|
+
let info = proteins::parse(make_pairs());
|
67
|
+
assert!(info.name_for("VWX").is_err());
|
68
|
+
}
|
69
|
+
|
70
|
+
#[test]
|
71
|
+
#[ignore]
|
72
|
+
fn too_short_is_invalid() {
|
73
|
+
let info = proteins::parse(make_pairs());
|
74
|
+
assert!(info.name_for("AT").is_err());
|
75
|
+
}
|
76
|
+
|
77
|
+
#[test]
|
78
|
+
#[ignore]
|
79
|
+
fn too_long_is_invalid() {
|
80
|
+
let info = proteins::parse(make_pairs());
|
81
|
+
assert!(info.name_for("ATTA").is_err());
|
82
|
+
}
|
83
|
+
|
84
|
+
// The input data constructor. Returns a list of codon, name pairs.
|
85
|
+
fn make_pairs() -> Vec<(&'static str, &'static str)> {
|
86
|
+
let grouped = vec![
|
87
|
+
("isoleucine", vec!["ATT", "ATC", "ATA"]),
|
88
|
+
("leucine", vec!["CTT", "CTC", "CTA", "CTG", "TTA", "TTG"]),
|
89
|
+
("valine", vec!["GTT", "GTC", "GTA", "GTG"]),
|
90
|
+
("phenylalanine", vec!["TTT", "TTC"]),
|
91
|
+
("methionine", vec!["ATG"]),
|
92
|
+
("cysteine", vec!["TGT", "TGC"]),
|
93
|
+
("alanine", vec!["GCT", "GCC", "GCA", "GCG"]),
|
94
|
+
("glycine", vec!["GGT", "GGC", "GGA", "GGG"]),
|
95
|
+
("proline", vec!["CCT", "CCC", "CCA", "CCG"]),
|
96
|
+
("threonine", vec!["ACT", "ACC", "ACA", "ACG"]),
|
97
|
+
("serine", vec!["TCT", "TCC", "TCA", "TCG", "AGT", "AGC"]),
|
98
|
+
("tyrosine", vec!["TAT", "TAC"]),
|
99
|
+
("tryptophan", vec!["TGG"]),
|
100
|
+
("glutamine", vec!["CAA", "CAG"]),
|
101
|
+
("asparagine", vec!["AAT", "AAC"]),
|
102
|
+
("histidine", vec!["CAT", "CAC"]),
|
103
|
+
("glutamic acid", vec!["GAA", "GAG"]),
|
104
|
+
("aspartic acid", vec!["GAT", "GAC"]),
|
105
|
+
("lysine", vec!["AAA", "AAG"]),
|
106
|
+
("arginine", vec!["CGT", "CGC", "CGA", "CGG", "AGA", "AGG"]),
|
107
|
+
("stop codon", vec!["TAA", "TAG", "TGA"])];
|
108
|
+
let mut pairs = Vec::<(&'static str, &'static str)>::new();
|
109
|
+
for (name, codons) in grouped.into_iter() {
|
110
|
+
for codon in codons {
|
111
|
+
pairs.push((codon, name));
|
112
|
+
}
|
113
|
+
};
|
114
|
+
pairs.sort_by(|&(_, a), &(_, b)| a.cmp(b));
|
115
|
+
return pairs
|
116
|
+
}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: trackler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.8.
|
4
|
+
version: 2.0.8.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Katrina Owen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-02-
|
11
|
+
date: 2017-02-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rubyzip
|
@@ -930,6 +930,7 @@ files:
|
|
930
930
|
- tracks/clojure/exercises/leap/project.clj
|
931
931
|
- tracks/clojure/exercises/leap/src/example.clj
|
932
932
|
- tracks/clojure/exercises/leap/test/leap_test.clj
|
933
|
+
- tracks/clojure/exercises/luhn/luhn.mustache
|
933
934
|
- tracks/clojure/exercises/luhn/project.clj
|
934
935
|
- tracks/clojure/exercises/luhn/src/example.clj
|
935
936
|
- tracks/clojure/exercises/luhn/test/luhn_test.clj
|
@@ -939,6 +940,9 @@ files:
|
|
939
940
|
- tracks/clojure/exercises/minesweeper/project.clj
|
940
941
|
- tracks/clojure/exercises/minesweeper/src/example.clj
|
941
942
|
- tracks/clojure/exercises/minesweeper/test/minesweeper_test.clj
|
943
|
+
- tracks/clojure/exercises/nth-prime/project.clj
|
944
|
+
- tracks/clojure/exercises/nth-prime/src/example.clj
|
945
|
+
- tracks/clojure/exercises/nth-prime/test/nth_prime_test.clj
|
942
946
|
- tracks/clojure/exercises/nucleotide-count/project.clj
|
943
947
|
- tracks/clojure/exercises/nucleotide-count/src/example.clj
|
944
948
|
- tracks/clojure/exercises/nucleotide-count/test/nucleotide_count_test.clj
|
@@ -4365,6 +4369,9 @@ files:
|
|
4365
4369
|
- tracks/julia/exercises/difference-of-squares/difference-of-squares.jl
|
4366
4370
|
- tracks/julia/exercises/difference-of-squares/example.jl
|
4367
4371
|
- tracks/julia/exercises/difference-of-squares/runtests.jl
|
4372
|
+
- tracks/julia/exercises/etl/etl.jl
|
4373
|
+
- tracks/julia/exercises/etl/example.jl
|
4374
|
+
- tracks/julia/exercises/etl/runtests.jl
|
4368
4375
|
- tracks/julia/exercises/gigasecond/example.jl
|
4369
4376
|
- tracks/julia/exercises/gigasecond/gigasecond.jl
|
4370
4377
|
- tracks/julia/exercises/gigasecond/runtests.jl
|
@@ -4389,6 +4396,9 @@ files:
|
|
4389
4396
|
- tracks/julia/exercises/pangram/example.jl
|
4390
4397
|
- tracks/julia/exercises/pangram/pangram.jl
|
4391
4398
|
- tracks/julia/exercises/pangram/runtests.jl
|
4399
|
+
- tracks/julia/exercises/pascals-triangle/example.jl
|
4400
|
+
- tracks/julia/exercises/pascals-triangle/pascals-triangle.jl
|
4401
|
+
- tracks/julia/exercises/pascals-triangle/runtests.jl
|
4392
4402
|
- tracks/julia/exercises/raindrops/example.jl
|
4393
4403
|
- tracks/julia/exercises/raindrops/raindrops.jl
|
4394
4404
|
- tracks/julia/exercises/raindrops/runtests.jl
|
@@ -6899,6 +6909,18 @@ files:
|
|
6899
6909
|
- tracks/rust/exercises/leap/Cargo.toml
|
6900
6910
|
- tracks/rust/exercises/leap/example.rs
|
6901
6911
|
- tracks/rust/exercises/leap/tests/leap.rs
|
6912
|
+
- tracks/rust/exercises/luhn-from/.gitignore
|
6913
|
+
- tracks/rust/exercises/luhn-from/Cargo.toml
|
6914
|
+
- tracks/rust/exercises/luhn-from/description.md
|
6915
|
+
- tracks/rust/exercises/luhn-from/example.rs
|
6916
|
+
- tracks/rust/exercises/luhn-from/metadata.yml
|
6917
|
+
- tracks/rust/exercises/luhn-from/tests/luhn-from.rs
|
6918
|
+
- tracks/rust/exercises/luhn-trait/.gitignore
|
6919
|
+
- tracks/rust/exercises/luhn-trait/Cargo.toml
|
6920
|
+
- tracks/rust/exercises/luhn-trait/description.md
|
6921
|
+
- tracks/rust/exercises/luhn-trait/example.rs
|
6922
|
+
- tracks/rust/exercises/luhn-trait/metadata.yml
|
6923
|
+
- tracks/rust/exercises/luhn-trait/tests/luhn-trait.rs
|
6902
6924
|
- tracks/rust/exercises/luhn/.gitignore
|
6903
6925
|
- tracks/rust/exercises/luhn/Cargo.toml
|
6904
6926
|
- tracks/rust/exercises/luhn/example.rs
|
@@ -6946,6 +6968,10 @@ files:
|
|
6946
6968
|
- tracks/rust/exercises/phone-number/Cargo.toml
|
6947
6969
|
- tracks/rust/exercises/phone-number/example.rs
|
6948
6970
|
- tracks/rust/exercises/phone-number/tests/phone-number.rs
|
6971
|
+
- tracks/rust/exercises/protein-translation/Cargo.lock
|
6972
|
+
- tracks/rust/exercises/protein-translation/Cargo.toml
|
6973
|
+
- tracks/rust/exercises/protein-translation/example.rs
|
6974
|
+
- tracks/rust/exercises/protein-translation/tests/proteins.rs
|
6949
6975
|
- tracks/rust/exercises/queen-attack/.gitignore
|
6950
6976
|
- tracks/rust/exercises/queen-attack/Cargo.lock
|
6951
6977
|
- tracks/rust/exercises/queen-attack/Cargo.toml
|