Skip to content

Instantly share code, notes, and snippets.

@frectonz
Last active October 31, 2023 12:55
Show Gist options
  • Save frectonz/f40f7fca9d3f7783ae22c04480f3d12c to your computer and use it in GitHub Desktop.
Save frectonz/f40f7fca9d3f7783ae22c04480f3d12c to your computer and use it in GitHub Desktop.
From cassidoo's October 30, 2023 newsletter
use itertools::Itertools;
pub fn lexo_next(num: usize) -> usize {
let digits = digits(num);
let mut perms = digits
.iter()
.permutations(digits.len())
.map(number)
.filter(|perm| *perm != num)
.filter_map(|perm| perm.checked_sub(num).map(|diff| (perm, diff)))
.sorted_by(|(_, d1), (_, d2)| d1.cmp(d2))
.map(|(perm, _)| perm);
perms.next().unwrap()
}
fn digits(mut num: usize) -> Vec<usize> {
let mut digits = Vec::new();
while num != 0 {
digits.push(num % 10);
num /= 10;
}
digits.reverse();
digits
}
fn number(digits: Vec<&usize>) -> usize {
digits.iter().rev().enumerate().fold(0, |acc, (i, e)| {
let piece = **e * 10usize.pow(i as u32);
acc + piece
})
}
#[cfg(test)]
mod tests {
use crate::lexo_next;
#[test]
fn test() {
assert_eq!(lexo_next(123), 132);
assert_eq!(lexo_next(314159), 314195);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment