From aabd66466e4c75067d7c31d2b38419340f08c62e Mon Sep 17 00:00:00 2001 From: hstejas Date: Sat, 14 Nov 2020 23:20:00 +0530 Subject: The Weekly Challenge - 086 --- challenge-086/hstejas/cpp/c1.cpp | 43 ++++++++ challenge-086/hstejas/cpp/c2.cpp | 210 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 253 insertions(+) create mode 100644 challenge-086/hstejas/cpp/c1.cpp create mode 100644 challenge-086/hstejas/cpp/c2.cpp (limited to 'challenge-086/hstejas/cpp') diff --git a/challenge-086/hstejas/cpp/c1.cpp b/challenge-086/hstejas/cpp/c1.cpp new file mode 100644 index 0000000000..79fa9a55bc --- /dev/null +++ b/challenge-086/hstejas/cpp/c1.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +// g++ --std=c++17 c1.cpp && ./a.out + +void pair_diff(unsigned int reference, std::vector nums) +{ + std::sort(nums.begin(), nums.end(), std::greater()); + auto start = nums.begin(); + auto curr = start; + while(start != nums.end() && curr != nums.end()) + { + ++curr; + int diff = std::abs(*start - *curr); + if(diff == reference) + { + std::cout << "1 as " << *start << " - " << *curr << " = " << diff << std::endl; + return; + } + else if (diff > reference) + { + ++start; + curr = start; + } + } + std::cout << "0" << std::endl; +} + +int main() +{ + std::vector>> tests { + {7, {50, 8, 12, 15, 5} }, + {6, {1, 5, 2, 9, 7} }, + {15, {10, 30, 20, 50, 40} }, + {15, {-15, -5, -30, 20, 50, 40} } + }; + + for (auto test : tests) + { + pair_diff(test.first, test.second); + } +} \ No newline at end of file diff --git a/challenge-086/hstejas/cpp/c2.cpp b/challenge-086/hstejas/cpp/c2.cpp new file mode 100644 index 0000000000..534a5f036b --- /dev/null +++ b/challenge-086/hstejas/cpp/c2.cpp @@ -0,0 +1,210 @@ +#include +#include +#include +#include +#include + +// https://raw.githubusercontent.com/agauniyal/rang/master/include/rang.hpp +#include "rang.hpp" + +// g++ --std=c++17 c2.cpp -O2 && ./a.out + +namespace std +{ + std::string to_string(bool in) + { + return in ? "true" : "false"; + } +} // namespace std + +class Board +{ +public: + + Board(const std::array, 9>& in) + :mBoard(in) { } + + void fill(int* in) + { + for(size_t row = 0; row < mBoard.size(); row++) + { + for(size_t col = 0; col < mBoard.size(); col++) + { + *(in + (mBoard.size() * row) + col) = mBoard[row][col]; + } + } + } + + void checkPrint(const std::array, 9>& ref) + { + for(size_t row=0; row < mBoard.size(); row++) + { + for(size_t col=0; col < mBoard.size(); col++) + { + if(mBoard[row][col] == ref[row][col]) + { + std::cout << mBoard[row][col] << " "; + } + else + { + std::cout << rang::fg::red << mBoard[row][col] << rang::fg::reset << " "; + } + } + std::cout << std::endl; + } + } + + void print() + { + for(size_t row=0; row < mBoard.size(); row++) + { + for(size_t col=0; col < mBoard.size(); col++) + { + if(mBoard[row][col] != 0) + { + std::cout << mBoard[row][col] << " "; + } + else + { + std::cout << rang::fg::red << mBoard[row][col] << rang::fg::reset << " "; + } + } + std::cout << std::endl; + } + } + + bool solve() + { + bool result = solveNext(0, 0); + std::cout << "Solved? " << std::to_string(result) << std::endl; + return result; + } + +protected: + + bool validRow(int num, size_t row) + { + return std::find(mBoard[row].begin(), mBoard[row].end(), num) == mBoard[row].end(); + } + + bool validCol(int num, size_t col) + { + // entire col + for(size_t irow = 0; irow < mBoard.size(); irow++) + { + if(mBoard[irow][col] == num) + { + return false; + } + } + return true; + } + + bool validBox(int num, size_t row, size_t col) + { + size_t oRow = 3 * (row / 3); + size_t oCol = 3 * (col / 3); + // entire box + for(size_t irow = oRow; irow < oRow+3; irow++) + { + if(std::find(mBoard[irow].begin() + oCol, mBoard[irow].begin() + oCol + 3, num) + != (mBoard[irow].begin() + oCol + 3)) + { + return false; + } + } + return true; + } + + bool isValid(int num, size_t row, size_t col) + { + return validRow(num, row) && validCol(num, col) && validBox(num, row, col); + } + + bool solveNext(size_t row, size_t col) + { + if(mBoard[row][col] == 0) + { + for(int num = 1; num <=9; num++) + { + if(isValid(num, row, col)) + { + mBoard[row][col] = num; + size_t nextCol = col == 8 ? 0 : col+1; + size_t nextRow = col == 8 ? row + 1 : row; + if(nextRow == 9 || solveNext(nextRow, nextCol)) + { + return true; + } + mBoard[row][col] = 0; + } + } + } + else + { + size_t nextCol = col == 8 ? 0 : col + 1; + size_t nextRow = col == 8 ? row + 1 : row; + if(nextRow == 9 || solveNext(nextRow, nextCol)) + { + return true; + } + } + return false; + } + + std::array, 9> mBoard; +}; + +#ifdef BUILD_SHARED +extern "C" { + bool solve(int *data) + { + std::array< std::array, 9> input; + for(size_t row = 0; row < input.size(); row++) + { + for(size_t col = 0; col < input.size(); col++) + { + input[row][col] = *(data + (row * input.size()) + col); + } + } + + Board board(input); + board.print(); + bool ret = board.solve(); + board.print(); + board.fill(data); + return ret; + } +} +#else +int main() +{ + std::array< std::array, 9> solved {{ + { 4, 3, 5, 2, 6, 9, 7, 8, 1 }, + { 6, 8, 2, 5, 7, 1, 4, 9, 3 }, + { 1, 9, 7, 8, 3, 4, 5, 6, 2 }, + { 8, 2, 6, 1, 9, 5, 3, 4, 7 }, + { 3, 7, 4, 6, 8, 2, 9, 1, 5 }, + { 9, 5, 1, 7, 4, 3, 6, 2, 8 }, + { 5, 1, 9, 3, 2, 6, 8, 7, 4 }, + { 2, 4, 8, 9, 5, 7, 1, 3, 6 }, + { 7, 6, 3, 4, 1, 8, 2, 5, 9 }, + }}; + + std::array< std::array, 9> input {{ + { 0, 0, 0, 2, 6, 0, 7, 0, 1 }, + { 6, 8, 0, 0, 7, 0, 0, 9, 0 }, + { 1, 9, 0, 0, 0, 4, 5, 0, 0 }, + { 8, 2, 0, 1, 0, 0, 0, 4, 0 }, + { 0, 0, 4, 6, 0, 2, 9, 0, 0 }, + { 0, 5, 0, 0, 0, 3, 0, 2, 8 }, + { 0, 0, 9, 3, 0, 0, 0, 7, 4 }, + { 0, 4, 0, 0, 5, 0, 0, 3, 6 }, + { 7, 0, 3, 0, 1, 8, 0, 0, 0 }, + }}; + + Board board(input); + board.solve(); + board.print(); +} +#endif // BUILD_SHARED \ No newline at end of file -- cgit From 056d904037e4c3a32913158368fde214b0dde3f0 Mon Sep 17 00:00:00 2001 From: Mohammad S Anwar Date: Sun, 15 Nov 2020 00:55:49 +0000 Subject: - Added solutions by Tejas. --- challenge-086/hstejas/cpp/c1.cpp | 43 -------- challenge-086/hstejas/cpp/c2.cpp | 210 ------------------------------------- challenge-086/hstejas/cpp/ch-1.cpp | 43 ++++++++ challenge-086/hstejas/cpp/ch-2.cpp | 210 +++++++++++++++++++++++++++++++++++++ 4 files changed, 253 insertions(+), 253 deletions(-) delete mode 100644 challenge-086/hstejas/cpp/c1.cpp delete mode 100644 challenge-086/hstejas/cpp/c2.cpp create mode 100644 challenge-086/hstejas/cpp/ch-1.cpp create mode 100644 challenge-086/hstejas/cpp/ch-2.cpp (limited to 'challenge-086/hstejas/cpp') diff --git a/challenge-086/hstejas/cpp/c1.cpp b/challenge-086/hstejas/cpp/c1.cpp deleted file mode 100644 index 79fa9a55bc..0000000000 --- a/challenge-086/hstejas/cpp/c1.cpp +++ /dev/null @@ -1,43 +0,0 @@ -#include -#include -#include - -// g++ --std=c++17 c1.cpp && ./a.out - -void pair_diff(unsigned int reference, std::vector nums) -{ - std::sort(nums.begin(), nums.end(), std::greater()); - auto start = nums.begin(); - auto curr = start; - while(start != nums.end() && curr != nums.end()) - { - ++curr; - int diff = std::abs(*start - *curr); - if(diff == reference) - { - std::cout << "1 as " << *start << " - " << *curr << " = " << diff << std::endl; - return; - } - else if (diff > reference) - { - ++start; - curr = start; - } - } - std::cout << "0" << std::endl; -} - -int main() -{ - std::vector>> tests { - {7, {50, 8, 12, 15, 5} }, - {6, {1, 5, 2, 9, 7} }, - {15, {10, 30, 20, 50, 40} }, - {15, {-15, -5, -30, 20, 50, 40} } - }; - - for (auto test : tests) - { - pair_diff(test.first, test.second); - } -} \ No newline at end of file diff --git a/challenge-086/hstejas/cpp/c2.cpp b/challenge-086/hstejas/cpp/c2.cpp deleted file mode 100644 index 534a5f036b..0000000000 --- a/challenge-086/hstejas/cpp/c2.cpp +++ /dev/null @@ -1,210 +0,0 @@ -#include -#include -#include -#include -#include - -// https://raw.githubusercontent.com/agauniyal/rang/master/include/rang.hpp -#include "rang.hpp" - -// g++ --std=c++17 c2.cpp -O2 && ./a.out - -namespace std -{ - std::string to_string(bool in) - { - return in ? "true" : "false"; - } -} // namespace std - -class Board -{ -public: - - Board(const std::array, 9>& in) - :mBoard(in) { } - - void fill(int* in) - { - for(size_t row = 0; row < mBoard.size(); row++) - { - for(size_t col = 0; col < mBoard.size(); col++) - { - *(in + (mBoard.size() * row) + col) = mBoard[row][col]; - } - } - } - - void checkPrint(const std::array, 9>& ref) - { - for(size_t row=0; row < mBoard.size(); row++) - { - for(size_t col=0; col < mBoard.size(); col++) - { - if(mBoard[row][col] == ref[row][col]) - { - std::cout << mBoard[row][col] << " "; - } - else - { - std::cout << rang::fg::red << mBoard[row][col] << rang::fg::reset << " "; - } - } - std::cout << std::endl; - } - } - - void print() - { - for(size_t row=0; row < mBoard.size(); row++) - { - for(size_t col=0; col < mBoard.size(); col++) - { - if(mBoard[row][col] != 0) - { - std::cout << mBoard[row][col] << " "; - } - else - { - std::cout << rang::fg::red << mBoard[row][col] << rang::fg::reset << " "; - } - } - std::cout << std::endl; - } - } - - bool solve() - { - bool result = solveNext(0, 0); - std::cout << "Solved? " << std::to_string(result) << std::endl; - return result; - } - -protected: - - bool validRow(int num, size_t row) - { - return std::find(mBoard[row].begin(), mBoard[row].end(), num) == mBoard[row].end(); - } - - bool validCol(int num, size_t col) - { - // entire col - for(size_t irow = 0; irow < mBoard.size(); irow++) - { - if(mBoard[irow][col] == num) - { - return false; - } - } - return true; - } - - bool validBox(int num, size_t row, size_t col) - { - size_t oRow = 3 * (row / 3); - size_t oCol = 3 * (col / 3); - // entire box - for(size_t irow = oRow; irow < oRow+3; irow++) - { - if(std::find(mBoard[irow].begin() + oCol, mBoard[irow].begin() + oCol + 3, num) - != (mBoard[irow].begin() + oCol + 3)) - { - return false; - } - } - return true; - } - - bool isValid(int num, size_t row, size_t col) - { - return validRow(num, row) && validCol(num, col) && validBox(num, row, col); - } - - bool solveNext(size_t row, size_t col) - { - if(mBoard[row][col] == 0) - { - for(int num = 1; num <=9; num++) - { - if(isValid(num, row, col)) - { - mBoard[row][col] = num; - size_t nextCol = col == 8 ? 0 : col+1; - size_t nextRow = col == 8 ? row + 1 : row; - if(nextRow == 9 || solveNext(nextRow, nextCol)) - { - return true; - } - mBoard[row][col] = 0; - } - } - } - else - { - size_t nextCol = col == 8 ? 0 : col + 1; - size_t nextRow = col == 8 ? row + 1 : row; - if(nextRow == 9 || solveNext(nextRow, nextCol)) - { - return true; - } - } - return false; - } - - std::array, 9> mBoard; -}; - -#ifdef BUILD_SHARED -extern "C" { - bool solve(int *data) - { - std::array< std::array, 9> input; - for(size_t row = 0; row < input.size(); row++) - { - for(size_t col = 0; col < input.size(); col++) - { - input[row][col] = *(data + (row * input.size()) + col); - } - } - - Board board(input); - board.print(); - bool ret = board.solve(); - board.print(); - board.fill(data); - return ret; - } -} -#else -int main() -{ - std::array< std::array, 9> solved {{ - { 4, 3, 5, 2, 6, 9, 7, 8, 1 }, - { 6, 8, 2, 5, 7, 1, 4, 9, 3 }, - { 1, 9, 7, 8, 3, 4, 5, 6, 2 }, - { 8, 2, 6, 1, 9, 5, 3, 4, 7 }, - { 3, 7, 4, 6, 8, 2, 9, 1, 5 }, - { 9, 5, 1, 7, 4, 3, 6, 2, 8 }, - { 5, 1, 9, 3, 2, 6, 8, 7, 4 }, - { 2, 4, 8, 9, 5, 7, 1, 3, 6 }, - { 7, 6, 3, 4, 1, 8, 2, 5, 9 }, - }}; - - std::array< std::array, 9> input {{ - { 0, 0, 0, 2, 6, 0, 7, 0, 1 }, - { 6, 8, 0, 0, 7, 0, 0, 9, 0 }, - { 1, 9, 0, 0, 0, 4, 5, 0, 0 }, - { 8, 2, 0, 1, 0, 0, 0, 4, 0 }, - { 0, 0, 4, 6, 0, 2, 9, 0, 0 }, - { 0, 5, 0, 0, 0, 3, 0, 2, 8 }, - { 0, 0, 9, 3, 0, 0, 0, 7, 4 }, - { 0, 4, 0, 0, 5, 0, 0, 3, 6 }, - { 7, 0, 3, 0, 1, 8, 0, 0, 0 }, - }}; - - Board board(input); - board.solve(); - board.print(); -} -#endif // BUILD_SHARED \ No newline at end of file diff --git a/challenge-086/hstejas/cpp/ch-1.cpp b/challenge-086/hstejas/cpp/ch-1.cpp new file mode 100644 index 0000000000..79fa9a55bc --- /dev/null +++ b/challenge-086/hstejas/cpp/ch-1.cpp @@ -0,0 +1,43 @@ +#include +#include +#include + +// g++ --std=c++17 c1.cpp && ./a.out + +void pair_diff(unsigned int reference, std::vector nums) +{ + std::sort(nums.begin(), nums.end(), std::greater()); + auto start = nums.begin(); + auto curr = start; + while(start != nums.end() && curr != nums.end()) + { + ++curr; + int diff = std::abs(*start - *curr); + if(diff == reference) + { + std::cout << "1 as " << *start << " - " << *curr << " = " << diff << std::endl; + return; + } + else if (diff > reference) + { + ++start; + curr = start; + } + } + std::cout << "0" << std::endl; +} + +int main() +{ + std::vector>> tests { + {7, {50, 8, 12, 15, 5} }, + {6, {1, 5, 2, 9, 7} }, + {15, {10, 30, 20, 50, 40} }, + {15, {-15, -5, -30, 20, 50, 40} } + }; + + for (auto test : tests) + { + pair_diff(test.first, test.second); + } +} \ No newline at end of file diff --git a/challenge-086/hstejas/cpp/ch-2.cpp b/challenge-086/hstejas/cpp/ch-2.cpp new file mode 100644 index 0000000000..534a5f036b --- /dev/null +++ b/challenge-086/hstejas/cpp/ch-2.cpp @@ -0,0 +1,210 @@ +#include +#include +#include +#include +#include + +// https://raw.githubusercontent.com/agauniyal/rang/master/include/rang.hpp +#include "rang.hpp" + +// g++ --std=c++17 c2.cpp -O2 && ./a.out + +namespace std +{ + std::string to_string(bool in) + { + return in ? "true" : "false"; + } +} // namespace std + +class Board +{ +public: + + Board(const std::array, 9>& in) + :mBoard(in) { } + + void fill(int* in) + { + for(size_t row = 0; row < mBoard.size(); row++) + { + for(size_t col = 0; col < mBoard.size(); col++) + { + *(in + (mBoard.size() * row) + col) = mBoard[row][col]; + } + } + } + + void checkPrint(const std::array, 9>& ref) + { + for(size_t row=0; row < mBoard.size(); row++) + { + for(size_t col=0; col < mBoard.size(); col++) + { + if(mBoard[row][col] == ref[row][col]) + { + std::cout << mBoard[row][col] << " "; + } + else + { + std::cout << rang::fg::red << mBoard[row][col] << rang::fg::reset << " "; + } + } + std::cout << std::endl; + } + } + + void print() + { + for(size_t row=0; row < mBoard.size(); row++) + { + for(size_t col=0; col < mBoard.size(); col++) + { + if(mBoard[row][col] != 0) + { + std::cout << mBoard[row][col] << " "; + } + else + { + std::cout << rang::fg::red << mBoard[row][col] << rang::fg::reset << " "; + } + } + std::cout << std::endl; + } + } + + bool solve() + { + bool result = solveNext(0, 0); + std::cout << "Solved? " << std::to_string(result) << std::endl; + return result; + } + +protected: + + bool validRow(int num, size_t row) + { + return std::find(mBoard[row].begin(), mBoard[row].end(), num) == mBoard[row].end(); + } + + bool validCol(int num, size_t col) + { + // entire col + for(size_t irow = 0; irow < mBoard.size(); irow++) + { + if(mBoard[irow][col] == num) + { + return false; + } + } + return true; + } + + bool validBox(int num, size_t row, size_t col) + { + size_t oRow = 3 * (row / 3); + size_t oCol = 3 * (col / 3); + // entire box + for(size_t irow = oRow; irow < oRow+3; irow++) + { + if(std::find(mBoard[irow].begin() + oCol, mBoard[irow].begin() + oCol + 3, num) + != (mBoard[irow].begin() + oCol + 3)) + { + return false; + } + } + return true; + } + + bool isValid(int num, size_t row, size_t col) + { + return validRow(num, row) && validCol(num, col) && validBox(num, row, col); + } + + bool solveNext(size_t row, size_t col) + { + if(mBoard[row][col] == 0) + { + for(int num = 1; num <=9; num++) + { + if(isValid(num, row, col)) + { + mBoard[row][col] = num; + size_t nextCol = col == 8 ? 0 : col+1; + size_t nextRow = col == 8 ? row + 1 : row; + if(nextRow == 9 || solveNext(nextRow, nextCol)) + { + return true; + } + mBoard[row][col] = 0; + } + } + } + else + { + size_t nextCol = col == 8 ? 0 : col + 1; + size_t nextRow = col == 8 ? row + 1 : row; + if(nextRow == 9 || solveNext(nextRow, nextCol)) + { + return true; + } + } + return false; + } + + std::array, 9> mBoard; +}; + +#ifdef BUILD_SHARED +extern "C" { + bool solve(int *data) + { + std::array< std::array, 9> input; + for(size_t row = 0; row < input.size(); row++) + { + for(size_t col = 0; col < input.size(); col++) + { + input[row][col] = *(data + (row * input.size()) + col); + } + } + + Board board(input); + board.print(); + bool ret = board.solve(); + board.print(); + board.fill(data); + return ret; + } +} +#else +int main() +{ + std::array< std::array, 9> solved {{ + { 4, 3, 5, 2, 6, 9, 7, 8, 1 }, + { 6, 8, 2, 5, 7, 1, 4, 9, 3 }, + { 1, 9, 7, 8, 3, 4, 5, 6, 2 }, + { 8, 2, 6, 1, 9, 5, 3, 4, 7 }, + { 3, 7, 4, 6, 8, 2, 9, 1, 5 }, + { 9, 5, 1, 7, 4, 3, 6, 2, 8 }, + { 5, 1, 9, 3, 2, 6, 8, 7, 4 }, + { 2, 4, 8, 9, 5, 7, 1, 3, 6 }, + { 7, 6, 3, 4, 1, 8, 2, 5, 9 }, + }}; + + std::array< std::array, 9> input {{ + { 0, 0, 0, 2, 6, 0, 7, 0, 1 }, + { 6, 8, 0, 0, 7, 0, 0, 9, 0 }, + { 1, 9, 0, 0, 0, 4, 5, 0, 0 }, + { 8, 2, 0, 1, 0, 0, 0, 4, 0 }, + { 0, 0, 4, 6, 0, 2, 9, 0, 0 }, + { 0, 5, 0, 0, 0, 3, 0, 2, 8 }, + { 0, 0, 9, 3, 0, 0, 0, 7, 4 }, + { 0, 4, 0, 0, 5, 0, 0, 3, 6 }, + { 7, 0, 3, 0, 1, 8, 0, 0, 0 }, + }}; + + Board board(input); + board.solve(); + board.print(); +} +#endif // BUILD_SHARED \ No newline at end of file -- cgit