diff --git a/2021/day21/aoc-c.c b/2021/day21/aoc-c.c index 39d72ce..b119790 100644 --- a/2021/day21/aoc-c.c +++ b/2021/day21/aoc-c.c @@ -20,10 +20,57 @@ #include "bits.h" #include "list.h" +typedef struct { + int score; + int pos; +} player_t; + +static player_t players[2]; + +static int nrolls = 0; + +static inline int do_roll() +{ + static int roll = 0; + int res = 0; + + for (int i = 0; i < 3; ++i) { + res += roll++ % 100 + 1; + nrolls++; + } + return res % 10; +} + +static int player_turn(int player) +{ + int roll; + + roll = do_roll(); + players[player].pos += roll; + if (!(players[player].pos % 10)) + players[player].pos = 10; + else + players[player].pos %= 10; + + players[player].score += players[player].pos; + log_f(1, "player %d: nrolls=%d roll=%d pos=%d score=%d\n", player+1, + nrolls, roll, + players[player].pos, players[player].score); + return players[player].score; +} + static int part1() { + while (1) { + if (player_turn(0) >= 1000) + return players[1].score * nrolls; + if (player_turn(1) >= 1000) + return players[0].score * nrolls; + } + return 1; } + static int part2() { return 1; @@ -35,6 +82,12 @@ static int usage(char *prg) return 1; } +static void read_input() +{ + scanf("Player %*c starting position: %d\n", &players[0].pos); + scanf("Player %*c starting position: %d\n", &players[1].pos); +} + int main(int ac, char **av) { int opt, part = 1; @@ -56,6 +109,9 @@ int main(int ac, char **av) if (optind < ac) return usage(*av); + read_input(); + printf("player1: %d\n", players[0].pos); + printf("player1: %d\n", players[1].pos); printf("%s : res=%d\n", *av, part == 1? part1(): part2()); exit(0);