day 4
							parent
							
								
									51459c17c6
								
							
						
					
					
						commit
						744731c1fc
					
				| @ -0,0 +1,7 @@ | ||||
| # This file is automatically @generated by Cargo. | ||||
| # It is not intended for manual editing. | ||||
| version = 3 | ||||
| 
 | ||||
| [[package]] | ||||
| name = "day04" | ||||
| version = "0.1.0" | ||||
| @ -0,0 +1,4 @@ | ||||
| [package] | ||||
| name = "day04" | ||||
| version = "0.1.0" | ||||
| edition = "2021" | ||||
| @ -0,0 +1,61 @@ | ||||
| use std::collections::{HashMap, HashSet}; | ||||
| use std::io::{stdin, BufRead}; | ||||
| 
 | ||||
| fn main() { | ||||
|     let input = stdin().lock().lines().map(|l| l.unwrap()); | ||||
|     let mut total_score = 0; | ||||
|     let mut card_counts = HashMap::new(); | ||||
|     let mut total_single_cards = 0; | ||||
| 
 | ||||
|     for (id, line) in input.enumerate() { | ||||
|         let card = line.split_once(':').unwrap().1; | ||||
|         let (entries, winners) = card.split_once('|').unwrap(); | ||||
| 
 | ||||
|         let entset = entries | ||||
|             .trim() | ||||
|             .split(' ') | ||||
|             .filter(|num| !num.is_empty()) | ||||
|             .collect::<HashSet<_>>(); | ||||
|         let winset = winners | ||||
|             .trim() | ||||
|             .split(' ') | ||||
|             .filter(|num| !num.is_empty()) | ||||
|             .collect::<HashSet<_>>(); | ||||
| 
 | ||||
|         let common = entset.intersection(&winset); | ||||
|         let num_in_common = common.count(); | ||||
|         total_score += to_score(num_in_common); | ||||
| 
 | ||||
|         let repeat_count = card_counts.get(&(id + 1)).unwrap_or(&0).to_owned(); | ||||
| 
 | ||||
|         let r = to_range(id, num_in_common); | ||||
|         for win_card_copy in r { | ||||
|             let current_count = card_counts.get(&win_card_copy).unwrap_or(&0); | ||||
|             card_counts.insert(win_card_copy, current_count + 1 + repeat_count); | ||||
|         } | ||||
| 
 | ||||
|         total_single_cards = id + 1; | ||||
|     } | ||||
| 
 | ||||
|     let card_total = card_counts.iter().fold(0, |total, count| total + count.1); | ||||
| 
 | ||||
|     println!( | ||||
|         "P1: {} P2: {}", | ||||
|         total_score, | ||||
|         total_single_cards + card_total | ||||
|     ); | ||||
| } | ||||
| 
 | ||||
| fn to_range(id: usize, win_count: usize) -> std::ops::Range<usize> { | ||||
|     let start = id + 2; | ||||
|     let end = start + win_count; | ||||
|     start..end | ||||
| } | ||||
| 
 | ||||
| fn to_score(entries: usize) -> usize { | ||||
|     if entries == 0 { | ||||
|         0 | ||||
|     } else { | ||||
|         1 << (entries - 1) | ||||
|     } | ||||
| } | ||||
					Loading…
					
					
				
		Reference in New Issue