PRTM
This commit is contained in:
parent
8f8f35f06f
commit
acb5c8976e
@ -6,6 +6,7 @@ use utils::run_solution;
|
|||||||
#[derive(clap::ValueEnum, Clone, Debug)]
|
#[derive(clap::ValueEnum, Clone, Debug)]
|
||||||
enum Problem {
|
enum Problem {
|
||||||
REVP,
|
REVP,
|
||||||
|
PRTM,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Parser, Debug)]
|
#[derive(Parser, Debug)]
|
||||||
|
@ -1,2 +1,4 @@
|
|||||||
|
mod prtm;
|
||||||
mod revp;
|
mod revp;
|
||||||
|
pub use prtm::prtm;
|
||||||
pub use revp::revp;
|
pub use revp::revp;
|
||||||
|
32
rust/src/solutions/prtm.rs
Normal file
32
rust/src/solutions/prtm.rs
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
use crate::utils::AMINO_ACID_MASS_TABLE;
|
||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
pub fn prtm(file_content: String) -> String {
|
||||||
|
let mut out_mass = 0.0;
|
||||||
|
let mass_map: HashMap<char, f64> = AMINO_ACID_MASS_TABLE.iter().cloned().collect();
|
||||||
|
for aa in file_content.trim().chars() {
|
||||||
|
out_mass += mass_map
|
||||||
|
.get(&aa)
|
||||||
|
.expect("The given letter was not in the map");
|
||||||
|
}
|
||||||
|
// rounds to 3 decimal places
|
||||||
|
return ((out_mass * 1000.0).round() / 1000.0).to_string();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_prtm() {
|
||||||
|
let input_content = "SKADYEK".to_string();
|
||||||
|
let expected = "821.392";
|
||||||
|
assert_eq!(prtm(input_content), expected);
|
||||||
|
}
|
||||||
|
#[test]
|
||||||
|
fn test_prtm_float64() {
|
||||||
|
let input_content = "DVMPGSWEYQNMGDENESNPGQTQHYCIDWAGWRDTHPNCPQMPEFSISGPPYIAKRPSCKISPMDKLTATYWEAHAFNARVLKSNCMWQCPMLMNHMQNAQCCGFGRWECAWMTAINQGSFDYARFGFYTATINASFILCTDWIMVVWSRPSARVSKRWHYDPQSGAYSRENCYVHNYLPHDQNRCIYGNFQTFHGTFCVRGPSSVNTADWWTQRCYMPHQQMLVQPSRMWYTGARPHPRWTHRHNHIRFWWGCHKVCYKWIRGNDIHCHKFTYVVNGSGKATGCEALCNEWQTWGHRFQLESGYRQMCANRCSNRKEHYICDVCGRYFVNYVSFRLLLMKPDDMYETGDIFEGLSIYGTNHKGIVPLWPIMHRMAIKTKTAACEFQGTEKQPVTKVDSNRWCMNGWEQPITTMIQVGLSMGYVRWVCMAGPTSQPQAGGNFPEHPVMQCQKVRQECVLCPMSGRMEPWRTDFGDHNGMDIKVMNNFQPMCISTGTIMLNDPCMSIVDKSAEYCYTWFFVDFWKWYAVPNIIDREWGCCCNNSCEKDYRSRAKADTHHVCSVYFQTVNSRFRPARENYKHTGFRMLQRLPIHNTAAANDMVYLVHMMIRHFFPLLHKPCDETGPHNGKIKWFWLCGDINWARSSDSYIRWLNNYMWFMSERMVNWRFIEKDNQVFDAYRASAWFVGWVLWRQDGFACGHCQLECRHTFAMDEMSHGGIYWNRPVQLVEARGPHCMRLHHLQQGFILIWDFMNDLGQRKDFGCSTHGYGFNYNNFQHIDAWTMYTFTEASNFCTITAHDDADLLPHHCRPRGKCGVTNCKQNALIIATPLRYILHRVTVTCIGLQVQCRCTDGIMDENFALCMVIIHLLNYYHTNAFRRLKTHNENSSKPDNWCNNRGGHMCMKTTRVMETKWLEATLW".to_string();
|
||||||
|
let expected = "107861.254";
|
||||||
|
assert_eq!(prtm(input_content), expected);
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,29 @@
|
|||||||
use crate::{solutions, Problem};
|
use crate::{solutions, Problem};
|
||||||
use std::{fs, io};
|
use std::{fs, io};
|
||||||
|
|
||||||
|
pub const AMINO_ACID_MASS_TABLE: [(char, f64); 20] = [
|
||||||
|
('A', 71.03711),
|
||||||
|
('C', 103.00919),
|
||||||
|
('D', 115.02694),
|
||||||
|
('E', 129.04259),
|
||||||
|
('F', 147.06841),
|
||||||
|
('G', 57.02146),
|
||||||
|
('H', 137.05891),
|
||||||
|
('I', 113.08406),
|
||||||
|
('K', 128.09496),
|
||||||
|
('L', 113.08406),
|
||||||
|
('M', 131.04049),
|
||||||
|
('N', 114.04293),
|
||||||
|
('P', 97.05276),
|
||||||
|
('Q', 128.05858),
|
||||||
|
('R', 156.10111),
|
||||||
|
('S', 87.03203),
|
||||||
|
('T', 101.04768),
|
||||||
|
('V', 99.06841),
|
||||||
|
('W', 186.07931),
|
||||||
|
('Y', 163.06333),
|
||||||
|
];
|
||||||
|
|
||||||
pub struct FastaRecord {
|
pub struct FastaRecord {
|
||||||
pub id: String,
|
pub id: String,
|
||||||
pub sequence: String,
|
pub sequence: String,
|
||||||
@ -11,6 +34,7 @@ pub fn run_solution(problem: Problem, in_file: &String, out_file: &String) {
|
|||||||
let solution: io::Result<String> = match fs::read_to_string(in_file) {
|
let solution: io::Result<String> = match fs::read_to_string(in_file) {
|
||||||
Ok(content) => match problem {
|
Ok(content) => match problem {
|
||||||
Problem::REVP => Ok(solutions::revp(content)),
|
Problem::REVP => Ok(solutions::revp(content)),
|
||||||
|
Problem::PRTM => Ok(solutions::prtm(content)),
|
||||||
},
|
},
|
||||||
Err(e) => Err(e),
|
Err(e) => Err(e),
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user