AoC code coverage
Current view: top level - puzzles/2022 - Day02.cpp (source / functions) Coverage Total Hit
Test: master Lines: 82.6 % 92 76
Test Date: 2025-07-28 10:53:57 Functions: 100.0 % 4 4

            Line data    Source code
       1              : #include "IntegerCast.h"
       2              : #include "LinewiseInput.h"
       3              : #include "PuzzleImpl.h"
       4              : 
       5              : #include <libassert/assert.hpp>
       6              : 
       7              : #include <algorithm>
       8              : #include <array>
       9              : #include <cstdint>
      10              : #include <numeric>
      11              : #include <string_view>
      12              : 
      13              : namespace {
      14              : 
      15         2500 : uint64_t gameScorePt1(std::string_view const s) {
      16         2500 :   char const opponent = s[0];
      17         2500 :   char const own = s[2];
      18              : 
      19         2500 :   switch (own) {
      20          611 :   case 'X':
      21          611 :     switch (opponent) {
      22          189 :     case 'A':
      23          189 :       return 1u + 3u;
      24           97 :     case 'B':
      25           97 :       return 1u + 0u;
      26          325 :     case 'C':
      27          325 :       return 1u + 6u;
      28            0 :     default:
      29            0 :       UNREACHABLE(opponent);
      30          611 :     }
      31         1524 :   case 'Y':
      32         1524 :     switch (opponent) {
      33         1003 :     case 'A':
      34         1003 :       return 2u + 6u;
      35           56 :     case 'B':
      36           56 :       return 2u + 3u;
      37          465 :     case 'C':
      38          465 :       return 2u + 0u;
      39            0 :     default:
      40            0 :       UNREACHABLE(opponent);
      41         1524 :     }
      42          365 :   case 'Z':
      43          365 :     switch (opponent) {
      44          107 :     case 'A':
      45          107 :       return 3u + 0u;
      46          100 :     case 'B':
      47          100 :       return 3u + 6u;
      48          158 :     case 'C':
      49          158 :       return 3u + 3u;
      50            0 :     default:
      51            0 :       UNREACHABLE(opponent);
      52          365 :     }
      53            0 :   default:
      54            0 :     UNREACHABLE(own);
      55         2500 :   }
      56         2500 : }
      57              : 
      58         2500 : uint64_t gameScorePt2(std::string_view const s) {
      59         2500 :   char const opponent = s[0];
      60         2500 :   char const outcome = s[2];
      61              : 
      62         2500 :   switch (outcome) {
      63          611 :   case 'X':
      64          611 :     switch (opponent) {
      65          189 :     case 'A':
      66          189 :       return 0u + 3u;
      67           97 :     case 'B':
      68           97 :       return 0u + 1u;
      69          325 :     case 'C':
      70          325 :       return 0u + 2u;
      71            0 :     default:
      72            0 :       UNREACHABLE(opponent);
      73          611 :     }
      74         1524 :   case 'Y':
      75         1524 :     switch (opponent) {
      76         1003 :     case 'A':
      77         1003 :       return 3u + 1u;
      78           56 :     case 'B':
      79           56 :       return 3u + 2u;
      80          465 :     case 'C':
      81          465 :       return 3u + 3u;
      82            0 :     default:
      83            0 :       UNREACHABLE(opponent);
      84         1524 :     }
      85          365 :   case 'Z':
      86          365 :     switch (opponent) {
      87          107 :     case 'A':
      88          107 :       return 6u + 2u;
      89          100 :     case 'B':
      90          100 :       return 6u + 3u;
      91          158 :     case 'C':
      92          158 :       return 6u + 1u;
      93            0 :     default:
      94            0 :       UNREACHABLE(opponent);
      95          365 :     }
      96            0 :   default:
      97            0 :     UNREACHABLE(outcome);
      98         2500 :   }
      99         2500 : }
     100              : } // namespace
     101              : 
     102            1 : template <> size_t part1<2022, 2>(std::string_view const input) {
     103            1 :   LinewiseInput const lines(input);
     104              : 
     105            1 :   return std::transform_reduce(lines.begin(), lines.end(), uint64_t(0), std::plus<>(),
     106            1 :                                gameScorePt1);
     107            1 : }
     108              : 
     109            1 : template <> size_t part2<2022, 2>(std::string_view const input) {
     110            1 :   LinewiseInput const lines(input);
     111              : 
     112            1 :   return std::transform_reduce(lines.begin(), lines.end(), uint64_t(0), std::plus<>(),
     113            1 :                                gameScorePt2);
     114            1 : }
        

Generated by: LCOV version 2.0-1