DEV Community

Discussion on: Daily Challenge #289 - Manhattan Distance

Collapse
 
qm3ster profile image
Mihail Malo • Edited

Rust

lol generics

use core::ops::{Add, Sub};
fn abs_difference<T>(x: T, y: T) -> T
where
    T: Sub<Output = T> + Ord,
{
    if x < y {
        y - x
    } else {
        x - y
    }
}

struct Point<T>(T, T);

fn manhattan<T>(Point(x1, y1): Point<T>, Point(x2, y2): Point<T>) -> T
where
    T: Sub<Output = T> + Add<Output = T> + Ord,
{
    abs_difference(x2, x1) + abs_difference(y2, y1)
}

fn main() {
    assert_eq!(manhattan(Point(1, 1), Point(1, 1)), 0);
    assert_eq!(manhattan(Point(5, 4), Point(3, 2)), 4);
    assert_eq!(manhattan(Point(1, 1), Point(0, 3)), 3);

    dbg!(manhattan(Point(1, 2), Point(1, 3)));
    dbg!(manhattan(Point(5, 2), Point(7, 3)));
    dbg!(manhattan(Point(1, 2), Point(4, 4)));
}