commit 0aa296f7f6e4f0f5bd771bbfae12cdd3304f92d2
parent a1b3b2fa940aa49521730f37c5e98bf30c5d66e7
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Thu, 30 Mar 2023 00:52:19 -0700
cleanup
Diffstat:
1 file changed, 13 insertions(+), 20 deletions(-)
diff --git a/src/lechatphp/mod.rs b/src/lechatphp/mod.rs
@@ -265,45 +265,38 @@ fn solve_difficulty3(img: &DynamicImage) -> Result<String, CaptchaErr> {
}
let mut answer = String::new();
- let mut letter = starting.unwrap();
let mut visited = HashSet::<Letter>::new();
- for i in 0..5 {
- if visited.contains(&letter) {
- return Err(CaptchaErr(format!("already visited node {:?}", letter)));
- }
- answer.push(letter.character);
- // println!("visiting {:?}", letter);
- visited.insert(letter.clone());
- if i == 4 {
- break;
- }
-
+ let mut letter = starting.unwrap();
+ answer.push(letter.character);
+ visited.insert(letter.clone());
+ for i in 0..4 {
let top_left = Point::new(letter.offset.x-5, letter.offset.y-3);
let mut rect = Rect{p1: top_left, width: 8+5+6, height: 14+3+2};
-
let mut retry = 0;
'retry_loop: loop {
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);
- let mut nb_branches = if i == 0 { 1 } else { 2 };
- if red_px_pts.len() != nb_branches {
+ let nb_lines = if i == 0 { 1 } else { 2 };
+ if red_px_pts.len() != nb_lines {
if retry < 10 {
rect.enlarge();
continue 'retry_loop;
}
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)?;
+ letter = get_next_node(&red_px_pts, &letter, &letters_map, &visited, i, nb_lines)?;
break 'retry_loop;
}
+ answer.push(letter.character);
+ visited.insert(letter.clone());
}
Ok(answer)
}
-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> {
+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_branches {
+ 'some_loop: for idx in 0..nb_lines {
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();
@@ -364,8 +357,8 @@ struct Rect {
impl Rect {
fn enlarge(&mut self) {
- self.p1.x = std::cmp::max(self.p1.x-1, 0);
- self.p1.y = std::cmp::max(self.p1.y-1, 0);
+ self.p1.x = self.p1.x.checked_sub(1).unwrap_or(0);
+ self.p1.y = self.p1.y.checked_sub(1).unwrap_or(0);
self.width += 1;
self.height += 1;
}