Skip to content

Instantly share code, notes, and snippets.

@BurntNail
Created November 19, 2024 12:27
Show Gist options
  • Select an option

  • Save BurntNail/3762058765c03e73f5f6889a0b68d608 to your computer and use it in GitHub Desktop.

Select an option

Save BurntNail/3762058765c03e73f5f6889a0b68d608 to your computer and use it in GitHub Desktop.
Solution to riteangle problem
use itertools::Itertools;
use std::time::Instant;
fn main() {
time("elegant", maybe_more_elegant);
time("bf", bruteforce);
}
fn time(name: &'static str, method: impl Fn()) {
let start = Instant::now();
method();
let el = start.elapsed();
println!("{name} took {el:?}");
}
fn maybe_more_elegant() {
let sum: i32 = (0..=9).permutations(10).map(|list| {
let [one_10, one_1, two_10, two_1, three_10, three_1, four_10, four_1, five_10, five_1] = list.as_slice() else {
panic!()
};
let one = one_10 * 10 + one_1;
let two = two_10 * 10 + two_1;
let three = three_10 * 10 + three_1;
let four = four_10 * 10 + four_1;
let five = five_10 * 10 + five_1;
[one, two, three, four, five]
}).
filter(|[one, two, three, four, five]| {
let cd = two - one;
if cd < 0 {
false
} else {
(cd == three - two) && (cd == four - three) && (cd == five - four)
}
}).flatten().sum();
println!("{sum}");
}
fn bruteforce() {
let mut sum: i32 = 0;
let numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9].to_vec();
for one_10 in numbers.clone() {
let mut left = numbers.clone();
left.retain(|x| *x != one_10);
for one_1 in left.clone() {
let mut left = left.clone();
left.retain(|x| *x != one_1);
let one = one_10 * 10 + one_1;
for two_10 in left.clone() {
let mut left = left.clone();
left.retain(|x| *x != two_10);
for two_1 in left.clone() {
let mut left = left.clone();
left.retain(|x| *x != two_1);
let two = two_10 * 10 + two_1;
let cd = two - one;
if cd < 0 {
continue;
}
for three_10 in left.clone() {
let mut left = left.clone();
left.retain(|x| *x != three_10);
for three_1 in left.clone() {
let mut left = left.clone();
left.retain(|x| *x != three_1);
let three = three_10 * 10 + three_1;
if three - two != cd {
continue;
}
for four_10 in left.clone() {
let mut left = left.clone();
left.retain(|x| *x != four_10);
for four_1 in left.clone() {
let mut left = left.clone();
left.retain(|x| *x != four_1);
let four = four_10 * 10 + four_1;
if four - three != cd {
continue;
}
let first_five = left[0] * 10 + left[1];
if first_five - four == cd {
sum += one + two + three + four + first_five;
}
let second_five = left[1] * 10 + left[0];
if second_five - four == cd {
sum += one + two + three + four + second_five;
}
}
}
}
}
}
}
}
}
println!("{sum}")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment