SEDOLs: Difference between revisions
Content added Content deleted
Alextretyak (talk | contribs) (Added 11l) |
(Add Rust implementation) |
||
Line 3,361: | Line 3,361: | ||
1234567 #<ArgumentError: Invalid length> |
1234567 #<ArgumentError: Invalid length> |
||
00000A #<ArgumentError: No vowels> |
00000A #<ArgumentError: No vowels> |
||
</pre> |
|||
=={{header|Rust}}== |
|||
<lang rust> |
|||
fn sedol(input: &str) -> Option<String> { |
|||
let weights = vec![1, 3, 1, 7, 3, 9, 1]; |
|||
let valid_chars = "0123456789BCDFGHJKLMNPQRSTVWXYZ"; |
|||
if input.len() != 6 { |
|||
return None; |
|||
} |
|||
// could be done by regex if needed |
|||
for c in input.chars() { |
|||
if !valid_chars.contains(c) { |
|||
return None; |
|||
} |
|||
} |
|||
let mut result: u32 = input |
|||
.chars() |
|||
.map(|c| { |
|||
if c.is_digit(10) { |
|||
c as u32 - 48 |
|||
} else { |
|||
c as u32 - 55 |
|||
} |
|||
}) |
|||
.zip(weights) |
|||
.map(|(cnum, w)| w * cnum) |
|||
.collect::<Vec<u32>>() |
|||
.iter() |
|||
.sum(); |
|||
result = (10 - result % 10) % 10; |
|||
Some(input.to_owned() + &result.to_string()) |
|||
} |
|||
fn main() { |
|||
let inputs = vec![ |
|||
"710889", "B0YBKJ", "406566", "B0YBLH", "228276", "B0YBKL", "557910", "B0YBKR", "585284", |
|||
"B0YBKT", "B00030", |
|||
]; |
|||
for input in inputs { |
|||
println!("{} SEDOL: {:?}", &input, sedol(&input).unwrap()); |
|||
} |
|||
} |
|||
</lang> |
|||
{{out}} |
|||
<pre> |
|||
710889 SEDOL: "7108899" |
|||
B0YBKJ SEDOL: "B0YBKJ7" |
|||
406566 SEDOL: "4065663" |
|||
B0YBLH SEDOL: "B0YBLH2" |
|||
228276 SEDOL: "2282765" |
|||
B0YBKL SEDOL: "B0YBKL9" |
|||
557910 SEDOL: "5579107" |
|||
B0YBKR SEDOL: "B0YBKR5" |
|||
585284 SEDOL: "5852842" |
|||
B0YBKT SEDOL: "B0YBKT7" |
|||
B00030 SEDOL: "B000300" |
|||
</pre> |
</pre> |
||