pub fn roman_to_int(string: String) -> i32 { let mut characters = string.chars().peekable(); let mut number = 0; while let Some(character) = characters.next() { let value = match character { 'I' => 1, 'V' => 5, 'X' => 10, 'L' => 50, 'C' => 100, 'D' => 500, 'M' => 1000, _ => panic!("Unknown character: {character}"), }; if let Some(next) = characters.peek() { let subtract = match next { 'V' | 'X' if character == 'I' => true, 'L' | 'C' if character == 'X' => true, 'D' | 'M' if character == 'C' => true, _ => false, }; if subtract { number -= value; continue; } } number += value; } number } #[test] fn test_roman_to_integer() { assert_eq!(roman_to_int("III".to_string()), 3); assert_eq!(roman_to_int("LVIII".to_string()), 58); assert_eq!(roman_to_int("MCMXCIV".to_string()), 1994); assert_eq!(roman_to_int("XX".to_string()), 20); assert_eq!(roman_to_int("DCXXI".to_string()), 621); }