From 7446ea5d0bab6753083804f1dc81f28e9441e99d Mon Sep 17 00:00:00 2001 From: bot50 Date: Wed, 28 Feb 2024 14:53:09 +0000 Subject: [PATCH] kukemuna-cs50/problems/2024/x/tideman@20240228T145309.046152876Z --- tideman.c | 173 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 tideman.c diff --git a/tideman.c b/tideman.c new file mode 100644 index 0000000..63f327b --- /dev/null +++ b/tideman.c @@ -0,0 +1,173 @@ +#include +#include +#include + +// Max number of candidates +#define MAX 9 + +// preferences[i][j] is number of voters who prefer i over j +int preferences[MAX][MAX]; + +// locked[i][j] means i is locked in over j +bool locked[MAX][MAX]; + +// Each pair has a winner, loser +typedef struct +{ + int winner; + int loser; +} pair; + +// Array of candidates +string candidates[MAX]; +pair pairs[MAX * (MAX - 1) / 2]; + +int pair_count; +int candidate_count; + +// Function prototypes +bool vote(int rank, string name, int ranks[]); +void record_preferences(int ranks[]); +void add_pairs(void); +void sort_pairs(void); +void lock_pairs(void); +void print_winner(void); + +int main(int argc, string argv[]) +{ + // Check for invalid usage + if (argc < 2) + { + printf("Usage: tideman [candidate ...]\n"); + return 1; + } + + // Populate array of candidates + candidate_count = argc - 1; + if (candidate_count > MAX) + { + printf("Maximum number of candidates is %i\n", MAX); + return 2; + } + for (int i = 0; i < candidate_count; i++) + { + candidates[i] = argv[i + 1]; + } + + // Clear graph of locked in pairs + for (int i = 0; i < candidate_count; i++) + { + for (int j = 0; j < candidate_count; j++) + { + locked[i][j] = false; + } + } + + pair_count = 0; + int voter_count = get_int("Number of voters: "); + + // Query for votes + for (int i = 0; i < voter_count; i++) + { + // ranks[i] is voter's ith preference + int ranks[candidate_count]; + + // Query for each rank + for (int j = 0; j < candidate_count; j++) + { + string name = get_string("Rank %i: ", j + 1); + + if (!vote(j, name, ranks)) + { + printf("Invalid vote.\n"); + return 3; + } + } + + record_preferences(ranks); + + printf("\n"); + } + + add_pairs(); + sort_pairs(); + lock_pairs(); + print_winner(); + return 0; +} + +// Update ranks given a new vote +bool vote(int rank, string name, int ranks[]) +{ + for (int i = 0; i < candidate_count; i++) + { + if (strcmp(name, candidates[i]) == 0) + { + ranks[rank] = i; + return true; + } + } + return false; +} + +// Update preferences given one voter's ranks +void record_preferences(int ranks[]) +{ + for(int i =0; i < candidate_count - 1; i++) + { + for(int j=i+1; j < candidate_count; j++) + { + preferences[ranks[i]][ranks[j]]++; + } + } + return; +} + +// Record pairs of candidates where one is preferred over the other +void add_pairs(void) +{ + for (int i = 0; i < candidate_count - 1; i++) + { + for (int j = i + 1; j < candidate_count; j++) + { + if (preferences[i][j] > preferences[j][i]) + { + pairs[pair_count].winner = i; + pairs[pair_count].loser = j; + pair_count++; + } + else if (preferences[i][j] < preferences[j][i]) + { + pairs[pair_count].winner = j; + pairs[pair_count].loser = i; + pair_count++; + } + } + } + return; +} + +// Sort pairs in decreasing order by strength of victory +void sort_pairs(void) +{ + for (int i = 0; i < pair_count; i++) + { + printf("Pair %i\n", i); + printf("Winner: %i, loser: %i\n", pairs[i].winner, pairs[i].loser); + } + return; +} + +// Lock pairs into the candidate graph in order, without creating cycles +void lock_pairs(void) +{ + // TODO + return; +} + +// Print the winner of the election +void print_winner(void) +{ + // TODO + return; +}