commit 8fb69816832f5d1bbdc82078c0e9aad40d6e9763
parent e1de40ffd00933d6e976656d08cce2c237522a20
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Thu, 30 Mar 2023 01:08:19 -0700
cleanup
Diffstat:
1 file changed, 17 insertions(+), 15 deletions(-)
diff --git a/src/lechatphp/mod.rs b/src/lechatphp/mod.rs
@@ -197,7 +197,6 @@ fn solve_difficulty3(img: &DynamicImage) -> Result<String, CaptchaErr> {
let image_width = 150;
let image_height = 200;
let min_px_for_letter = 21;
- let min_starting_pt_red_px = 50;
let mut letters_map: HashMap<char, Letter> = HashMap::new();
@@ -249,24 +248,12 @@ fn solve_difficulty3(img: &DynamicImage) -> Result<String, CaptchaErr> {
return Err(CaptchaErr(format!("did not find exactly 5 letters {}", letters_map.len())));
}
- let mut starting: Option<Letter> = None;
// Step2: Find the starting letter
- for (_, letter) in letters_map.iter() {
- let square = img.crop_imm(letter.offset.x-5, letter.offset.y-3, 8+5+6, 14+3+2);
- let count_red = count_red_px(&square);
- if count_red > min_starting_pt_red_px {
- starting = Some(letter.clone());
- break;
- }
- }
-
- if starting.is_none() {
- return Err(CaptchaErr("could not find starting letter".to_owned()));
- }
+ let starting = get_starting_letter(&img, &letters_map).ok_or(CaptchaErr("could not find starting letter".to_owned()))?;
let mut answer = String::new();
let mut visited = HashSet::<Letter>::new();
- let mut letter = starting.unwrap();
+ let mut letter = starting;
answer.push(letter.character);
visited.insert(letter.clone());
for i in 0..4 {
@@ -294,6 +281,21 @@ fn solve_difficulty3(img: &DynamicImage) -> Result<String, CaptchaErr> {
Ok(answer)
}
+fn get_starting_letter(img: &DynamicImage, letters_map: &HashMap<char, Letter>) -> Option<Letter> {
+ let min_starting_pt_red_px = 50;
+ let mut starting: Option<Letter> = None;
+ // Step2: Find the starting letter
+ for (_, letter) in letters_map.iter() {
+ let square = img.crop_imm(letter.offset.x-5, letter.offset.y-3, 8+5+6, 14+3+2);
+ let count_red = count_red_px(&square);
+ if count_red > min_starting_pt_red_px {
+ starting = Some(letter.clone());
+ break;
+ }
+ }
+ starting
+}
+
fn get_next_node(red_px_pts: &Vec<Point>, letter: &Letter, letters_map: &HashMap<char, Letter>, visited: &HashSet<Letter>, i: i32, nb_lines: usize) -> Result<Letter, CaptchaErr> {
let mut res: Option<Letter> = None;
'some_loop: for idx in 0..nb_lines {