commit fdc4721ec6cf37bd8b66bba09e665f6f2b6fe81a
parent 5789320f1242ed3dbc677509a96b97e1e75f4ce3
Author: n0tr1v <n0tr1v@protonmail.com>
Date: Wed, 29 Mar 2023 22:47:25 -0700
cleanup
Diffstat:
1 file changed, 17 insertions(+), 12 deletions(-)
diff --git a/src/lechatphp/mod.rs b/src/lechatphp/mod.rs
@@ -1,5 +1,6 @@
use std::collections::{HashMap, HashSet};
use std::fmt::{Display, Formatter};
+use std::hash::{Hash, Hasher};
use base64::{engine::general_purpose, Engine as _};
use image::{ColorType, DynamicImage, GenericImageView, Rgba};
use lazy_static::lazy_static;
@@ -146,21 +147,25 @@ fn solve_difficulty2(img: &DynamicImage) -> Option<String> {
Some(answer)
}
-#[derive(Clone, Debug, PartialEq)]
+#[derive(Clone, Debug, PartialEq, Eq)]
struct Letter {
offset: Point,
character: char,
}
+impl Hash for Letter {
+ fn hash<H: Hasher>(&self, state: &mut H) {
+ self.character.hash(state);
+ self.offset.x.hash(state);
+ self.offset.y.hash(state);
+ }
+}
+
impl Letter {
fn new(offset: Point, character: char) -> Self {
Self { offset, character }
}
- fn key(&self) -> String {
- format!("{}_{}_{}", self.character, self.offset.x, self.offset.y)
- }
-
fn offset(&self) -> Point {
self.offset.clone()
}
@@ -261,14 +266,14 @@ fn solve_difficulty3(img: &DynamicImage) -> Result<String, CaptchaErr> {
let mut answer = String::new();
let mut letter = starting.unwrap();
- let mut visited = HashSet::<String>::new();
+ let mut visited = HashSet::<Letter>::new();
for i in 0..5 {
- if visited.contains(&letter.key()) {
+ if visited.contains(&letter) {
return Err(CaptchaErr(format!("already visited node {:?}", letter)));
}
answer.push(letter.character);
// println!("visiting {:?}", letter);
- visited.insert(letter.key());
+ visited.insert(letter.clone());
if i == 4 {
break;
}
@@ -324,14 +329,14 @@ fn solve_difficulty3(img: &DynamicImage) -> Result<String, CaptchaErr> {
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.key()) {
+ 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.key()) {
+ if visited.contains(&neighbor) {
if i == 3 {
for (_, l) in letters_map.iter() {
- if !visited.contains(&l.key()) {
+ if !visited.contains(&l) {
letter = l.clone();
break 'the_loop;
}
@@ -395,7 +400,7 @@ impl Rect {
}
}
-#[derive(Debug, Clone, PartialEq)]
+#[derive(Debug, Clone, PartialEq, Eq)]
struct Point {
x: u32,
y: u32,