diff --git a/061/main.cpp b/061/main.cpp new file mode 100644 index 0000000..ed81495 --- /dev/null +++ b/061/main.cpp @@ -0,0 +1,135 @@ +/* +Triangle, square, pentagonal, hexagonal, heptagonal, and octagonal numbers are all figurate (polygonal) numbers and are generated by the following formulae: + +Triangle P3,n=n(n+1)/2 1, 3, 6, 10, 15, ... +Square P4,n=n2 1, 4, 9, 16, 25, ... +Pentagonal P5,n=n(3n−1)/2 1, 5, 12, 22, 35, ... +Hexagonal P6,n=n(2n−1) 1, 6, 15, 28, 45, ... +Heptagonal P7,n=n(5n−3)/2 1, 7, 18, 34, 55, ... +Octagonal P8,n=n(3n−2) 1, 8, 21, 40, 65, ... +The ordered set of three 4-digit numbers: 8128, 2882, 8281, has three interesting properties. + +The set is cyclic, in that the last two digits of each number is the first two digits of the next number (including the last number with the first). +Each polygonal type: triangle (P3,127=8128), square (P4,91=8281), and pentagonal (P5,44=2882), is represented by a different number in the set. +This is the only set of 4-digit numbers with this property. +Find the sum of the only ordered set of six cyclic 4-digit numbers for which each polygonal type: triangle, square, pentagonal, hexagonal, heptagonal, and octagonal, is represented by a different number in the set. +*/ + +#include +#include +#include +#include +#include + +using namespace std; + +uint triangle(uint n){ + return n * (n + 1) / 2; +} + +uint square(uint n){ + return n * n; +} + +uint pentagonal(uint n){ + return n * (3 * n - 1) / 2; +} + +uint hexagonal(uint n){ + return n * (2 * n - 1); +} + +uint heptagonal(uint n){ + return n * (5 * n - 3) / 2; +} + +uint octogonal(uint n){ + return n * (3 * n - 2); +} + +bool validEnd(uint n){ + return n % 100 >= 10; +} + +void fillVector(std::vector & toFill, const uint bitmask, uint (*calc)(uint n)){ + uint value = calc(0); + + for(uint i = 0; value < 10000; ++i){ + if(value >= 1000 && validEnd(value)){ + toFill[value] |= bitmask; + } + value = calc(i + 1); + } +} + +// Non-recursive version of Heap's algorithm for permutations +// Source: https://en.wikipedia.org/wiki/Heap%27s_algorithm +vector> permutations(uint n, vector & A){ + vector> result; + vector c(n, 0); + + result.push_back(A); + + uint i = 1; + while(i < n){ + if(c[i] < i){ + if(i % 2 == 0){ + swap(A[0], A[i]); + } else{ + swap(A[c[i]], A[i]); + } + result.push_back(A); + c[i] += 1; + i = 1; + } else{ + c[i] = 0; + i++; + } + } + return result; +} + +bool checkCyclicness(const vector & v){ + for(int i = 0; i < 5; ++i){ + uint end = v[i] % 100; + uint start = v[i + 1] / 100; + + if(end != start){ + return false; + } + } + if(v[5] % 100 != v[0] / 100){ + return false; + } + + return true; +} + +void search(vector & sequence, uint mask = 0){ + +} + +int main(){ + + cout << "Hello this is Patrick" << endl; + auto start = chrono::high_resolution_clock::now(); + + // creating big vector with the numeric values and their corresponding mask + uint finalMask = 0b111111000; + + // Finally learned what exactly it means when 1 << n, which is nice + vector all(10000, 0); + fillVector(all, 1 << 3, triangle); + fillVector(all, 1 << 4, square); + fillVector(all, 1 << 5, pentagonal); + fillVector(all, 1 << 6, hexagonal); + fillVector(all, 1 << 7, heptagonal); + fillVector(all, 1 << 8, octogonal); + + + + cout << "Cycle not found" << endl; + auto duration = chrono::duration_cast(chrono::high_resolution_clock::now() - start); + cout << (float)duration.count()/1000 << endl; + return 0; +} \ No newline at end of file