This commit is contained in:
Fizzizist 2025-02-24 20:33:28 -05:00
parent 8f8f35f06f
commit acb5c8976e
4 changed files with 59 additions and 0 deletions

View File

@ -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)]

View File

@ -1,2 +1,4 @@
mod prtm;
mod revp; mod revp;
pub use prtm::prtm;
pub use revp::revp; pub use revp::revp;

View 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);
}
}

View File

@ -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),
}; };