diff --git a/src/counter.rs b/src/counter.rs index 8311ac5..a9c6cf5 100644 --- a/src/counter.rs +++ b/src/counter.rs @@ -60,7 +60,5 @@ impl Counter { scores } - - } diff --git a/src/main.rs b/src/main.rs index 59839f0..e0400cd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -44,10 +44,10 @@ fn main() { let ty = BallotType::Candidate; let names = match ty { BallotType::Party => counter.header.parties.iter().map(|v| v.name.clone()).collect_vec(), - BallotType::Candidate => counter.header.candidates.iter().map(|v| format!("{}: {}", - v.name, - v.party_id.map_or("IND", |id| &counter.header.parties[id].name), - )).collect_vec(), + BallotType::Candidate => counter.header.candidates.iter().map(|v| match v.party_id { + Some(party_id) => format!("{}: {}", v.name, &counter.header.parties[party_id].name), + None => v.name.to_owned(), + }).collect_vec(), }; let mut running = vec![true; names.len()]; let mut first = true; @@ -64,18 +64,16 @@ fn main() { println!(); eprintln!("Running election rounds:"); - let mut scores = Vec::new(); + let to_percent = |score: f64| score / f64::from(total) * 100.0; - for index in 0..(running.len() - winner_count) { - scores = counter.count_all_with_powers_of_2(ty, &running); - let (id_worst, score_worst) = match scores.iter().copied().enumerate().filter(|&(i,_)| running[i]).min_by(|a, b| f64::total_cmp(&a.1, &b.1)) { - Some(v) => v, - None => break - }; - let (id_best, score_best) = match scores.iter().copied().enumerate().filter(|&(i,_)| running[i]).min_by(|a, b| f64::total_cmp(&b.1, &a.1)) { - Some(v) => v, + for index in 0..(running.len() - winner_count + 1) { + let scores = counter.count_all_with_powers_of_2(ty, &running); + let scores_ordered = scores.iter().copied().enumerate().filter(|&(i,_)| running[i]).sorted_by(|a, b| f64::total_cmp(&b.1, &a.1)).collect_vec(); + let (id_worst, score_worst) = match scores_ordered.last() { + Some(&v) => v, None => break, }; + let mut first = true; for (&score, &running) in scores.iter().zip(running.iter()) { if first { @@ -90,19 +88,18 @@ fn main() { } running[id_worst] = false; + let mut total_votes = 0.0; + println!(); - eprintln!(" - {index}:"); - eprintln!(" Best: {} ({score_best})", names[id_best]); - eprintln!(" Lost: {} ({score_worst})", names[id_worst]); + eprintln!("Round {}:", index+1); + for (place, &(id, score)) in scores_ordered.iter().take(winner_count).enumerate() { + eprintln!(" {}. {}: {score}, {:.2}%", place + 1, names[id], to_percent(score)); + total_votes += score; + } + if scores_ordered.len() > winner_count { + eprintln!(" {}. {}: {score_worst}, {:.2}%", scores_ordered.len(), names[id_worst], to_percent(score_worst)); + } + eprintln!(" Total: {total_votes}, {:.2}%", to_percent(total_votes.into())); } - - let winners = names.iter().enumerate().filter_map(|(index, name)| match running[index] { - true => Some((name.as_str(), scores[index])), - false => None, - }).collect_vec(); - let total_votes: f64 = scores.iter().sum(); - - eprintln!("Winners: {winners:#?}"); - eprintln!("Total Votes: {}% ({total_votes} / {total})", total_votes / f64::from(total) * 100.0); }