From 26850c839cd2d7851d33ce4e51c1d46ea4308f59 Mon Sep 17 00:00:00 2001 From: 0xffff00 Date: Fri, 13 Feb 2026 22:05:19 +0100 Subject: [PATCH] initial commit --- .gitignore | 1 + Cargo.lock | 7 +++++++ Cargo.toml | 6 ++++++ src/main.rs | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 63 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 src/main.rs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ea8c4bf --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..a78a7ec --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "pathshortener" +version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..0d81ab4 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "pathshortener" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..4016a33 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,49 @@ +fn main() { + let directions = "ENWESWNS".to_string(); + let res = shorten(directions); + println!("{:?}", res); +} + +fn shorten(directions: String) -> String { + let characters: Vec<_> = directions.chars().collect(); + let mut result = remove_doubles(&characters); + loop { + let out = remove_doubles(&result); + if out.len() == result.len() { + break; + } else { + result = out; + } + } + result.iter().map(|f| f.to_string()).collect() +} + +fn remove_doubles(characters: &Vec) -> Vec { + let mut shortenable_map = vec![false; characters.len()]; + let windows = characters.windows(2); + + for (idx, window) in windows.enumerate() { + let shortenable = is_shortenable(window); + if shortenable { + shortenable_map[idx] = true; + shortenable_map[idx + 1] = true; + } + } + + characters + .iter() + .enumerate() + .filter(|(idx, _)| !shortenable_map[*idx]) + .map(|(_, itm)| *itm) + .collect() +} + +fn is_shortenable(chars: &[char]) -> bool { + match chars { + &['N', 'S'] => true, + &['S', 'N'] => true, + &['W', 'E'] => true, + &['E', 'W'] => true, + _ => false, + } +}