Compare commits
	
		
			2 Commits
		
	
	
		
			6d557c35cf
			...
			5fb4052cfd
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 5fb4052cfd | ||
|   | a7416ed056 | 
| @ -23,19 +23,19 @@ fn parse(input: &str) -> Input { | ||||
| fn part1(input: &Input) -> usize { | ||||
|     input | ||||
|         .iter() | ||||
|         .filter(|v| part1_test(v.1[0], v.0, &v.1[1..])) | ||||
|         .filter(|v| part1_test(v.1[0] as i64, v.0 as i64, &v.1[1..])) | ||||
|         .fold(0, |acc, v| acc + v.0 as usize) | ||||
| } | ||||
| 
 | ||||
| fn part1_test(curr: u64, target: u64, numbers: &[u64]) -> bool { | ||||
|     if curr > target { | ||||
|         false | ||||
|     } else if numbers.is_empty() { | ||||
|         curr == target | ||||
| fn part1_test(target: i64, remaining: i64, numbers: &[u64]) -> bool { | ||||
|     if numbers.is_empty() { | ||||
|         remaining == target | ||||
|     } else { | ||||
|         let num = numbers[0]; | ||||
|         let rest = &numbers[1..]; | ||||
|         part1_test(curr + num, target, rest) || part1_test(curr * num, target, rest) | ||||
|         let num = numbers[numbers.len() - 1] as i64; | ||||
|         let rest = &numbers[0..numbers.len() - 1]; | ||||
|         let mul = remaining % num == 0 && part1_test(target, remaining / num, rest); | ||||
|         let add = remaining >= num && part1_test(target, remaining - num, rest); | ||||
|         mul || add | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @ -43,26 +43,21 @@ fn part1_test(curr: u64, target: u64, numbers: &[u64]) -> bool { | ||||
| fn part2(input: &Input) -> usize { | ||||
|     input | ||||
|         .iter() | ||||
|         .filter(|v| part2_test(v.1[0], v.0, &v.1[1..])) | ||||
|         .filter(|v| part2_test(v.1[0] as i64, v.0 as i64, &v.1[1..])) | ||||
|         .fold(0, |acc, v| acc + v.0 as usize) | ||||
| } | ||||
| 
 | ||||
| fn concat(a: u64, b: u64) -> u64 { | ||||
|     let digits = b.ilog10() + 1; | ||||
|     a * 10u64.pow(digits) + b | ||||
| } | ||||
| 
 | ||||
| fn part2_test(curr: u64, target: u64, numbers: &[u64]) -> bool { | ||||
|     if curr > target { | ||||
|         false | ||||
|     } else if numbers.is_empty() { | ||||
|         curr == target | ||||
| fn part2_test(target: i64, remaining: i64, numbers: &[u64]) -> bool { | ||||
|     if numbers.is_empty() { | ||||
|         remaining == target | ||||
|     } else { | ||||
|         let num = numbers[0]; | ||||
|         let rest = &numbers[1..]; | ||||
|         part2_test(curr + num, target, rest) | ||||
|             || part2_test(curr * num, target, rest) | ||||
|             || part2_test(concat(curr, num), target, rest) | ||||
|         let num = numbers[numbers.len() - 1] as i64; | ||||
|         let rest = &numbers[0..numbers.len() - 1]; | ||||
|         let mul = remaining % num == 0 && part2_test(target, remaining / num, rest); | ||||
|         let pow = 10i64.pow(num.ilog10() + 1); | ||||
|         let con = remaining % pow == num && part2_test(target, remaining / pow, rest); | ||||
|         let add = remaining >= num && part2_test(target, remaining - num, rest); | ||||
|         mul || con || add | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user