Advertisement
Guest User

Untitled

a guest
Dec 20th, 2024
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.39 KB | None | 0 0
  1. use std::fs::File;
  2. use std::io::{BufRead, BufReader};
  3.  
  4. fn parse(file: File) -> Vec<(u64, Vec<u64>)> {
  5. BufReader::new(file)
  6. .lines()
  7. .filter_map(Result::ok)
  8. .map(|line| {
  9. let (target, operands) = line.split_once(':').unwrap();
  10.  
  11. let target = target.parse::<u64>().unwrap();
  12. let operands = operands
  13. .trim_start()
  14. .split_whitespace()
  15. .map(|n| n.parse::<u64>().unwrap())
  16. .collect::<Vec<u64>>();
  17.  
  18. return (target, operands);
  19. })
  20. .collect::<Vec<_>>()
  21. }
  22.  
  23. fn backtrack(operands: &[u64], idx: usize, sum: u64, target: u64) -> u64 {
  24. if sum == target {
  25. return sum;
  26. }
  27. if idx == operands.len() {
  28. return 0;
  29. }
  30. // if idx == operands.len() { // same result
  31. // return if sum == target { sum } else { 0 }
  32. // }
  33.  
  34. let res = backtrack(operands, idx + 1, sum + operands[idx], target);
  35. return if res != 0 {
  36. res
  37. } else {
  38. backtrack(operands, idx + 1, sum * operands[idx], target)
  39. };
  40. }
  41.  
  42. pub fn run(file: File) {
  43. let lines = parse(file);
  44. // lines.iter().for_each(|line| println!("{:?}", line));
  45.  
  46. let sum = lines
  47. .iter()
  48. .map(|(target, operands)| backtrack(operands.as_slice(), 0, 0, *target))
  49. .sum::<u64>();
  50. println!("{}", sum);
  51. }
  52.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement