• Home
  • About
    • 康青旭 - Germán Caggianese photo

      康青旭 - Germán Caggianese

      Refactoring entropy in my Mind

    • Learn More
    • Email
    • Instagram
    • Github
    • Codeberg   Codeberg
  • All Posts
  • Projects
  • Areas
  • Resources

Advent of Code 2025 - Dia 1 en C++

03 Dec 2025

Reading time ~9 minutes

“Debido a nuevos protocolos de seguridad, la contraseña está bloqueada en la caja fuerte de abajo. Por favor, revisa el documento adjunto para ver la nueva combinación.”

Traducción de la publicación original en inglés.

Github: GCaggianese/AoC-2025/D2

  • Standard C++

Puzzle Dia 1 - Advent of Code

  • El dial va de 00 a 99 (NN) y hace un click al llegar a cada número.
    • Esto significa que hay 100 valores posibles antes de volver a empezar.

Estructura de entrada

  • Secuencia de rotaciones (1 por línea)

    • L -> rotación hacia números menores
    • R -> rotación hacia números mayores
  • Hay que envolver con %; en C++ uso aritmética modular (Gauss) con convención de división hacia abajo.

  • NN -> número de rotaciones.

  • Se empieza desde 50.

Solución usando C++ STD 20

  • Meson está ahí sólo porque lo estaba aprendiendo justo antes de AoC. También se puede usar g++ src/main.cpp -o aoc-2020-d1 o lo que uno prefiera.
  • En realidad lo resolví usando org-babbel.

  • Github link: GCaggianese/AoC-2025
  • Codeberg link: GCaggianese/AoC-2025
    ...
    R31
    Dial position: 86
    R25
    Dial position: 11
    Clicks: 1129

Respuesta correcta~! 🌟+1


int dial = 50;
int clicker = 0;

template <typename T> T floor_mod(T a, T b) {
    return a - b * std::floor(static_cast<double>(a) / static_cast<double>(b));
}

void fright(int r) { dial = floor_mod((dial + r), 100); }

void fleft(int l) { dial = floor_mod((dial - l), 100); }

void click() {
    if (dial == 0) {
        clicker += 1;
    }
}

void parse_file(std::string_view filepath) {
    std::ifstream file(filepath.data());

    for (std::string line; std::getline(file, line);) {
        if (line.empty())
            continue;

        char direction = line[0];

        int value = 0;
        auto [ptr, ec] =
            std::from_chars(line.data() + 1, line.data() + line.size(), value);

        if (ec == std::errc{}) { // Success
            std::cout << line << '\n';

            if (direction == 'L') {
                fleft(value);
                click();
                std::cout << "Dial position: " << dial << "\n";
            } else if (direction == 'R') {
                fright(value);
                click();
                std::cout << "Dial position: " << dial << "\n";
            }
        }
        if (ec != std::errc{}) { // Fail
            std::cerr << "Parse error on line: " << line << '\n';
            continue;
        }
    }
}

int main(){

    std::cout << "Hey AoC 2025!\n\n";
    parse_file("input_test.txt");
    std::cout << "Clicks: " << clicker << "\n";

    return 0;
}

A menos que se indique lo contrario, el contenido del sitio web está bajo la licencia Creative Commons Atribución/Reconocimiento 4.0 Internacional.

© 2026 Germán Caggianese(康青旭)