From 2fad0776ce6e8edcf6b039604e9c0ffb00682b7d Mon Sep 17 00:00:00 2001 From: Pcornat Date: Thu, 11 Mar 2021 17:34:24 +0100 Subject: [PATCH] =?UTF-8?q?Fonctionne=20!=20Et=20est=20rapide=20en=20compa?= =?UTF-8?q?raison=20de=20la=20version=20s=C3=A9quentielle=20de=20Ben=20:P?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.cpp | 40 ++++++++++++++++++++++++++++++---------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/main.cpp b/main.cpp index 4e99e80..dc2a16d 100644 --- a/main.cpp +++ b/main.cpp @@ -59,9 +59,11 @@ template struct NumberBase26 final { std::array data{}; - const std::array &alphabet{}; + static constexpr std::uint32_t valMax{ 26 }; - static constexpr frozen::unordered_map lut = { + const std::array &alphabet{}; + + static constexpr frozen::unordered_map lut = { { 'A', 0 }, { 'B', 1 }, { 'C', 2 }, @@ -92,17 +94,35 @@ struct NumberBase26 final { NumberBase26() = delete; - explicit NumberBase26(const std::array &_alphabet) : alphabet(_alphabet) { + explicit NumberBase26(const std::array &_alphabet) : alphabet(_alphabet) { data.fill('A'); } ~NumberBase26() noexcept = default; + /** + * \brief Cela permet d'incrémenter le nombre. + * \return + */ NumberBase26 &operator++() { - if (whichDigit > 0 && data[whichDigit] == 'Z') - --whichDigit; - const std::uint32_t number{ lut.at(data[whichDigit]) + 1 }; // C'est là où se trouve l'incrémentation - data[whichDigit] = number == 26 ? alphabet[0] : alphabet[number]; + std::uint32_t number{ lut.at(data.back()) + 1 }; // C'est là où se trouve l'incrémentation + /* + * Tant que la retenue se propage à travers les digit, il faut les mettre à 'A' et + * poursuivre jusqu'à rencontrer un caractère != 'Z' + */ + for (auto iter = data.rbegin(); iter != data.rend(); ++iter) { + if (retenue) { + number = lut.at(*iter) + 1; + } + if (number == valMax) { + *iter = 'A'; + retenue = true; + } else { + *iter = alphabet[number]; + retenue = false; + break; + } + } return *this; } @@ -112,7 +132,8 @@ struct NumberBase26 final { } private: - std::size_t whichDigit{ data.size() - 1 }; + //! Signifie la présence d'une retenue. + bool retenue{ false }; }; int main() { @@ -239,9 +260,8 @@ int main() { NumberBase26 number_base_26{ alphabet }; for (size_t i = 0; i < maxCompute; ++i, ++number_base_26) { const auto crc = ~(getCrc32(std::string_view{ number_base_26.data.data(), maxDig })); - if (std::find(cheat_list.cbegin(), cheat_list.cend(), crc) != cheat_list.cend()) { + if (std::find(cheat_list.cbegin(), cheat_list.cend(), crc) != cheat_list.cend()) std::cout << number_base_26 << ":0x" << std::hex << crc << '\n'; - } } return EXIT_SUCCESS; }