Totalement fonctionnel et opti + scalable.
This commit is contained in:
parent
296f78b404
commit
aadc82a004
215
main.cpp
215
main.cpp
@ -1,18 +1,17 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <vector>
|
|
||||||
#include <boost/crc.hpp>
|
#include <boost/crc.hpp>
|
||||||
#include <omp.h>
|
#include <omp.h>
|
||||||
#include <frozen/unordered_map.h>
|
#include <frozen/unordered_map.h>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \brief
|
* \brief
|
||||||
* \param my_string
|
* \param myString
|
||||||
* \return
|
* \return
|
||||||
*/
|
*/
|
||||||
boost::crc_32_type::value_type getCrc32(const char *__restrict__ const my_string, const std::size_t size) {
|
boost::crc_32_type::value_type getCrc32(const char *__restrict__ const myString, const std::size_t size) {
|
||||||
boost::crc_32_type result;
|
boost::crc_32_type result;
|
||||||
result.process_bytes(my_string, size);
|
result.process_bytes(myString, size);
|
||||||
return result.checksum();
|
return result.checksum();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -24,23 +23,23 @@ boost::crc_32_type::value_type getCrc32(const char *__restrict__ const my_string
|
|||||||
*/
|
*/
|
||||||
template<typename T>
|
template<typename T>
|
||||||
constexpr std::size_t maxDigits(T n) {
|
constexpr std::size_t maxDigits(T n) {
|
||||||
std::size_t numDigit = 1;
|
std::size_t num_digit = 1;
|
||||||
while (n != 0) {
|
while (n != 0) {
|
||||||
n /= 26;
|
n /= 26;
|
||||||
++numDigit;
|
++num_digit;
|
||||||
}
|
}
|
||||||
return numDigit;
|
return num_digit;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<std::size_t ArraySize>
|
template<std::size_t ArraySize>
|
||||||
struct NumberBase26 final {
|
struct NumberBase26 final {
|
||||||
std::array<char, ArraySize> data{};
|
std::array<char, ArraySize> data{};
|
||||||
|
|
||||||
static constexpr std::uint32_t valMax{ 26 };
|
static constexpr std::uint32_t val_max{ 26 };
|
||||||
|
|
||||||
const std::array<char, valMax> &alphabet{};
|
const std::array<char, val_max> &alphabet{};
|
||||||
|
|
||||||
static constexpr frozen::unordered_map<char, std::uint32_t, valMax> lut = {
|
[[maybe_unused]] static constexpr frozen::unordered_map<char, std::uint32_t, val_max> lut = {
|
||||||
{ 'A', 0 },
|
{ 'A', 0 },
|
||||||
{ 'B', 1 },
|
{ 'B', 1 },
|
||||||
{ 'C', 2 },
|
{ 'C', 2 },
|
||||||
@ -71,7 +70,7 @@ struct NumberBase26 final {
|
|||||||
|
|
||||||
NumberBase26() = delete;
|
NumberBase26() = delete;
|
||||||
|
|
||||||
explicit NumberBase26(const std::array<char, valMax> &_alphabet) : alphabet(_alphabet) {
|
explicit NumberBase26(const std::array<char, val_max> &alphabet) : alphabet(alphabet) {
|
||||||
data.fill('A');
|
data.fill('A');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,13 +80,13 @@ struct NumberBase26 final {
|
|||||||
for (size_t i = data.size() - 1; 0 <= i; --i) {
|
for (size_t i = data.size() - 1; 0 <= i; --i) {
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
return;
|
return;
|
||||||
data[i] = alphabet[n % valMax];
|
data[i] = alphabet[n % val_max];
|
||||||
n /= valMax;
|
n /= val_max;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
friend std::ostream &operator<<(std::ostream &os, const NumberBase26 &number_base_26) {
|
friend std::ostream &operator<<(std::ostream &os, const NumberBase26 &numberBase26) {
|
||||||
std::for_each(number_base_26.data.cbegin(), number_base_26.data.cend(), [&](const auto &number) -> void { os << number; });
|
(void) std::for_each(numberBase26.data.cbegin(), numberBase26.data.cend(), [&](const auto &number) -> void { os << number; });
|
||||||
return os;
|
return os;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -96,93 +95,94 @@ struct NumberBase26 final {
|
|||||||
int main() {
|
int main() {
|
||||||
// I love deduction guides :D
|
// I love deduction guides :D
|
||||||
constexpr std::array cheat_list{
|
constexpr std::array cheat_list{
|
||||||
0xDE4B237Du,
|
0xDE4B237DU,
|
||||||
0xB22A28D1u,
|
0xB22A28D1U,
|
||||||
0x5A783FAEu,
|
0x5A783FAEU,
|
||||||
0xEECCEA2Bu,
|
0xEECCEA2BU,
|
||||||
0x42AF1E28u,
|
0x42AF1E28U,
|
||||||
0x555FC201u,
|
0x555FC201U,
|
||||||
0x2A845345u,
|
0x2A845345U,
|
||||||
0xE1EF01EAu,
|
0xE1EF01EAU,
|
||||||
0x771B83FCu,
|
0x771B83FCU,
|
||||||
0x5BF12848u,
|
0x5BF12848U,
|
||||||
0x44453A17u,
|
0x44453A17U,
|
||||||
0xFCFF1D08u,
|
0xFCFF1D08U,
|
||||||
0xB69E8532u,
|
0xB69E8532U,
|
||||||
0x8B828076u,
|
0x8B828076U,
|
||||||
0xDD6ED9E9u,
|
0xDD6ED9E9U,
|
||||||
0xA290FD8Cu,
|
0xA290FD8CU,
|
||||||
0x3484B5A7u,
|
0x3484B5A7U,
|
||||||
0x43DB914Eu,
|
0x43DB914EU,
|
||||||
0xDBC0DD65u,
|
0xDBC0DD65U,
|
||||||
0xD08A30FEu,
|
0xD08A30FEU,
|
||||||
0x37BF1B4Eu,
|
0x37BF1B4EU,
|
||||||
0xB5D40866u,
|
0xB5D40866U,
|
||||||
0xE63B0D99u,
|
0xE63B0D99U,
|
||||||
0x675B8945u,
|
0x675B8945U,
|
||||||
0x4987D5EEu,
|
0x4987D5EEU,
|
||||||
0x2E8F84E8u,
|
0x2E8F84E8U,
|
||||||
0x1A9AA3D6u,
|
0x1A9AA3D6U,
|
||||||
0xE842F3BCu,
|
0xE842F3BCU,
|
||||||
0x0D5C6A4Eu,
|
0x0D5C6A4EU,
|
||||||
0x74D4FCB1u,
|
0x74D4FCB1U,
|
||||||
0xB01D13B8u,
|
0xB01D13B8U,
|
||||||
0x66516EBCu,
|
0x66516EBCU,
|
||||||
0x4B137E45u,
|
0x4B137E45U,
|
||||||
0x78520E33u,
|
0x78520E33U,
|
||||||
0x3A577325u,
|
0x3A577325U,
|
||||||
0xD4966D59u,
|
0xD4966D59U,
|
||||||
0x5FD1B49Du,
|
0x5FD1B49DU,
|
||||||
0xA7613F99u,
|
0xA7613F99U,
|
||||||
0x1792D871u,
|
0x1792D871U,
|
||||||
0xCBC579DFu,
|
0xCBC579DFU,
|
||||||
0x4FEDCCFFu,
|
0x4FEDCCFFU,
|
||||||
0x44B34866u,
|
0x44B34866U,
|
||||||
0x2EF877DBu,
|
0x2EF877DBU,
|
||||||
0x2781E797u,
|
0x2781E797U,
|
||||||
0x2BC1A045u,
|
0x2BC1A045U,
|
||||||
0xB2AFE368u,
|
0xB2AFE368U,
|
||||||
0xFA8DD45Bu,
|
0xFA8DD45BU,
|
||||||
0x8DED75BDu,
|
0x8DED75BDU,
|
||||||
0x1A5526BCu,
|
0x1A5526BCU,
|
||||||
0xA48A770Bu,
|
0xA48A770BU,
|
||||||
0xB07D3B32u,
|
0xB07D3B32U,
|
||||||
0x80C1E54Bu,
|
0x80C1E54BU,
|
||||||
0x5DAD0087u,
|
0x5DAD0087U,
|
||||||
0x7F80B950u,
|
0x7F80B950U,
|
||||||
0x6C0FA650u,
|
0x6C0FA650U,
|
||||||
0xF46F2FA4u,
|
0xF46F2FA4U,
|
||||||
0x70164385u,
|
0x70164385U,
|
||||||
0x885D0B50u,
|
0x885D0B50U,
|
||||||
0x151BDCB3u,
|
0x151BDCB3U,
|
||||||
0xADFA640Au,
|
0xADFA640AU,
|
||||||
0xE57F96CEu,
|
0xE57F96CEU,
|
||||||
0x040CF761u,
|
0x040CF761U,
|
||||||
0xE1B33EB9u,
|
0xE1B33EB9U,
|
||||||
0xFEDA77F7u,
|
0xFEDA77F7U,
|
||||||
0x8CA870DDu,
|
0x8CA870DDU,
|
||||||
0x9A629401u,
|
0x9A629401U,
|
||||||
0xF53EF5A5u,
|
0xF53EF5A5U,
|
||||||
0xF2AA0C1Du,
|
0xF2AA0C1DU,
|
||||||
0xF36345A8u,
|
0xF36345A8U,
|
||||||
0x8990D5E1u,
|
0x8990D5E1U,
|
||||||
0xB7013B1Bu,
|
0xB7013B1BU,
|
||||||
0xCAEC94EEu,
|
0xCAEC94EEU,
|
||||||
0x31F0C3CCu,
|
0x31F0C3CCU,
|
||||||
0xB3B3E72Au,
|
0xB3B3E72AU,
|
||||||
0xC25CDBFFu,
|
0xC25CDBFFU,
|
||||||
0xD5CF4EFFu,
|
0xD5CF4EFFU,
|
||||||
0x680416B1u,
|
0x680416B1U,
|
||||||
0xCF5FDA18u,
|
0xCF5FDA18U,
|
||||||
0xF01286E9u,
|
0xF01286E9U,
|
||||||
0xA841CC0Au,
|
0xA841CC0AU,
|
||||||
0x31EA09CFu,
|
0x31EA09CFU,
|
||||||
0xE958788Au,
|
0xE958788AU,
|
||||||
0x02C83A7Cu,
|
0x02C83A7CU,
|
||||||
0xE49C3ED4u,
|
0xE49C3ED4U,
|
||||||
0x171BA8CCu,
|
0x171BA8CCU,
|
||||||
0x86988DAEu,
|
0x86988DAEU,
|
||||||
0x2BDD2FA1u };
|
0x2BDD2FA1U };
|
||||||
|
|
||||||
constexpr std::array alphabet{
|
constexpr std::array alphabet{
|
||||||
'A',
|
'A',
|
||||||
'B',
|
'B',
|
||||||
@ -210,14 +210,15 @@ int main() {
|
|||||||
'X',
|
'X',
|
||||||
'Y',
|
'Y',
|
||||||
'Z' }; // taille = 26
|
'Z' }; // taille = 26
|
||||||
constexpr std::size_t maxCompute = 308915776;
|
|
||||||
constexpr std::size_t maxDig = maxDigits(maxCompute);
|
|
||||||
|
|
||||||
NumberBase26<maxDig> number_base_26{ alphabet };
|
constexpr std::size_t max_compute = 308915776;
|
||||||
|
constexpr std::size_t max_dig = maxDigits(max_compute);
|
||||||
|
|
||||||
|
NumberBase26<max_dig> number_base_26{ alphabet };
|
||||||
|
|
||||||
const double start = omp_get_wtime();
|
const double start = omp_get_wtime();
|
||||||
#pragma omp parallel for firstprivate(number_base_26)
|
#pragma omp parallel for firstprivate(number_base_26) schedule(guided)
|
||||||
for (size_t i = 0; i < maxCompute; ++i) {
|
for (size_t i = 0; i < max_compute; ++i) {
|
||||||
number_base_26(i);
|
number_base_26(i);
|
||||||
const auto crc = ~(getCrc32(number_base_26.data.data(), number_base_26.data.size()));
|
const auto crc = ~(getCrc32(number_base_26.data.data(), number_base_26.data.size()));
|
||||||
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()) {
|
||||||
|
Loading…
Reference in New Issue
Block a user