@@ -2,15 +2,17 @@ use regex::Regex;
pub fn extract_final_integer(text: &str) -> Option<String> {
let boxed = Regex::new(r"\\boxed\{\s*(-?\d+)\s*\}").expect("valid boxed integer regex");
if let Some(captures) = boxed.captures(text) {
if let Some(captures) = boxed.captures_iter (text).last( ) {
return captures.get(1).map(|value| value.as_str().to_string());
}
let integer = Regex::new(r"-?\d+").expect("valid integer regex");
integer
.find_iter(text)
let explicit =
Regex::new(r"(?i)\b(?:final\s+answer|answer|the\s+answer\s+is)\s*(?:is|:|-)?\s*(-?\d+)\b")
.expect("valid explicit integer answer regex");
explicit
.captures_iter(text)
.last()
.map(|value| value.as_str().to_string())
.and_then(|captures| captures.get(1). map(|value| value.as_str().to_string() ))
}
pub fn extract_choice(text: &str) -> Option<char> {
@@ -42,9 +44,9 @@ mod tests {
use super::*;
#[test]
fn extracts_final_integer_from_plain_ answer() {
fn extracts_final_integer_from_answer_prefix () {
assert_eq!(
extract_final_integer("The answer is 42."),
extract_final_integer("Final answer: 42."),
Some("42".to_string())
);
}
@@ -57,6 +59,22 @@ mod tests {
);
}
#[test]
fn extracts_last_boxed_integer() {
assert_eq!(
extract_final_integer(r"First \boxed{12}, final \boxed{34}"),
Some("34".to_string())
);
}
#[test]
fn ignores_trailing_integer_without_explicit_final_answer() {
assert_eq!(
extract_final_integer("The answer should be 393. I verified 30 cases."),
None
);
}
#[test]
fn extracts_choice_from_answer_prefix() {
assert_eq!(extract_choice("Answer: C"), Some('C'));
@@ -87,8 +105,8 @@ mod tests {
#[test]
fn judges_integer_by_extracted_value() {
assert!(judge_integer("Final: 42.", "42"));
assert!(!judge_integer("Final: 43.", "42"));
assert!(judge_integer("Final answer : 42.", "42"));
assert!(!judge_integer("Final answer : 43.", "42"));
}
#[test]