Created
November 19, 2024 12:27
-
-
Save BurntNail/3762058765c03e73f5f6889a0b68d608 to your computer and use it in GitHub Desktop.
Solution to riteangle problem
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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