commit a1b3b2fa940aa49521730f37c5e98bf30c5d66e7
parent 81ec0205348f6f9aa0d103c31a97d23f29d8d886
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Thu, 30 Mar 2023 00:23:43 -0700
simplify code
Diffstat:
1 file changed, 28 insertions(+), 39 deletions(-)
diff --git a/src/lechatphp/mod.rs b/src/lechatphp/mod.rs
@@ -286,55 +286,44 @@ fn solve_difficulty3(img: &DynamicImage) -> Result<String, CaptchaErr> {
retry += 1;
let square = img.crop_imm(rect.p1.x, rect.p1.y, rect.width, rect.height);
let red_px_pts = get_contour_red_pixels(&rect.p1, &square);
-
- if i == 0 {
- if red_px_pts.len() != 1 {
- if retry < 10 {
- rect.enlarge();
- continue;
- }
- return Err(CaptchaErr(format!("root {:?} does not have exactly 1 line detected", letter)));
- }
- let red_pt = red_px_pts.get(0).unwrap();
- let angle = get_angle(red_pt, &letter.center());
- let neighbor = get_letter_in_direction(&letter, angle, &letters_map).unwrap();
- letter = neighbor.clone();
- break 'retry_loop;
- }
-
- if red_px_pts.len() != 2 {
+ let mut nb_branches = if i == 0 { 1 } else { 2 };
+ if red_px_pts.len() != nb_branches {
if retry < 10 {
rect.enlarge();
- continue;
+ continue 'retry_loop;
}
- return Err(CaptchaErr(format!("letter #{} {:?} doesn't have exactly 2 lines detected", i+1, letter)));
+ return Err(CaptchaErr(format!("letter #{} {:?} invalid nb lines detected", i+1, letter)));
}
+ letter = get_next_node(&red_px_pts, &letter, &letters_map, &visited, i, nb_branches)?;
+ break 'retry_loop;
+ }
+ }
+ Ok(answer)
+}
- let fst_red_pt = red_px_pts.get(0).unwrap();
- let angle = get_angle(fst_red_pt, &letter.center());
- let mut neighbor = get_letter_in_direction(&letter, angle, &letters_map).unwrap();
-
- if visited.contains(&neighbor) {
- let fst_red_pt = red_px_pts.get(1).unwrap();
- let angle = get_angle(fst_red_pt, &letter.center());
- neighbor = get_letter_in_direction(&letter, angle, &letters_map).unwrap();
- if visited.contains(&neighbor) {
- if i == 3 {
- for (_, l) in letters_map.iter() {
- if !visited.contains(&l) {
- letter = l.clone();
- break 'retry_loop;
- }
- }
+fn get_next_node(red_px_pts: &Vec<Point>, letter: &Letter, letters_map: &HashMap<char, Letter>, visited: &HashSet<Letter>, i: i32, nb_branches: usize) -> Result<Letter, CaptchaErr> {
+ let mut res: Option<Letter> = None;
+ 'some_loop: for idx in 0..nb_branches {
+ let fst_red_pt = red_px_pts.get(idx).unwrap();
+ let angle = get_angle(fst_red_pt, &letter.center());
+ let neighbor = get_letter_in_direction(&letter, angle, &letters_map).unwrap();
+ if visited.contains(&neighbor) {
+ if i == 3 {
+ for (_, l) in letters_map.iter() {
+ if !visited.contains(&l) {
+ res = Some(l.clone());
+ break 'some_loop;
}
- return Err(CaptchaErr(format!("letter #{} {:?} all neighbors already visited", i+1, letter)));
}
}
- letter = neighbor;
- break;
+ continue;
}
+ res = Some(neighbor);
+ }
+ match res {
+ Some(res) => Ok(res),
+ None => Err(CaptchaErr(format!("letter #{} {:?} all neighbors already visited", i+1, letter))),
}
- Ok(answer)
}