From 858dbafac04dfb0ee477e2b88528c3cabdafc310 Mon Sep 17 00:00:00 2001 From: Teal Dulcet Date: Fri, 4 Jan 2019 01:29:55 -0800 Subject: [PATCH] Added files. --- .travis.yml | 23 + README.md | 554 ++++++++++++++++++- graphs.cpp | 141 +++++ graphs.hpp | 725 +++++++++++++++++++++++++ images/ASCII graph.png | Bin 0 -> 9351 bytes images/ASCII table.png | Bin 0 -> 14740 bytes images/array to plot.png | Bin 0 -> 9011 bytes images/array to table.png | Bin 0 -> 5706 bytes images/basic graph.png | Bin 0 -> 9410 bytes images/basic table.png | Bin 0 -> 14704 bytes images/char array to table.png | Bin 0 -> 14565 bytes images/double graph.png | Bin 0 -> 9179 bytes images/double table.png | Bin 0 -> 14696 bytes images/function to graph.png | Bin 0 -> 10364 bytes images/function to table.png | Bin 0 -> 8006 bytes images/graph colors.png | Bin 0 -> 6350 bytes images/heavy dashed graph.png | Bin 0 -> 10027 bytes images/heavy dashed table.png | Bin 0 -> 15088 bytes images/heavy graph.png | Bin 0 -> 9309 bytes images/heavy table.png | Bin 0 -> 14731 bytes images/light dashed graph.png | Bin 0 -> 9717 bytes images/light dashed table.png | Bin 0 -> 15061 bytes images/light graph.png | Bin 0 -> 8935 bytes images/light table.png | Bin 0 -> 14555 bytes images/multiple functions to graph.png | Bin 0 -> 10748 bytes images/multiple functions to table.png | Bin 0 -> 11902 bytes images/plot colors.png | Bin 0 -> 10527 bytes images/sorted array to table.png | Bin 0 -> 6590 bytes tables.cpp | 329 +++++++++++ tables.hpp | 519 ++++++++++++++++++ 30 files changed, 2290 insertions(+), 1 deletion(-) create mode 100644 .travis.yml create mode 100644 graphs.cpp create mode 100644 graphs.hpp create mode 100644 images/ASCII graph.png create mode 100644 images/ASCII table.png create mode 100644 images/array to plot.png create mode 100644 images/array to table.png create mode 100644 images/basic graph.png create mode 100644 images/basic table.png create mode 100644 images/char array to table.png create mode 100644 images/double graph.png create mode 100644 images/double table.png create mode 100644 images/function to graph.png create mode 100644 images/function to table.png create mode 100644 images/graph colors.png create mode 100644 images/heavy dashed graph.png create mode 100644 images/heavy dashed table.png create mode 100644 images/heavy graph.png create mode 100644 images/heavy table.png create mode 100644 images/light dashed graph.png create mode 100644 images/light dashed table.png create mode 100644 images/light graph.png create mode 100644 images/light table.png create mode 100644 images/multiple functions to graph.png create mode 100644 images/multiple functions to table.png create mode 100644 images/plot colors.png create mode 100644 images/sorted array to table.png create mode 100644 tables.cpp create mode 100644 tables.hpp diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..99bf0a8 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,23 @@ +language: cpp +compiler: + - clang + - gcc +matrix: + include: + - os: linux + dist: trusty + - os: linux + dist: xenial +install: + - sudo apt-get -yqq update + - sudo apt-get -yqq install cppcheck +script: + - g++ -Wall -g -fsanitize=address tables.cpp -o gcc_tables + - ./gcc_tables + - g++ -Wall -g -fsanitize=address graphs.cpp -o gcc_graphs + - ./gcc_graphs + - clang++ -Wall -g -fsanitize=address tables.cpp -o clang_tables + - ./clang_tables + - clang++ -Wall -g -fsanitize=address graphs.cpp -o clang_graphs + - ./clang_graphs + - cppcheck --error-exitcode=1 . diff --git a/README.md b/README.md index bdd555f..847d943 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,554 @@ -# Tables-and-Graphs +[![Build Status](https://travis-ci.org/tdulcet/Tables-and-Graphs.svg?branch=master)](https://travis-ci.org/tdulcet/Tables-and-Graphs) + +# Tables and Graphs + C++ Console Table and Graph/Plot Libraries + +Copyright © 2018 Teal Dulcet + +These header only libraries use [box-drawing](https://en.wikipedia.org/wiki/Box-drawing_character#Unicode), [Braille](https://en.wikipedia.org/wiki/Braille_Patterns), [fraction](https://en.wikipedia.org/wiki/Number_Forms) and other Unicode characters and [terminal colors and formatting](https://misc.flogisoft.com/bash/tip_colors_and_formatting) to output tables and graphs/plots to the console. + +Please visit [tealdulcet.com](https://www.tealdulcet.com/) to support these libraries and my other software development. + +## Tables + +### Usage + +Complete versions of all of the examples below and more can be found in the [tables.cpp](tables.cpp) file. + +Compile with: `g++ -Wall -g -O3 tables.cpp -o tables`. + +Run with: `./tables`. + +#### Output char array as table + +```cpp +#include "tables.hpp" + +using namespace std; + +int main() +{ + size_t rows = 5; + size_t columns = 5; + + char ***array; + + // Allocate and set array + + tableoptions aoptions; + aoptions.headerrow = true; + aoptions.headercolumn = true; + + table(rows, columns, array, NULL, NULL, aoptions); + + // Deallocate array + + return 0; +} +``` + +Table cells can contain [Unicode characters](https://en.wikipedia.org/wiki/List_of_Unicode_characters), but not newlines and tabs. + +![](images/char%20array%20to%20table.png) + +#### Output array as table with separate header row and column + +```cpp +#include "tables.hpp" + +using namespace std; + +int main() +{ + size_t rows = 4; + size_t columns = 4; + + const char* headerrow[] = {"Header row/column 1", "Header row 2", "Header row 3", "Header row 4", "Header row 5"}; + const char* headercolumn[] = {"Header column 2", "Header column 3", "Header column 4", "Header column 5"}; + + char ***array; + + // Allocate and set array + + tableoptions aoptions; + aoptions.headerrow = true; + aoptions.headercolumn = true; + + table(rows, columns, array, headerrow, headercolumn, aoptions); + + // Deallocate array + + return 0; +} +``` + +Output same as example above. + +#### Output array as table + +```cpp +#include "tables.hpp" + +using namespace std; + +int main() +{ + size_t rows = 5; + size_t columns = 5; + + double **array; // array can be any data type + + // Allocate and set array + + table(rows, columns, array, NULL, NULL, tabledefaultoptions); + + // Deallocate array + + return 0; +} +``` + +![](images/array%20to%20table.png) + +#### Output sorted array as table + +```cpp +#include +#include "tables.hpp" + +using namespace std; + +int dimensions; // Number of columns +int sortdimension; // Column to sort by + +template +bool compare(const T *a, const T *b) +{ + if (a[sortdimension] == b[sortdimension]) + for (int i = 0; i < dimensions; ++i) + if (sortdimension != i and a[i] != b[i]) + return a[i] < b[i]; + + return a[sortdimension] < b[sortdimension]; +} + +int main() +{ + size_t rows = 5; + size_t columns = 5; + + int **array; // array can be any data type + + // Allocate and set array + + dimensions = columns; + sortdimension = 0; + + sort(array, array + rows, compare); + + table(rows, columns, array, NULL, NULL, tabledefaultoptions); + + // Deallocate array + + return 0; +} +``` + +![](images/sorted%20array%20to%20table.png) + +#### Output single function as table + +```cpp +#include "tables.hpp" + +using namespace std; + +double afunction(double x) +{ + return x + 1; +} + +int main() +{ + double xmin = -10; + double xmax = 10; + double xscl = 2; + + tableoptions aoptions; + aoptions.headerrow = true; + + table(xmin, xmax, xscl, afunction, aoptions); + + return 0; +} +``` + +![](images/function%20to%20table.png) + +#### Output multiple functions as table + +```cpp +#include +#include "tables.hpp" + +using namespace std; + +double function1(double x) +{ + return 2 * x; +} + +double function2(double x) +{ + return pow(x, 2); +} + +int main() +{ + double xmin = -10; + double xmax = 10; + double xscl = 2; + + size_t numfunctions = 2; + + // Function parameter and return value can be any data type, as long as they are the same + double (*functions[])(double) = {function1, function2}; + + tableoptions aoptions; + aoptions.headerrow = true; + + table(xmin, xmax, xscl, numfunctions, functions, aoptions); + + return 0; +} +``` + +![](images/multiple%20functions%20to%20table.png) + +### Options + +#### Header row + +Option: `headerrow` + +Default value: `false` + +Header rows are bolded and centered. + +#### Header column + +Option: `headercolumn` + +Default value: `false` + +Header columns are bolded and centered. + +#### Table border + +Option: `tableborder` + +Default value: `true` + +#### Cell border + +Option: `cellborder` + +Default value: `false` + +Requires `tableborder` to be `true`. + +#### Cell padding + +Option: `padding` + +Default value: `1` + +#### Alignment + +Option: `alignment` + +Values: + +* `left` (default) +* `right` + +#### bool to alpha + +Option: `boolalpha` + +Default value: `false` + +#### Title + +Option: `title` + +Default value: `NULL` + +The title is word wraped based on the current width of the terminal, using [this](https://gist.github.com/tdulcet/819821ca69501822ad3f84a060c640a0) solution. Handles newlines, tabs and [Unicode characters](https://en.wikipedia.org/wiki/List_of_Unicode_characters). + +#### Border style + +Option: `style` + +Values: + +0. ASCII + + ![](images/ASCII%20table.png) +1. Basic + + ![](images/basic%20table.png) +2. Light (default) + + ![](images/light%20table.png) +3. Heavy + + ![](images/heavy%20table.png) +4. Double + + ![](images/double%20table.png) +5. Light Dashed + + ![](images/light%20dashed%20table.png) +6. Heavy Dashed + + ![](images/heavy%20dashed%20table.png) + +### Other C++ Console Tables Libraries + +* [C++ Text Table](https://github.com/haarcuba/cpp-text-table) (must specify every cell individually in there data structure, limited options, no Unicode support, no header row or column support) +* [Cpp Console Table](https://github.com/Oradle/CppConsoleTable) (must specify every cell individually in there data structure, no Unicode support, no header row or column support) +* [ConsoleTable](https://github.com/766F6964/ConsoleTable) (requires C++11, must specify entire row at once in there data structure, no header column support) + +## Graphs/Plots + +### Usage + +Complete versions of all of the examples below and more can be found in the [graphs.cpp](graphs.cpp) file. + +Compile with: `g++ -Wall -g -O3 graphs.cpp -o graphs`. + +Run with: `./graphs`. + +If `height` is `0`, it will be set to the current height of the terminal (number of rows times four). If `width` is `0`, it will be set to the current width of the terminal (number of columns times two). + +#### Output array as plot + +```cpp +#include "graphs.hpp" + +using namespace std; + +int main() +{ + size_t height = 160; + size_t width = 160; + + long double xmin = -20; + long double xmax = 20; + long double ymin = -20; + long double ymax = 20; + + size_t rows = 10; + + double **array; // array can be any data type, but must have exactly two columns + + // Allocate and set array + + graph(height, width, xmin, xmax, ymin, ymax, rows, array, graphdefaultoptions); + + // Deallocate array + + return 0; +} +``` + +If `xmin` and `xmax` are both `0`, they will be set to the respective minimum and maximum values of x in the array. If `ymin` and `ymax` are both `0`, they will be set to the respective minimum and maximum values of y in the array. + +![](images/array%20to%20plot.png) + +#### Output single function as graph + +```cpp +#include "graphs.hpp" + +using namespace std; + +double afunction(double x) +{ + return x + 1; +} + +int main() +{ + size_t height = 160; + size_t width = 160; + + long double xmin = -20; + long double xmax = 20; + long double ymin = -20; + long double ymax = 20; + + graph(height, width, xmin, xmax, ymin, ymax, afunction, graphdefaultoptions); + + return 0; +} +``` + +![](images/function%20to%20graph.png) + +#### Output multiple functions as graph + +```cpp +#include "graphs.hpp" + +using namespace std; + +double function1(double x) +{ + return 2 * x; +} + +double function2(double x) +{ + return pow(x, 2); +} + +int main() +{ + size_t height = 160; + size_t width = 160; + + long double xmin = -20; + long double xmax = 20; + long double ymin = -20; + long double ymax = 20; + + size_t numfunctions = 2; + + // Function parameter and return value can be any data type, as long as they are the same + double (*functions[])(double) = {function1, function2}; + + graph(height, width, xmin, xmax, ymin, ymax, numfunctions, functions, graphdefaultoptions); + + return 0; +} +``` + +![](images/multiple%20functions%20to%20graph.png) + +### Options + +#### Border/Axis + +Option: `border` + +Default value: `true` + +#### Axis labels + +Option: `axislabel` + +Default value: `true` + +Requires `border` to be `true`. + +#### Axis units labels + +Option: `axisunitslabel` + +Default value: `true` + +Requires `border` and `axislabel` to be `true`. + +#### Title + +Option: `title` + +Default value: `NULL` + +The title is word wraped based on the current width of the terminal, using [this](https://gist.github.com/tdulcet/819821ca69501822ad3f84a060c640a0) solution. Handles newlines, tabs and [Unicode characters](https://en.wikipedia.org/wiki/List_of_Unicode_characters). + +#### Axis/Border style + +Option: `style` + +Values: + +0. ASCII + + ![](images/ASCII%20graph.png) +1. Basic + + ![](images/basic%20graph.png) +2. Light (default) + + ![](images/light%20graph.png) +3. Heavy + + ![](images/heavy%20graph.png) +4. Double + + ![](images/double%20graph.png) +5. Light Dashed + + ![](images/light%20dashed%20graph.png) +6. Heavy Dashed + + ![](images/heavy%20dashed%20graph.png) + +#### Graph/Plot Color + +Option: `color` + +Values: + +0. System default +1. Black +2. Red (default) +3. Green +4. Yellow +5. Blue +6. Cyan +7. Light gray +8. Dark gray +9. Light red +10. Light green +11. Light yellow +12. Light blue +13. Light cyan +14. White + +See [here](https://misc.flogisoft.com/bash/tip_colors_and_formatting#foreground_text) for examples of the colors. + +Only used for plots and when graphing a single function. + +When graphing multiple functions, colors `2` - `14` are used inorder. Color `0` is used where the functions cross. + +##### Plot + +![](images/plot%20colors.png) + +##### Graph + +![](images/graph%20colors.png) + +### Other C++ Console Graphs/Plots Libraries + +* [C++ terminal plotting library](https://github.com/fbbdev/plot) (requires C++14, based on [UnicodePlots.jl](https://github.com/Evizero/UnicodePlots.jl), no documentation and very difficult to use, although supports animations) + +## Contributing + +Pull requests welcome! Ideas for contributions: + +* Add more options + * Add an option to print a border around graphs/plots +* Add more examples +* Improve the performance +* Handle newlines, tabs and formatted text in the tables +* Handle formatted text in the table and graph/plot titles +* Support more graph/plot colors + * Support combining colors when functions cross +* Support plotting multiple arrays of different sizes +* Port to other languages (C, Java, Rust, etc.) diff --git a/graphs.cpp b/graphs.cpp new file mode 100644 index 0000000..cd733e6 --- /dev/null +++ b/graphs.cpp @@ -0,0 +1,141 @@ +// Teal Dulcet, CS546 + +// Compile: g++ -Wall -g -O3 graphs.cpp -o graphs + +// Run: ./graphs + +#include +#include "graphs.hpp" + +using namespace std; + +long double afunction(long double x) +{ + return x + 1; +} + +long double function1(long double x) +{ + return 2 * x; +} + +long double function2(long double x) +{ + return pow(x, 2); +} + +long double function3(long double x) +{ + return sin(x); +} + +long double function4(long double x) +{ + return cos(x); +} + +long double function5(long double x) +{ + return tan(x); +} + +int main() +{ + const size_t height = 160; + const size_t width = 160; + + const long double xmin = -20; + const long double xmax = 20; + const long double ymin = -20; + const long double ymax = 20; + + const size_t rows = 10; + const size_t columns = 2; + + // Output array as plot + cout << "\nOutput array as plot\n\n"; + { + long double **array; + array = new long double *[rows]; + for (unsigned int i = 0; i < rows; ++i) + array[i] = new long double[columns]; + + for (unsigned int i = 0; i < rows; ++i) + for (unsigned int j = 0; j < columns; ++j) + array[i][j] = i + j; //rand(); + + graphoptions aoptions; + + for (unsigned int k = 0; k < (sizeof styles / sizeof styles[0]); ++k) + { + aoptions.style = k; + + graph(height, width, xmin, xmax, ymin, ymax, rows, array, aoptions); + } + + if (array != NULL) + { + for (unsigned int i = 0; i < rows; ++i) + delete[] array[i]; + + delete[] array; + } + } + // Output single function as graph + cout << "\nOutput single function as graph\n\n"; + { + graphoptions aoptions; + + for (unsigned int k = 0; k < (sizeof styles / sizeof styles[0]); ++k) + { + aoptions.style = k; + + graph(height, width, xmin, xmax, ymin, ymax, afunction, aoptions); + } + } + // Output multiple functions as graph + cout << "\nOutput multiple functions as graph\n\n"; + { + long double (*functions[])(long double) = {function1, function2}; + + graphoptions aoptions; + + for (unsigned int k = 0; k < (sizeof styles / sizeof styles[0]); ++k) + { + aoptions.style = k; + + graph(height, width, xmin, xmax, ymin, ymax, 2, functions, aoptions); + } + } + { + const long double xmin = -(2 * M_PI); + const long double xmax = 2 * M_PI; + const long double ymin = -4; + const long double ymax = 4; + + long double (*functions[])(long double) = {function3, function4, function5}; + + graphoptions aoptions; + aoptions.axisunitslabel = false; + + for (unsigned int k = 0; k < (sizeof styles / sizeof styles[0]); ++k) + { + aoptions.style = k; + + graph(height, width, xmin, xmax, ymin, ymax, 3, functions, aoptions); + } + + /*aoptions.style = 2; + + for (unsigned int k = 10; k < 300; ++k) + { + cout << "\e[1;1H" << "\e[2J"; + + graph(k, k, xmin, xmax, ymin, ymax, 3, functions, aoptions); + + usleep(200000); + }*/ + } + + return 0; +} diff --git a/graphs.hpp b/graphs.hpp new file mode 100644 index 0000000..c35dbef --- /dev/null +++ b/graphs.hpp @@ -0,0 +1,725 @@ +// Teal Dulcet, CS546 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +const char *const styles[][11] = { + {"-", "|", "+", "+", "+", "+", "+", "+", "+", "+", "+"}, //ASCII + {"—", "|", "+", "+", "+", "+", "+", "+", "+", "+", "+"}, //Basic + {"─", "│", "┌", "┬", "┐", "├", "┼", "┤", "└", "┴", "┘"}, //Light + {"━", "┃", "┏", "┳", "┓", "┣", "╋", "┫", "┗", "┻", "┛"}, //Heavy + {"═", "║", "╔", "╦", "╗", "╠", "╬", "╣", "╚", "╩", "╝"}, //Double + {"╌", "╎", "┌", "┬", "┐", "├", "┼", "┤", "└", "┴", "┘"}, //Light Dashed + {"╍", "╏", "┏", "┳", "┓", "┣", "╋", "┫", "┗", "┻", "┛"} //Heavy Dashed +}; +// {" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}};//No border + +const char *const colors[] = {"\e[39m", "\e[30m", "\e[31m", "\e[32m", "\e[33m", "\e[34m", "\e[35m", "\e[36m", "\e[37m", "\e[90m", "\e[91m", "\e[92m", "\e[93m", "\e[94m", "\e[95m", "\e[96m", "\e[97m"}; + +const char *const dots[] = {"⠀", "⠁", "⠂", "⠃", "⠄", "⠅", "⠆", "⠇", "⠈", "⠉", "⠊", "⠋", "⠌", "⠍", "⠎", "⠏", "⠐", "⠑", "⠒", "⠓", "⠔", "⠕", "⠖", "⠗", "⠘", "⠙", "⠚", "⠛", "⠜", "⠝", "⠞", "⠟", "⠠", "⠡", "⠢", "⠣", "⠤", "⠥", "⠦", "⠧", "⠨", "⠩", "⠪", "⠫", "⠬", "⠭", "⠮", "⠯", "⠰", "⠱", "⠲", "⠳", "⠴", "⠵", "⠶", "⠷", "⠸", "⠹", "⠺", "⠻", "⠼", "⠽", "⠾", "⠿", "⡀", "⡁", "⡂", "⡃", "⡄", "⡅", "⡆", "⡇", "⡈", "⡉", "⡊", "⡋", "⡌", "⡍", "⡎", "⡏", "⡐", "⡑", "⡒", "⡓", "⡔", "⡕", "⡖", "⡗", "⡘", "⡙", "⡚", "⡛", "⡜", "⡝", "⡞", "⡟", "⡠", "⡡", "⡢", "⡣", "⡤", "⡥", "⡦", "⡧", "⡨", "⡩", "⡪", "⡫", "⡬", "⡭", "⡮", "⡯", "⡰", "⡱", "⡲", "⡳", "⡴", "⡵", "⡶", "⡷", "⡸", "⡹", "⡺", "⡻", "⡼", "⡽", "⡾", "⡿", "⢀", "⢁", "⢂", "⢃", "⢄", "⢅", "⢆", "⢇", "⢈", "⢉", "⢊", "⢋", "⢌", "⢍", "⢎", "⢏", "⢐", "⢑", "⢒", "⢓", "⢔", "⢕", "⢖", "⢗", "⢘", "⢙", "⢚", "⢛", "⢜", "⢝", "⢞", "⢟", "⢠", "⢡", "⢢", "⢣", "⢤", "⢥", "⢦", "⢧", "⢨", "⢩", "⢪", "⢫", "⢬", "⢭", "⢮", "⢯", "⢰", "⢱", "⢲", "⢳", "⢴", "⢵", "⢶", "⢷", "⢸", "⢹", "⢺", "⢻", "⢼", "⢽", "⢾", "⢿", "⣀", "⣁", "⣂", "⣃", "⣄", "⣅", "⣆", "⣇", "⣈", "⣉", "⣊", "⣋", "⣌", "⣍", "⣎", "⣏", "⣐", "⣑", "⣒", "⣓", "⣔", "⣕", "⣖", "⣗", "⣘", "⣙", "⣚", "⣛", "⣜", "⣝", "⣞", "⣟", "⣠", "⣡", "⣢", "⣣", "⣤", "⣥", "⣦", "⣧", "⣨", "⣩", "⣪", "⣫", "⣬", "⣭", "⣮", "⣯", "⣰", "⣱", "⣲", "⣳", "⣴", "⣵", "⣶", "⣷", "⣸", "⣹", "⣺", "⣻", "⣼", "⣽", "⣾", "⣿"}; + +const int values[][4] = {{0x1, 0x2, 0x4, 0x40}, {0x8, 0x10, 0x20, 0x80}}; + +const char *const fractions[] = {"¼", "½", "¾", "⅐", "⅑", "⅒", "⅓", "⅔", "⅕", "⅖", "⅗", "⅘", "⅙", "⅚", "⅛", "⅜", "⅝", "⅞"}; + +const long double fractionvalues[] = {1.0L / 4.0L, 1.0L / 2.0L, 3.0L / 4.0L, 1.0L / 7.0L, 1.0L / 9.0L, 1.0L / 10.0L, 1.0L / 3.0L, 2.0L / 3.0L, 1.0L / 5.0L, 2.0L / 5.0L, 3.0L / 5.0L, 4.0L / 5.0L, 1.0L / 6.0L, 5.0L / 6.0L, 1.0L / 8.0L, 3.0L / 8.0L, 5.0L / 8.0L, 7.0L / 8.0L}; + +struct graphoptions +{ + bool border; + bool axislabel; + bool axisunitslabel; + char *title; + unsigned int style; + unsigned int color; + graphoptions(void); + ~graphoptions(void); +}; + +graphoptions::graphoptions(void) +{ + border = true; + axislabel = true; + axisunitslabel = true; + style = 2; + color = 2; + title = NULL; +} + +graphoptions::~graphoptions(void) +{ +} + +const graphoptions graphdefaultoptions; + +// Number of columns needed to represent the string +// Adapted from: https://stackoverflow.com/a/31124065 +int strcol(const char *const str) +{ + size_t length = strlen(str); + for (size_t i = 0; i < length; ++i) + if (iscntrl(str[i])) + { + cerr << "\nError! Control character in string.\n"; + cout << "Control character: " << (int)str[i] << "\n"; + } + + length = mbstowcs(NULL, str, 0); + if (length == (size_t)-1) + { + cerr << "\nError! mbstowcs failed. Invalid multibyte character.\n"; + exit(1); + } + ++length; + + wchar_t *wcstring = new wchar_t[length]; + + if (mbstowcs(wcstring, str, length) == (size_t)-1) + { + if (wcstring != NULL) + delete[] wcstring; + + cerr << "\nError! mbstowcs failed. Invalid multibyte character.\n"; + exit(1); + } + + int width = wcswidth(wcstring, length); + if (width == -1) + { + cerr << "\nError! wcswidth failed. Nonprintable wide character.\n"; + exit(1); + } + + if (wcstring != NULL) + delete[] wcstring; + + return width; +} + +// Word wrap +// Source: https://gist.github.com/tdulcet/819821ca69501822ad3f84a060c640a0 +// Adapted from: https://stackoverflow.com/a/42016346 and https://stackoverflow.com/a/13094734 +string wrap(const char *const str, const size_t line_length) +{ + char words[strlen(str) + 1]; + strcpy(words, str); + string wrapped; + + size_t index = 0; + size_t linelen = 0; + while (words[index] != '\0') + { + if (words[index] == '\n') + { + linelen = 0; + } + else if (isspace(words[index])) + { + size_t tempindex = index + 1; + size_t templinelen = linelen; + while (!isspace(words[tempindex]) and words[tempindex] != '\0') + { + ++templinelen; + + ++tempindex; + } + + char temp[templinelen + 1]; + strncpy(temp, words + (index - linelen), templinelen); + temp[templinelen] = '\0'; + + size_t width = strcol(temp); + + if (width >= line_length) + { + words[index] = '\n'; + linelen = 0; + } + } + + if (words[index] == '\t') + linelen += 8 - (linelen % 8); + else if (words[index] != '\n') + ++linelen; + + ++index; + } + wrapped = words; + return wrapped; +} + +// Convert fractions and constants to Unicode characters +size_t outputlabel(const long double label, ostringstream &strm) +{ + bool output = false; + + long double intpart = 0; + long double fractionpart = abs(modf(label, &intpart)); + + for (unsigned int i = 0; i < (sizeof fractions / sizeof fractions[0]) and !output; ++i) + { + if (abs(fractionpart - fractionvalues[i]) < DBL_EPSILON) + { + if (intpart != 0) + strm << intpart; + + strm << fractions[i]; + + output = true; + } + } + + if (!output and fmod(label, M_PI) == 0) + { + const char symbol[] = "π"; + + intpart = label / M_PI; + + if (intpart == -1) + strm << "-"; + else if (intpart != 1) + strm << intpart; + + strm << symbol; + + output = true; + } + else if (!output and fmod(label, M_E) == 0) + { + const char symbol[] = "e"; + + intpart = label / M_E; + + if (intpart == -1) + strm << "-"; + else if (intpart != 1) + strm << intpart; + + strm << symbol; + + output = true; + } + + if (!output) + strm << label; + + size_t length = strcol(strm.str().c_str()); + + return length; +} + +// Output graph +int graph(const size_t height, const size_t width, const long double xmin, const long double xmax, const long double ymin, const long double ymax, unsigned short **array, const graphoptions &aoptions) +{ + if (array == NULL) + return 1; + + const bool border = aoptions.border; + const bool axislabel = aoptions.axislabel; + const bool axisunitslabel = aoptions.axisunitslabel; + const char *const title = aoptions.title; + const unsigned int style = aoptions.style; + + if (style >= (sizeof styles / sizeof styles[0])) + return 1; + + if (height == 0) + return 1; + + if (width == 0) + return 1; + + struct winsize w; + ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); + + const int aheight = height / 4; + const int awidth = width / 2; + + if (aheight > w.ws_row) + { + cerr << "The height of the graph (" << aheight << ") is greater then the height of the terminal (" << w.ws_row << ").\n"; + return 1; + } + + if (awidth > w.ws_col) + { + cerr << "The width of the graph (" << awidth << ") is greater then the width of the terminal (" << w.ws_col << ").\n"; + return 1; + } + + if (xmin >= xmax) + { + cerr << "xmin must be less than xmax.\n"; + return 1; + } + + if (ymin >= ymax) + { + cerr << "ymin must be less than ymax.\n"; + return 1; + } + + const long double xscl = width / (xmax - xmin); + const long double yscl = height / (ymax - ymin); + const long double xaxis = width - (xmax * xscl); + const long double yaxis = ymax * yscl; + const int divisor = 2 * 4 * ((width / 160.0) > 1 ? (width / 160) + 1 : 1); + + setlocale(LC_CTYPE, ""); + + if (title != NULL and title[0] != '\0') + cout << wrap(title, w.ws_col) << "\n"; + + for (unsigned int i = 0; i < height; i += 4) + { + const bool ayaxis = (i <= yaxis and (i + 4) > yaxis); + const bool yaxislabel = (i <= (yaxis + 4) and (i + 4) > (yaxis + 4)); + + ostringstream ylabelstrm; + size_t ylabellength = 0; + + if (border and axislabel and axisunitslabel) + { + bool output = false; + long double label; + int adivisor = divisor; + if (i < yaxis) + adivisor = -adivisor; + + for (long double k = yaxis + adivisor; ((i < yaxis and k >= i) or (i > yaxis and k < (i + 4))) and (i >= 4 or !axislabel) and !output; k += adivisor) + { + if (i <= k and (i + 4) > k) + { + label = ymax - (k / yscl); + + output = true; + } + } + + if (output) + { + ylabellength = outputlabel(label, ylabelstrm); + ylabellength *= 2; + } + } + + for (unsigned int j = 0; j < width; j += 2) + { + const bool axaxis = (j <= xaxis and (j + 2) > xaxis); + const bool xaxislabel = (j <= (xaxis - 2) and (j + 2) > (xaxis - 2)); + + bool output = false; + + if (border) + { + if (axaxis and ayaxis) + { + cout << styles[style][6]; + output = true; + } + else if (axaxis) + { + if (axisunitslabel) + { + int adivisor = divisor; + if (i < yaxis) + adivisor = -adivisor; + + for (long double k = yaxis + adivisor; ((i < yaxis and k >= i) or (i > yaxis and k < (i + 4))) and (i >= 4 or !axislabel) and !output; k += adivisor) + { + if (i <= k and (i + 4) > k) + { + cout << styles[style][7]; + output = true; + } + } + } + if (!output) + { + if (i == 0) + cout << styles[style][4]; + else if (i >= (height - 4)) + cout << styles[style][10]; + else + cout << styles[style][1]; + output = true; + } + } + else if (ayaxis) + { + if (axisunitslabel) + { + int adivisor = divisor; + if (j < xaxis) + adivisor = -adivisor; + + for (long double k = xaxis + adivisor; ((j < xaxis and k >= j) or (j > xaxis and k < (j + 2))) and (j < (width - 4) or !axislabel) and !output; k += adivisor) + { + if (j <= k and (j + 2) > k) + { + cout << styles[style][3]; + output = true; + } + } + } + if (!output) + { + if (j == 0) + cout << styles[style][2]; + else if (j >= (width - 2)) + cout << styles[style][4]; + else + cout << styles[style][0]; + output = true; + } + } + else if (yaxislabel and xaxislabel and axisunitslabel) + { + cout << "0"; + output = true; + } + else if (j >= (width - 2) and yaxislabel and axislabel) + { + cout << "x"; + output = true; + } + else if (yaxislabel and axislabel and axisunitslabel) + { + long double label; + int adivisor = divisor; + if (j < xaxis) + { + adivisor = -adivisor; + j += 2; + } + + for (long double k = xaxis + adivisor; ((j < xaxis and k >= j) or (j > xaxis and k < (j + 2))) and j < (width - 2) and !output; k += adivisor) + { + if (j <= k and (j + 2) > k) + { + label = (k / xscl) + xmin; + + output = true; + } + } + + if (adivisor < 0) + j -= 2; + + if (output) + { + output = false; + + ostringstream strm; + size_t length = outputlabel(label, strm); + length *= 2; + if ((j >= xaxis or (j + length) < (xaxis - 4)) and (j + length) < (width - 2)) + { + cout << strm.str(); + + if (length > 2) + j += length - 2; + + if (adivisor < 0) + output = true; + else + j += 2; + } + } + } + else if (i == 0 and xaxislabel and axislabel) + { + cout << "y"; + output = true; + } + else if ((j <= (xaxis - ylabellength) and (j + 2) > (xaxis - ylabellength)) and axislabel and axisunitslabel) + { + cout << ylabelstrm.str(); + output = true; + if (ylabellength > 2) + j += ylabellength - 2; + } + } + + if (!output) + { + unsigned int dot = 0; + unsigned short color = 0; + + for (int k = 0; k < 2 and (j + k) < width; ++k) + { + for (int l = 0; l < 4 and (i + l) < height; ++l) + { + dot += (array[j + k][i + l] ? 1 : 0) * values[k][l]; + if (color) + { + if (array[j + k][i + l] and color != array[j + k][i + l]) + color = 1; + } + else + color = array[j + k][i + l]; + } + } + + if (color) + --color; + + if (color) + cout << colors[color]; + + cout << "\e[1m" << dots[dot] << "\e[22m"; + + if (color) + cout << colors[0]; + } + } + + cout << "\n"; + } + + cout << endl; + + return 0; +} + +// Convert array to graph and output +template +int graph(size_t height, size_t width, long double xmin, long double xmax, long double ymin, long double ymax, const size_t rows, T **array, const graphoptions &aoptions) +{ + if (rows == 0) + return 1; + + if (array == NULL) + return 1; + + const unsigned int color = aoptions.color; + + if (color >= (sizeof colors / sizeof colors[0])) + return 1; + + struct winsize w; + ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); + + if (height == 0) + height = w.ws_row * 4; + + if (width == 0) + width = w.ws_col * 2; + + const int aheight = height / 4; + const int awidth = width / 2; + + if (aheight > w.ws_row) + { + cerr << "The height of the graph (" << aheight << ") is greater then the height of the terminal (" << w.ws_row << ").\n"; + return 1; + } + + if (awidth > w.ws_col) + { + cerr << "The width of the graph (" << awidth << ") is greater then the width of the terminal (" << w.ws_col << ").\n"; + return 1; + } + + if (xmin == 0 and xmax == 0) + { + xmin = numeric_limits::max(); + xmax = numeric_limits::min(); + + for (unsigned int i = 0; i < rows; ++i) + { + if (array[i][0] < xmin) + xmin = array[i][0]; + + if (array[i][0] > xmax) + xmax = array[i][0]; + } + } + + if (ymin == 0 and ymax == 0) + { + ymin = numeric_limits::max(); + ymax = numeric_limits::min(); + + for (unsigned int i = 0; i < rows; ++i) + { + if (array[i][1] < ymin) + ymin = array[i][1]; + + if (array[i][1] > ymax) + ymax = array[i][1]; + } + } + + if (xmin >= xmax) + { + cerr << "xmin must be less than xmax.\n"; + return 1; + } + + if (ymin >= ymax) + { + cerr << "ymin must be less than ymax.\n"; + return 1; + } + + const long double xscl = width / (xmax - xmin); + const long double yscl = height / (ymax - ymin); + const long double xaxis = width - (xmax * xscl); + const long double yaxis = ymax * yscl; + + unsigned short **aarray; + aarray = new unsigned short *[width]; + for (unsigned int i = 0; i < width; ++i) + aarray[i] = new unsigned short[height]; + + for (unsigned int i = 0; i < width; ++i) + for (unsigned int j = 0; j < height; ++j) + aarray[i][j] = 0; + + for (unsigned int i = 0; i < rows; ++i) + { + if (array[i][0] >= xmin and array[i][0] < xmax and array[i][1] >= ymin and array[i][1] < ymax) + { + const long long x = (array[i][0] * xscl) + xaxis; + const long long y = (yaxis - (array[i][1] * yscl)) - 1; + + aarray[x][y] = color + 1; + } + } + + int code = graph(height, width, xmin, xmax, ymin, ymax, aarray, aoptions); + + if (aarray != NULL) + { + for (unsigned int i = 0; i < width; ++i) + delete[] aarray[i]; + + delete[] aarray; + } + + return code; +} + +// Convert one or more functions to graph and output +template +int graph(size_t height, size_t width, const long double xmin, const long double xmax, const long double ymin, const long double ymax, const size_t numfunctions, T (*functions[])(T), const graphoptions &aoptions) +{ + const unsigned int color = aoptions.color; + + if (color >= (sizeof colors / sizeof colors[0])) + return 1; + + if (numfunctions == 0) + return 1; + + struct winsize w; + ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); + + if (height == 0) + height = w.ws_row * 4; + + if (width == 0) + width = w.ws_col * 2; + + const int aheight = height / 4; + const int awidth = width / 2; + + if (aheight > w.ws_row) + { + cerr << "The height of the graph (" << aheight << ") is greater then the height of the terminal (" << w.ws_row << ").\n"; + return 1; + } + + if (awidth > w.ws_col) + { + cerr << "The width of the graph (" << awidth << ") is greater then the width of the terminal (" << w.ws_col << ").\n"; + return 1; + } + + if (xmin >= xmax) + { + cerr << "xmin must be less than xmax.\n"; + return 1; + } + + if (ymin >= ymax) + { + cerr << "ymin must be less than ymax.\n"; + return 1; + } + + const size_t rows = width; + + const long double xscl = width / (xmax - xmin); + const long double yscl = height / (ymax - ymin); + const long double xaxis = width - (xmax * xscl); + const long double yaxis = ymax * yscl; + + unsigned short **array; + array = new unsigned short *[width]; + for (unsigned int i = 0; i < width; ++i) + array[i] = new unsigned short[height]; + + for (unsigned int i = 0; i < width; ++i) + for (unsigned int j = 0; j < height; ++j) + array[i][j] = 0; + + for (unsigned int j = 0; j < numfunctions; ++j) + { + unsigned short acolor = numfunctions == 1 ? color + 1 : (j % ((sizeof colors / sizeof colors[0]) - 2)) + 3; + + for (long double i = 0; i < rows; i += 0.5) + { + T x = (i / xscl) + xmin; + T y = (functions[j])(x); + + if (x >= xmin and x < xmax and y >= ymin and y < ymax) + { + const long long ax = (x * xscl) + xaxis; + const long long ay = (yaxis - (y * yscl)) - 1; + + if (array[ax][ay]) + { + if (array[ax][ay] != acolor) + array[ax][ay] = 1; + } + else + array[ax][ay] = acolor; + } + } + } + + int code = graph(height, width, xmin, xmax, ymin, ymax, array, aoptions); + + if (array != NULL) + { + for (unsigned int i = 0; i < width; ++i) + delete[] array[i]; + + delete[] array; + } + + return code; +} + +// Convert single function to function array and output +template +int graph(size_t height, size_t width, const long double xmin, const long double xmax, const long double ymin, const long double ymax, T afunction(T), const graphoptions &aoptions) +{ + T(*functions[]) + (T) = {afunction}; + + return graph(height, width, xmin, xmax, ymin, ymax, 1, functions, aoptions); +} diff --git a/images/ASCII graph.png b/images/ASCII graph.png new file mode 100644 index 0000000000000000000000000000000000000000..219656dd52ae6accffe8588b1d97e8dc540aa77a GIT binary patch literal 9351 zcmeHNc{r5&+kYe}!s)0~GPG(#9f>S6X}MGir7T${R5~d`_GM;@N>L_B$j%XESC%o% zBr#=8vSpYuS;k;Y%#7LJXXxmhqx1WnclqOeuj_rTYi1r}=9%ZY@9+KjeD2Tv+_5k- zk&{^?0|0>Bk;4a10>FZs;KOS10`Q%*&zHn65?&`w_5=CNYpLKL3tf$m8v{TQMwag+ z1^&InqEa4vsWN{d=(|Kd2knk!?BX=-!T#MQ(gtob;p zf%G$YDl=R1s_IvRRVuWcP|^V)bt2@M9C1<0m_4MyNb`;nyK^$sMAuMf&$ zRv3xYxOx#gqYp38dW3;KW)f5#s0Q!u2R+Or0y`C7ZK5Y1L3S7-He$Vm6PTPK5!aq| zac?dnB5Tp}_cig29)agBrRHR6t`$Il)R!SyaFO#T8ca(jBuf_+#eFh>4|O7f2Rcx% z%z{%n4PK(>8qkSuRr=a3WbqGJI-B|>QpdO>{1}}21LDHTgpYo^t*EfJZwCLLKUq3Q) zlxyl{Hdfe+huTV;pX;Ld!8M7b##|3$N^=I;q4Hs+Kc_#w<)iXo7*-0{cRgm$C~a@b zuzs;$XVjO8a)`7}0->T$Agm8pGjPEAl5f(8x>l}PULiM|f($w^2@-%Iej>i(^}BKi zu_L&PT_aRFYN8rb6+F$&jErGxX3581Hh*pB##{x+Y$Xskt#D)8mruQ|%k*+7!ZH!4 zKu$1masYeC7QCoK6ZlG(m^`hg|7msZl*eZ6L`eLa z;Y&}wF0BS+))9!AEhT>Jl#90dL0|Zu0fG*Spm(gH3N8m6is_`Jvc@cR2_O01n&s8} zGCY2@$g8PWI0B}{Sjh0?$f~j(47yLkp$|y55oO7%MtjSiT=urL+DUkdG;xUmqr2|4 z6@6s2!Mb2xhlOwdnXBx_Hl^iW$vwdn318UAswyP%ZGpn&GtjSD=CiAI=9#2b`fNjY zFMhO7`UU`KoBii>AQ>0@rr7ws{jS!Baxeb&dyBjL)L-O0DhI>a$LiNct|yU6JAvpxA*L4iE! zlh*w_xSiqlvWqvs*ev_PE+36C57QQ;T(Q+x-?3zywMZul%Ihn(IbuUzX)bpmGfX@F z^VFLU`>ahJ;&__CCr`t76rZp*NonP)ogPxB6U_SVmVF=@L41S3X62=gzApJPuHy%d)z3v03A#Afz4eXm8#0V7?s+R6l(kZ(0*zB)@VGear@~(F#}`{;ZvMCyfu02J0k|+n*Pc z5UDW0)Uz)(T87AL2Sf4OlEAf%NJd7RiEhX1ZRB?@K-?0ADZRK(|4&me4JW7z9%_@aN-;{5tx5MQAJhyJD%;o%*;i1XGn&1w7}Gx_1`bOD#(D0=waJ;8H#E zYYjem@=pGSAU~BO@)(+D`E-({B!ks%UVAjewxqz9^#p^+mA@)$dUPIeA&EpvOdf4* z<%gn?zGYX-&jqdTJCj2Mb79HU^MCgAIX$d7c8JtaAYSvwK2py1O&SnX%Dsmb{Q45- z1Cy)?VI|iy1u%`(o7VV7vHP~B9gxmzh!3z=-H{MZ1 zkk1cN%F09p7F$S)&VqfK2WSCwL3zU}sbnE^=cSkzL-;mgaGxz0BG~eu&i;RqK2s}s0K6($bppv91_dUkvO|qssxcz!D%1N@~V~_Brusx(T|kAM9hu97Q_b*X&bQRR`K64wzgWXo9S5C-?wZfgo0T zNBSudQox~~<`XX?rph}Np{6rfm)8T6%hVjTwR>!r3udThvp!UQP`8ABF&A7XaqAR8 z?d)HSMXv`Awt%Z=M*o8s^HOVtU3=81JA7q>(L!K->fiMM-@_tq6RJ$8;?V5#G(3vw z1>+nJUczi-P}=pect$Hh>xuhPxy%AqFhf{zQ&_$PxM1^7*mSvFcSUoxsY=ec%DV3m zpuOqO4Epkz%%Blrvgf*Kn9yUWiTZk?r7Z~rWAe{8S59V&UpT!&f{qAmPz7p6loZ<@B8*)7?BPh?75 zGTZz_utd9l_bI>L-d?Gt4+ne?P4ez3_P z&QFOf=rc)zy_&9TY1)H|WYBlv8D7s*x)>(Mb~hi~EUZvl?BaK$8fgmg!81%&qaTW& z?lMePp+7|H3(rvux6DRyBn__XP?z$Uk#&LpbT#_Y%&t{7BSK*KZMn<@0j2RRl+M^N zKygXKHl@6aA3FkAb(j=HTy#SG3eAh8fGJ!=>;ok&xZ$L2Pz|34ee)$Y;WGch4}ed! z?6^M4j6?VJC08(+9a3%ljN-R-T5xWii3lH8v1|83{Kv^!9&M$Wm#abd^gO}gT+u?< zNAo->bq1p_Sx)o(<>ncTWq!eWR=Gus$SIu3RSM#5WwGE>DdgKMm`iwxXa`G380J-_ zZ~0UI8`Pw|Ck;p8l3QI_GB_|t4|6uu7wPfW6#+9Fc|Q9qr^oZgASLDVg?nbY@~ zr(ZynMmey9MUEn81gy4C7$KNc?iQ+N+3;GN>7occd3*6}`zA7ip(w^IFpBBGrJZSPi!bb`t5N(sn!6_)|LJV?}v6 zELVZ?iM#mO8X+sCI^ijuS0E>s+}&#8| zUuy+J(OE~z^){0|=gQJkvyJ5EAaKH;e(TFU)xTA#NzJmSx|neV?`RAODMw6nU?p?9 zka?O9QMzalye|qaN=LvB^$Cf~=|g@WmeSEO_`XS^7FUQ~Lo><^px7Y#qtQ%z?vN<{ zI=eKhqUD36DCPaoM;y=m#g3#Tq@(dS$Haw>Kh_^rr)B4-XXH`1j*Z%HQ9}LF-w2jw876dz8a5K+SDtzT%cv<2=k#ciKh zu*?N~zS&cNm$G%mS<&81{t$eanG6$7bp&-ki!_Zt)vKsXDUBNpMY&(kYp8Rz zL^N|IVOmfCqM;Qf?fRGe71*)$rQc-!`3%fv=BMd4J4|%^Cyu$Bk=bB1BdZLeuFar{ zhH0J)6l~$Oqn^geqKz^B+KF<<#|XR@oA@ZYoPt`n1{@v06|2RU^$Z4vbCdy9=Dn- zB3V8ZxE8TRn99D;06A54EdjFE(zq~{)3$vG>FBH@2~=^j!l5}l0#%)fM_Bhh;W<;{elVEF-^&`4%AOp6+FJ2z*a8^{zXwe>iTMHJ`D?83u~QqQ)h{tf1&XM zQbFR{Tf;9xzgdbG7;OL=Q>DkzN^?4}@!^tjG^nU{MvoIj4xr(s%F`qK?js*oosa_v z>)No03~}T5!i0dxfJnYv>ihtM3e!I&I;I zshR7l*USC^WrsoAdHp}|mv%aQe$Q^cfWmK>?8QaUU+83C()Z?0Y&Xa3_7BDo^`Kz$ zD;u)Y*JRZf89Ubd>-g&*;*`tWMY|tX6uMra4xa?O=Wan;-!vzkN#fmtWPT#kC5g0z8auVj-^ll~)JZj+n0x_>u|j%8|% z(qVpuS2|;jssxfxw=)C<8p$zsyFn)cY(%TRQazr4Lj%*H8=H&=MhKhVyOQlzZeKFb z*Ov7nO996$%crWI$EVQW1hdEcTT37186-mVy6)p{ZO{Jb{q;g+=I@roi&;Hq;{-C_ zL2lQr`c~qftkbw9#!Z9KPrX!i+aF35jodPFm8SI6RcWZqcuacZA#OnGmRBQ6J(wib z!&z;TZxvN{w@(*dnvInB`I>aCmCr_8Pb~J!n*WAcMrps2x@Ukv`7us@?H`D6g}Nc) zR0mgr_V~vCRZausuc3!__VuFE&r?UECW!+~I}F>eOpA@u0hXKpbfd`Nm6~M!` z-e}9Pa!sdy{B(BYX!>N{(6$iLf_ZLrFlIXnU06VGyC<@QJZyXxBsdJG6SbO~HR@&l z>Ro#pX`(qEBmCw8tZcSRgI}_#Pkw?9cgyzg{={#UkT9PschWMN{4lp&byZc4R$3|z zLc}wN1CAJ%mT|*ap^0U{SWgy;Oa0JOGH_gUIEB~nyl7sx7?iXKc(PIxNxwWeWbg~Q z3O6mh1@#E#n>i16scyfjV7hJ3T4nuSZeuTHW`5^j{8Qcd;!ysB!4z0>yZ=QstXpjt zhZ2Lv`7`MREoG$GnX*{OG1A-$=Y1X!x+KtCrHyOf=fQ>dNrK=2_Y?neIAjo3`#h!B zd)S-&>E6^?M6ig)q+DA1y_R0aeaj>%MO_j&@n1$T^The?>wqbFdYG(ase9|zd+Q*) zKe~6ndW1yk;XltE>@hX9^u#r{%L-82Kx63{vgElgGT6oEzMajgcJ(*1AjJ?b}fG(dL^qxNh(&Lr@FKcd? zk_{3#oXAE$x+b2G_9LVGY(~_-cX(8@GAzsYrK`dAHdp7Q?|BtZk|Bd0#&Oebe;vy&no;^8`r9k*P zbvTsB_P-12l(_sEHZevWnGCd_$I!pJ7lA{CUB~>5IyKQ7QGYZ9o8yNH;-nNS2dFbo3QQE-8JP7|X#CX0bI?rFjZndY+nCxG~#a(0PzM8r0yt z$q8v^s1p|hX+C$WZG)wxgNBdOI1W^vi(~PAdnPAU;^}=3!RQ03!;Fd=>h(}LtXp}= zv*YTBI=f5b5CsEJJW*w4#Z&BV0@2CAZawnyfq~&psdl@HTNR}w9Ln_D5aQ<#m!a|c zY){MMwm;>#cX|2l#9txxyq~2Uie@>8m|F7^#<3syt1^e?u9?dp@X7f1I}xz|e<#BH zI}uQ69@HRLZ5TOKtWv=+bWQgONue_siao||33S2m()v;+pMlO)gt z%VYf;7*rGenSysyw;O3Nd0^ni=uix;;&nW{r`aGg=MHbV(KX^=0Ts>17nGG1XmOa=k2jbIr+g{J{}?ZJ+lXYVS}A1_-B5Fp@~ ma#lNg5e|tzCd9=&4IdaJCVE+EIA^!nhEsVAR literal 0 HcmV?d00001 diff --git a/images/ASCII table.png b/images/ASCII table.png new file mode 100644 index 0000000000000000000000000000000000000000..ea3edf8b53743ee40113b3d7ebd7320a084caed7 GIT binary patch literal 14740 zcmb`t2Uru^qPGtgP()Bd73p0Bq)TX01?fe45$V!<4Jb$nQbj;IhF(MO5S8A0hlEb( zolpY&;oRuwB$&N@A7tKVHYI+_IEVlEA_$i@Jw4xs6%B>nNw|f`vuU^6L+~ z!y(TMvyt3YM#ojd!NS$U#MvCn(Zt%`mDAqbm6nf_o0H${r4Ht2gl@}AOK5r;ZO?hV z08C8d>?xA|RQ_Q&%kcz~ZCgSzHHsHj^VFV9x-j%h{Rf>vdRkgqbFzo@A78M|S5;|2 zi|wjjkB%1{SIeLqpFjdA6=Ik!@DYkcspeEj?=6|JE;Q%ABW?vya%%5j_L|!^ml)&?H^UM=Z;Yb`H_Z2^o;t;&5feRs+PZw z2w4QSq+xLd?q~dC!>=mK6Nx}?T}F1?4o=o5Pu>8;%|nEuGP+3v1@ZrM-l0RFN8H&c zH}%D*NIBv*(3{yS{Xx#`lI>gMgqH~A_dt}tF!sjm_4chim+KlpeSynML+A%u&7@l- z>!r7*vq!6_+5=U%t66jnZ~R?#!M?-X8?qQ2Zu^ zANOja*$VPqqked*6694lzetVy)iz<9vm>GsRIp;r!6(ma%<)P5pIP(>p(WO<_omFQ9()vTUVR%ShwkO^V!Qc z$U9`0#3!SwXaA{p#^URJKr@!n-z1&-z*CL3X)u<^;7&?LEq>T0zKK18OVQP=rylcwfl68U+Uq|ipuM4KJq`uUen%P|3&V4PNZoTPG5_3179s&H zLw14`4oY&qC8mo3O}@RPLccCN#qSr^GXUpv6VA7y61TG@T;f}=92?R)9Q+LCOIUP= z`Rg`ql1p9zk0&yjKa{Ra6{nY97TteP@6}2Z(4l+JC`|Z%Ztu&0>#an%(L=+Kn;u@~ zWxUgtgwvh38x%@Jtmg04Rn-iv*{7K^UbfUDjfXjhgodmgc28wO`N`_I_i<0prf)YA zycGHBnmn1@SXc+XZbs<1u+5rs^oQ_>Drr4{$g}`*(EP7QMxJV7~lUPCSqS>|mO*4SS zZjG*(hYw@Aa-X!7i~gttp9e;br+#v;;`5kv-}-<&i^6WL$Vv<{@b0&HPF6N(Au&0H zqo~rWDb#WVeT1R*PbbV}bIj^Z~pVGEo zSTLcYIc@1fgJ)%Ggwc-GF16qJ-7u}Sx-ix(qn$3gTpa8ULoUG+`7L8wiJjuT~>M><49Q%kA%S?_|$Y z&xU>g!qijOm$oNtCrLdP37}^d@irdD4jeb#c0j4et1NTN;!kviepJ+E`x8-ZD4KBg zIec%8OYnaJUAX(G(2sp~+`V9!qs?t+E)DsjoQ1qPKkn_3(+NF&A}im>AiLzkm|+gp zdF*IT9BSni6`IhgzqsvF^txP;O3HL-mXD;Lc<9h{ELuy^kz=@^!DiUq5DH!YSt8RG zmtXyv5)$skhHBLTH5cwwmTsbj)BDC#$UQ$qrE@nGgVTZgT>d<|=eV>|BA?RuU?MUj zIlFb7t$L9@9#3E?S2O7nQ2@~b#ZhP1pfqkj68h&$;_5C=$`O0eCerY4l+8;uVcn*7 zq4%vCNJKlN{bid!MQ!gKJ3u`4aKdrVTyyMLoBLX%Uv~&5y-F*;p}MABP|@GbGQ+WgDZyJ?}}rx1a7fEwIf2oG-r728*$r7XR!KW?}RFOk`LRg>Q7t z0rzCm1j<_FG?d`!pXG`@E?PQ~k?JYq7ZBze)6$-Z$LX6srGhd~=<-mrCh;!W@3Hfw z7}X19F1RAO!^FCbCb{WWP7u|f>Q#=wtqqLRM20#Y?&FWE_xaLMeMvQ6?^UGV>4rSb z2E)f0oD^_L=0eNVoggriB?*Goy{5gxQ?&ZE&F4*>u9y##VqJOIvR!evwP9CPhdzpY#U5l(FwRpXhKfF*4njoI2OYm9rH@be) zn4n1~TX?9I6mBEv9xCwjYn-Eg_;~tJx^2b}zWa4gzii)S_Ui*fUgJ`Qt|`~Rwc+me zOu6aR-6u#HUU138glkvJK=DrQK*Ffv0X>dhkNZ%T(i|wxrzv9|#UisQNDcB{|MYog z_Hd?M-hL!}<_IKp37d%W_L|N}etE_AvzEmdIJXx+0W+g3ae-*CJXlLc?_LHkU0O}k z)N=X7Agk(bG7llL_GxkF%tmVX^N>Fhnl*eJZJO_o)_J&%m(G4MM3dMAx-y&h$~Q8! zKRQTwlEVG1zo~$Cj``$Tx}4FL#V^`E7b#7$G25`OSTp6au68+BgmMdgsrN}IO7&;~ z+b3w^X4odW-X{QJ(u5NCt*qwz(c@RWeNda8js|@?j`|TA43Z@Y<2MXFG+1mxN$V;B zo-~qfK6{n$ZuzQ>m$>-S3lS!>v%o^*Sf&LRgyWpj&A5q!s#sXP?-6Lp8C~y{dgxGt zNYewe$q;%yV$ikf%2B_CtMNCx&})0^1uaY9V#7Udo!Iq`uO@bOXD76eWPIe|yu?d!WH=W)y}~{y ziZtZ)!RS_lbZ%s+lN)MJhgwsetvxLrY_z^`6_rSJ?c=BYMx>L1&{_3miRivy@LdNG z1%SR{WB@}xCD0AqEtf_D8OokW=8xO*=nYwhV1D0C;YS;@ISw1)kG zkfsxbk8TI#bO`!AueA=QQ@ari*6xpc$q^90fgrfh5t9C*H8uf%sezb_w`={OopYyyWMxTb%liO) zLyvNbrE8=((YI$g{@y_sNS7K;xKBIz_T#g$-PaM4bTudaL1-%XmaMVOa{uW{75@Yf zOi_3};%PA0W2Y+D!056M>H$0hb+v`M^foKFb_sKtQGWSZ%d~UprxeJg-m_0j2$Dq? zE0ggr3WHtF=MD7nHfC`sL_F9p(Ec`c^bess{cQoM?&X5q9``n8XMnK5D37^s{ijv% zFR$4U2;X*+14?QGVbV?e;kk>WY1R@K71S+H-tT|GI((lSjri?>|KvOj1FITXP6Fo5 z|1)AD@0;z-R>66F4!}}-%p4s$b3#xW#Ymy608=leP_wQjLSjr#$QR$z3aOJY)ZS$*PurWa_^z-z2pA z?BU$FrjxWqSEm*s4rH)ep+fOQ^XJ{L+t{)Bsdab3fldQQcE#KFMFcJumS-SqTKa_z zPHrSZ>xmUf$_!6%m^gXG%HyjH*O^lSg#U<5mYi$Ys-p(`rqGYvy07YhRG_Qh-de)W zxRcD!)!Y?Cu2-^kPyA6fbrf!WkiW9Lypx)m3H)2@GjTFrsWw<3vY#;0nex~>@V%rt zk|5P;iKtY3_b~PFJQF7iQV-jYHMg6kAfRaX7}Z1CAh*y+!odnnxdt%PnEdM3-!SF2D57<%k~3nRT6`BWq- zA-oiYST%(tJMog22Z3@0!G6zOnkcBgZQ=|1_}k#IbXgX}+a`)svWexFLA}g|`zDwe z+dtarH+bti|45EOKFQ}Do8*5YJnT{~77<{DpA3lZC#ce1^N-Ij0FJbCA<`-8%>t;4^)=6bop*=%t{!K)TXx&Ca(f3=8>DAH+BZMvwH}5`Sy`NOU zcoH&mEaG>#bi+fmi%7_dfozMj?jYj>*YY@AEWN=iKE}0WI;Zfn^5t=!Jgu#l`)01K z_+|nuKi35^0*CK^dSJupY`RF82e`pCKX4d|8*2~niS^(Y+()1&Z8(E`idMb|@`;Po zS@T2ypUf9w6|NQOKJadAjPEJt5I%^hgT%}Q1G$lqj5z;yh6uuLBbNH3nBaUBJ)_X3 zEJ=J*eMIPTATBQtVfIVAa!L--?H5ODb^~T)@x)HfI<-aQ1K{!q*QRFr(FFz5=MJh6 z1sXP3zdC;5`xMPxd61Y=G_Kc1O0xyeXr2E?xK-krG^o6@mHW$0FkE3+noK+GRb+T* zsG`_wws1*!A85Ol$yRWkXui6!MTwKFjr z-x>zlv^IWLJr6OzxQey3Si-ZfPls0i9<%wfRSMWE*(Au4RCj1}X*etOA9+>=OgN(k z--7UD2KK)jKGbs&@UF{j@;O~+Vbx1rJ71*F&IQ|37&0#+dQdab+H8xj{j26UR?A;F z(mCF+`?_l_#_Wei&D4IW?fn=Ow$jcIRL~udJXDBRpWE9Knjr&>JaxzCNY^Y=E zQ|NN$prRD?PLQ@oqWfesW30ZHamnb9*b$)`Qo<3%mv2G8#&Go3ke*#!ZatsRh_JgQ zGJ41JNeKd=0XMpF=h=o4Dj6j*caA3|idAtbXWXmVvjEfMvyyGmljlR3-O?N{wUHDT z*PUc3`!xA=&vRu@Cyeg358g-Y>&vW^3AEx=&V{9!Lc|#mc9clxb;TJ~-{cT*L8Jp; z9C{tJ^%{_BQO_CJqtR`UD&DZv>ILy#43?(V60D$E4gdk`Nf4 z7c`R>u2AqGbIglfslAF)SenwL_f;*2?54`OiooETq+kQmZlYAM@d(6fOahnQX?^^n zd!}S)(z)cl+tHO5Z!6=sA#A## zn<>cAyRD$xS17-heLuc!!dWty+|l%Gvz%*vSB`^?>QEpTDEGuPyy-23Hy1k4c|WP} z6K!y0!*jMx#8B)Pjm@Sv%BYtXHJJPDQ*_N9PZS#W(zejc7(rguQb-FFP!Fhwrh%;d z!Z$-B7qXQ#H7$cz+QV%ZgFL~FKRnw}@rpwIy-3dU5WqxND6YjxOn zDIIS5a(T=VmO*`Dk;Lbf(LEgG(5D?9L+G}vlmk+GxBUW>J2DPGe&BU&BB@UZdNKzV zb@gHvvO;o??`W{w*sSMHNDC5p_Lf#x`%=OJhKxR=@Y_6Bf_^j$ANIpR!7S%65&ny( zL-`C7X{VGeA8VS!@5W56uMO_Q7EnQO7T{05q~%JX#MIJvL{1@Qlb`bfJO`Zc(X@}u z%0w7Nx%wI|Bg9&p+Iq1l4bdt&+{dnot?&)|%bi9iaLF?MZEgA}rr>%WeyUGD zbz;`)L9{l1v)>&&|=pHKQgOWZI)7J$E^U!XGwyqmW5^hRzqR_YzUCS z+np|G_`JGn8mOHc5;BUFRj{x4?NMTb10o?N)>!p>mwXhSW12K$!nC?>s_}biTn7Sj zLM*Ho%F)OSk2fM1W)qTt1j0Y;W0sb09rFGO;s&+nON237G6;xSfIOZ%db^3kD$X~t zmaws~I^~@p8ZYbGq&cZ@c%MhV|NR7D0&m>*n^;)Uv1rUl$cS|6#5_snw(Vl>*0VKg z5SUt3>KQc_*85qb?MJD=c2obMhhRu8p%Gf}!EX$D!ypq=S*U5l(Bsy(Va7bU5T@Tm zaWoQh$y#9mD(>=q*P3VVDIUvx_rzS7vw8|<4;B`!xST7dctQ07f~k+Sfki}xDO7QP z)%$(={(?KBWHG;;CiP+EL8K2w=OfKOy4`o~*Ee@IFoz1U{kIINGX8H2N;On78SS-t zomO?{Oew0nS;5$*WQH*P(eA!yhW_c=moLO*BqXa;uka6DxOp|v!l66pdDa>=sNfy) z@#MqiXg`(WR&0dFdb!MooViN3BbJ8qm6-5ZL6#_61tUANpN z)FNR(LaVU|%MIF3B*Kg8>aiNb>Td%@`XY=_r>eK*j;?;XvcJ=M2iX)}(*zH}{I7j? z`v;dDcK5lR%{vfe{NuQa}E==X!)+Tl0bhWTh zLn{31?sqla)Q5)b*GG)7L@5elY0HDKCTsoGJeQ%@T5Ad1EX9!#sI*~J2)|ceL4RlT z?ex`lD9_N(j%N^?YECx6Q9rD!5i51(`gWa!z0bzGV=iY(V-rz+8_x~ub03H*z*^RJ zNB5Mm@qh2(0X$NuA&d=Sr4fTJ-$Wq1*cD!=%QuYn;LfJ z^r0cm4E(q<=AL_kf!E-7GG`ly^np2%9=UoGyOG!OxmVt!j1Q_s8jdxp(~o-qdTY|T zO-)N=bmIog?X5JbEVqolr>{LEWX9ME=G}Mpi?Ch6aRWS*P7j-dm7k~ch}k1I&F{L{ zS_8Tjv`3y^90~gR?#m2^_Ob#zp6vxufz|bjjMX9GN7pe?`!GZCtbq_SD8TSsu4R;k zgR9j@oi4bn*g^W>M<7LF$Z)2>RD^}x_+KDYr7JyP(;MU!EwLN2cDs+c8!fAJsnCEQ1jm#s&^SGiC-m{i4=Vxdd>ZYKCO+fB3fa<>;4)&>Gab( z!ZYu|-6-9qm6zcnpKMescYM)LEC)ncXb!k_Aw8S8h=Y@RH!91@7xzaB+q%?zOqT>F zU0sG1l8Icu-CengIbM)#$o}w>-IK$EkYhYo_2@C-EXg;1%ghAf>4uPWzW~UXR|%K$ zhIbM&e#o5us>v62-z$#Z=vaGZ?k(rNTVyv_27}Mi+MyLR*Ql4u$oBVNhJnO3=xLj1 zNMNEE+^;X#&WUAbFUi58?xbY`3VRFDAlJec(rv{KB%j1F?|=&YP>8fjE>`Hj7e@`f z6*2W8;lrA7OlNP9_{yKGi1jH+Ts9z0aq!Z;$ zcB37h7}t@imgC4T=-=M^)H#>gUl+Hv*NGwdRcLh2BGKEN1_u!Iz3Li${ug{3@5AdYI(-AoL4)(COE5vkF7OS zqb8T6qn-e&9vgnM3^#s#um3b^)F4HJ0c``lZHf%uJuQYD=up1BIc+a9z&(^6gJ=9= zME8sdT15g7yX5bgs24Z7<2@#wn^@BG#vvZf&1KR%*{y8A-CSH#64^@t#I#cqSo@vH zxmL)K-kqP11zb#tSo)iGL%4qZD~IdO+zaCgB#j)(QGYPk#cn!zA)3(-GF}tFAF0Y; zr%B2`)&)qoVeqZD>11WOg1~}$b-A^q?AcbxdIcgMICMK(Sn=4+?O4e}j(Q$kvTigS z&_!>A<6|`6-KwItEg9zDbWs$;{s7GFO9C$&t0xX?o|tIVS~xDXZsnB@y{C`i{q2wd z^7EAW8a%Gul+jr6S1s#Roc)5$&eWgz!9C;O9H1kzRyn{^LK zT}(~@61rcq`G#h^M;*I;KZe=2>ae|X#gn=y{*l=yI$Tnf5n(A7Kl=r#0Zl?a640Nd z*vwgkb&zwt8y=)|O{6>lRuZ*1v3V2&KOx>%~>ueiB zKP>H_<<^@0<3ji}MbfHl1uXr?lVikHG0)f0-L(D0hLjGgMJaNVNI!8tUbqWZy#5OK zO8kG#yd&{QQBX{xJ@r}cou#zBb=Mk&5hg;IEG%8j`14WtnKi1-iepAbqx`{y&`>@g z^aAg%niramd=#Ht{t5QhE;`NR*(xLaq3QiI1tt&H^I>*opv(Dr_-sa9{hhbS+E20N zS5)hpP`%yTF7@I(4Ti?tW}S ze0LGv;u|_$*S-yFH~qh>tEI-6C_oOx4fo=0u^41O{XAqKBW&c=JYWLKw0Q6OpIX^j z2P9nD&a60zi=SPPZqfukynhk?gxIG3!CGCb&n~z;iCNQ=W8CBm=UC_ECrehni^FD; zPqQs5V)Ji{8yy<&?={W3iMKZIC_yxkBa)moZyL)VBV-QAE?m0xYscCO_iV(PZsW2u zLNk3Pg`Y-==?8{A;Ym5#tE4u0XKu%Fd6a}~$Bv>HACGq+gs4>}EQ?BU8+n%;DaMn?F{ZU}@7wf4Q~ zd*~wms&B4BF7-OKA#5Z3x;^@KgKoNADaFqhR>7-c7cTUMvPWl*41{rGi7%3CfkGae z;bP+AEOeNcg%C)pePOOY6KtGgMGk|pvw-F_(KWc_M9e^={=Z=J2!2iUWWOabUI93H5`% zBgU(%^59(FEu~~G4vtLp*jPWv<&ZQvjHN_mdnT^WM^sv;UvXaeCAy;lVy8J2%<#I2 zG-t14K^S~}8O21#u)}nu3t94?n6J~HTD#WoApv{3d2o_$RmL{e!BqZ@pr?A&L%*#g zH6;oag?~9!(b5Y~Tu<+R1%JoYbAuz+oGyPWAfRz}tI|=hOJAwM5XP?A;xSv(L2c&p z+?KS=q@w!J{y3`~sPJT)BIRqJMMXud$K{BHT)GO88RRE$Nh7+C)V-S$Gcc(KGE4(V zPh}WsdgW9GI^_ru$meONv@!opT0>Uxcl9olzbx`;>tWBXElGyznOaspT96vy^ zJ5K!0q!^0D2xi1t!20c{hJ!Y|IiC)|(7+Rqg#h z#wH40B-dXgmA;ld)$b(cZ@9+xaKmtZ3h}_eC4ZnshXXrFC0@TBg;X0&_>?n&ziPdm zZ^$moCcio(P{yS;KkhhXe#AhL1anQCKv(ULRR=1kM;-ohoBt7_Sv&Pd=58$Ux=e1R z9LX8as68roKhCNLYEaZmu}s(A+8VgWgr+zt7WBSUUF0>*nFY*9dcLi-Tun$ z<-&@_lMfNTZWfVc`Y@KDxQ>O=3L-IGbAFwDfI8JbaasbxfTK)N6GR_F&LHvM(X$P8 zV&|I^6*s8 zM48bOM?5^NG0$@Fe5p}wMa!U{x-#zn9#iDEm#9s}q{SXv6HA*;ro4A`&l3e-C-SiY z3{8s^JiDN%jXHGB#^y_Lx5u1w8lh>~h=oIs4NrO#)3K_>?^EUV!{G^A;u=HWZA#9W z*q>qV=5kV{6*gp-O*2* zJ7=32IA3v4$2gSA8V@vmYtpCLuctRRK7PM9)OCVViQmc+BnMio)WAuy#4yxQjTIiix zW_u?eo$WCZz8bldgqw@(bmnL0Sd~Xw@JY__q`{4P9Ur7lXfcVvJRLWokHe0qE>-cHaM8?Tg14K}Ko%vd=tNU(R8wVri z%i6c-72#B634GhY@+Ix$d8U_@edA1PL9e2;1KPJT7`?> ztA*A#IuBuDN_aoYD{oSSrA|&Wtj1v(JTtmD7NL2cYEl;ZoS+ z)1vEg{FeO*nl-FkUL=<_c zz{l&W5B)>4z??9eR;z7!KX&F?QtNDF64}e-=C%3ONKcF0RXZMZ-UxoYD*kyP~pqd8k_X?W#9!EZ#Q>Zmla7|jT z$3L;?qB$gL4=>&#BXc#RPNZ_xgRyr;2bpY*D)HhBvGHwlN9q$2lkT{04V8&J!w{Yw zu+b$-Hw%M#6M~L9tR#6b*F2C!9nAlB%!V3&3L<$ z?+o!|5S#x9Pb^Zc1zEM6J zUNB3${j}X>W>=1ZAX%$k>i1FPf!u zt#o!T32BNsl=jNg?HWXO)>!-zZ!b-sK}^!sg5D~TEs7*~?ux2ujeNv|wgJP3vme#@ z@8iqZ_`_@7#`v6e;Tjahp(1Lqn-dy#LMA7g_egS zOZ;38*TZPt<0%XukE$&iGN@YmK8k;`V3?N&w;Z*OwbJ zX3$?9(V;k|TiBSOr*sX&d^%G-A-BrrLP%ix(}qjQPKyN8vU*Y1-Y-E@%3g60#guvnZR z;PC%I8n119^~z1-^q;0D77(x7Hw;TiB!J5$pRDhe?|{E0p>z<1qgSgVvqvuXpPi?!+-m$N-;yaA$L~3z5d)c{xTAhsH$YHUwe! z&cC?vyPRJ9wFe99OyX~J@p~Y~lKYze0v*#Cgp2yco~GtIThJ-qmON z2n$kFtGJ+X)W#g#DZh`NHRgTphOSnZD4d^-=hj63_{y=ihnqdq?s4i@Zp0u1(fC9B zHxcvs=>ysAVZdFsA3@*mLbdx#jyy#MInXYzUWI)M!#gBk3O=j*O7Y~1O4`HE@ykr! zgzva!@XjDufD`-TPz)iYqCXz$QSy&mLLUZNW8J+59w{eqPz=gxuetZuXt$D)2E)YV zIGP*ZySiEEIP_mgo`ZUcaD5T4L$H;8?uT1N7|+vy-pBRy%SY*md)!Lw!3V>QzuL?6 zy;5@h_xSF)ssqub3sx=x+RW@MZ@H^C?0VB1{+)7; zu0>`kx<-_7E-=C1g=+`N1yGvHQKwp06*}*DzmNe${u20O#OsN$o0dIS@`8PyU01v$ z_ZwFWjLUBT_WUrRKV|V=nIe|F3_h#=&yzIv6NjgLQTJw#85Nc@A`D6!mb(LSnxpl7 zE_`=Zb!CU||9hI)7(SE=NIf};H2$dL5<>~_e{ZZ}{J#>(JF)_%e$$|``L~0u6OShF zj)6njQGAM^;RDGnCX%=0Gv~65G$LPPyjVrw#m-p;o86c8ho30Ao5(+82?^>6+fQMg zk(=0Lm!xXu3m%afmg6qE;XFK{xN~Sy?3-1@3o%~>9Cy(JI#eU;nK0pqjm>a;Z*dVW zD*^7*Jd)wDGma2dtv<+*@4;uN~xSKGSUtV#v`)RZZnX z>wRU46{G&Q_PBwH``~Gb#8Ca=eqo9zD#f?6!wk#`rSa{V;kq-}-W}GV0wra6xg8OK zc$3KnQaAkeKY?BCDS4cdzfUy0uQgVtT=hwc0{=xH7bbVb)bYWv0oq1a`HjIWRz>H< zj`}lfD(T*B(h1U5|3}FN%$LP)>-hc?yy!Qxc!2x5BQIos0vUk2MNx1Q@sBw+xh3F| zbKtL!UuBXL-n+`?D^5D{->xeurcY*Z_{zr;#pVPLd12;-QbfbN6}q_eAiIbz5xc+2 zW1+LG#9*U`c+ef5?NX3DbIn1sL4F`^qKiETbxvYr>$&S;sJQg7bOM49lhJ2{kpK)n zRjRuR;{HG9;H}j-9uRb?QLAXZy{uK#XSlg=-UOM6_CEsUz}`Vd6er9}1r@HoCOosS zHD@UyM~v%hzqG(j9p6=+07t4ksB2?lI?Mm?sl(>j%SrQtE9MpQR6y1tIb`iQq#ayx z031%t*K=J>kk_{ln}bSD+}Dqq%xC-M>>YeP{D(6&^H1i6MLFHXe`s39PPIEse-MYjhZIY%}Yr~o64Z6Du@cX${p~rV*XsAnfUF|Q%^$V|nWU5kUG95ZAZU#-@7E&KRY=r$JhSK2K(!$? z>M$1OP(l8&V-{c(c zzG$DpLi8A-q_)1m8G%7!9Lvu4+Sz;d4f*`b#B&>i^bH&F#L33>9ZMw-fb}6wEeFU7 z{=7W;7I{LI&Hq7AxB|oWeM+a|bnVdRi4W@8&opln0^qO8<6O|N;QuO3ahi`~8r^mf zebmUedm@63Sq#6T`Sn8W-AnU{oh% z&Y`Tu1<Mr`M|< z0G-w~m#II}v%4mP3u^m<$NAtM-gBXKHSGRav$eUKl6^>9>9_P@H@3(%7Q`{w@IwJV1Pk!Tv z^E-$BaqfNd-~6$sUrwa+C$K>QfwAnZ^BcdPrtOfocm7vo`4?g@4-EV_U_E+xR#(`Y z8@WGe>?#dm-MP7Rf(ZD9&@A6Q-@EJbR`$GTAjUZ5g4B#t>UR@1w12|vecIdG>VurW z&9Vzl(inkn&6d{fO$PfO%`4sb{q9yR|9K1V8(F_x{+mTmRZBFQY77BKaoZ F{{ss*VYdJP literal 0 HcmV?d00001 diff --git a/images/array to plot.png b/images/array to plot.png new file mode 100644 index 0000000000000000000000000000000000000000..137866ae7c106a03f0bd78bc978cc6a6d3a7afa3 GIT binary patch literal 9011 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 HKcD^|yTnA( literal 0 HcmV?d00001 diff --git a/images/array to table.png b/images/array to table.png new file mode 100644 index 0000000000000000000000000000000000000000..678d81ad57a9b0a813ad4881687365474f5fef1c GIT binary patch literal 5706 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 YKwq+cs=_hCtND`#M@^1o9kLJof0xC=CjbBd literal 0 HcmV?d00001 diff --git a/images/basic table.png b/images/basic table.png new file mode 100644 index 0000000000000000000000000000000000000000..b360586f5c0d5ed71da6abae722fcf8c6bd2e28b GIT binary patch literal 14704 zcmb`N1y~eo!@p5fq(P977AYy|25FE6>F!*RT$YrO4gn>1iKSb*L8NODkWQ&3q&xS& z`kwQh_nf!B_q+aF7d!LJGx0og%`NjZa`BPOO!XJwvKLWj+SoJ+-w|dJQlJ#$iwh|mzNTM?P;_#4|+*py@0l_ zi1Q_S$=6s~y86RFWRZcy{VrdDW+JKLFhUhPOubd2I2X)^_!60f8#8*$_V)UK$2B!} z^R;2yMPV2bE`$Ou!~4oOjOr3$5}ZqWN5ovD>GFO@gGZ2*X9SOsE&98^OI*$`cG;6Y zzEXnd3va$seL&qRAy>6tdn?Es3KmRYsPC34A;(U;6DIDjic?VK@)Gj#=Nc|sSZR0M z?%#+DWWxIIxNH5a>Mh^`Ef+nM!HLmTef|0~;mt>iE$&1XUy^3iOfg2ZZ@Ry&8zVY# zky|b6R#KavgD{kFR8w;daf4zevvW+r^Yb0*M&sP>Y~Z5uQ*E(ud_6*Igl*c!#o3OE zHEor{#dOvs{S!$xE-JUKfi9E}oJclse?LC5X_Cqid{hNoJ`Is6te04qLBBWmSBFsl zuG@c|rRMI(D$n7M?IYaGaf$2ke-kqa6Id%`fQY{i3s5j}pB*sf6Wc3yDEW2n9kE!%CZ_JR1wdQ0}Zzh9O6;dZl5qrF-& z=L$K;)VY(R(1Zs9Zk&NZ14D~BJv9Fan6pkIMMFL7f;0|v-K)bL&X%Y8fW1{hZI}aOXybwKevok1yf zO-}5IgfisHl&e6=1BdzILYy{jR^9ceQ`W=$+3bT6jw2Dj10z(~&rW5nYUH0(XP6mR zw8;gur#o#+Z<&~>DV_4oxq59vcY6z@L6!lLTAhBty0{L2uijD~tzV8cXVN6MUXtf} zECZ{s-|Uf)n8lUe2F>e){Y6ieszmobL7uBYhGqmgcvcr5Fq?fQuvT#-7>d(hZ;AG* zOvG;aaQXzuzP_ttLJcw%sb)`SpAdmDIqlqp$JP)vj2@t0%k4Ze3LT!?d_6EV3*K%( zNBB({0O(VP~O6@AJ`?W#{I&(n1C(P_keV5tF2Px7C%=EymZE;@rD|^zIltlIkIPrekjJxFUy8Wo@xOn^m$xno z9vymF7j+pO$!iei!NFBA?|T@x)OB_X&6nfAX*~=abEBDSchTLrpjT9N?hTA^B1er~ z79<4JlhncbR!la{+34r7Dred!o8gae0cAx#mp{Cm)n8jU%n=PN#PnOTl$!&OMbqu! z+1j(y_3t31(j%$D#J+&Dc&lCDY`2Gpj!zDM58(NATMTC22VHOWx(OnX8xHvg-GC%L z)l(KS(q5R3k5fJ0;%{Ex zGR6P`$@7o@c0$?logU1@e|S!F$vvw^sPHU8t(Qj>ap{+xG($j~2RXXXW4+eoUz=EY z+*?h+$}U)dFUK47!vilUI(N<^3P}5*y%UL41Z`qb2_Z3)i9d3W6!>U zS$~D|$37>nhUjE-QHmj!AV*~Rt-|>+2-zGaz_&!F`klZC9fc7LZo^0;lfXsVg?1s2 zy$8H7YoCN?RFbR0wTr4IW`+fJc1RG@!@8nG51?v#$h$h! zeZuc-MIXGSBGOImR`=-ibLWM^!l2-`SNd|bIcuFVJ-Kl5r4k*QWX38&(l2-In{LI> zXXaV^oZ`|_`)Y0B0H+7;b@9B4jfOd&i0`wx38R+=Mf$fQnp1`d9&-5L!}?BUpxOs? z`4E3Dw-}q~u#FEIm82H6k`l))Dz38^+Gj)Wuby>z8Bmf|T-f`p*Wk&cWs&T(!JOdf zAphXR?R+Hw1E0=rle)2nhA~mS$u=Lj(SX6(n!0dU%qLPm#c^>hH7fO{BA-z&ZD-#_ zxZk18{OXtzJ|;~Sxe?~-hdL(jdpuEP0MjN58KJ1O2d$}D#q;mksJYRhJ)Vo;&~^s5 zncj#$kV4FViacK$J$Ho;SR6RAQGL@r5RClF9U7f%vz+dgjSUd3GxV7mXD+BRbDz-j zJjXrFzDAI}!{tIHhO5GpZ22w5mkJL@$1l_S3abLszB}!KzAh-05JGuC_SpGuslw_6 zS*&4g%u-|uH&$DPBhi87hq-A1F&O};jeAJxMz{tmj;0&AW}i)dc8RZ7wqglsr$bV zu&dwM7JR+G;hHh+TmN+N&Q^&IWPGsJlGwj}>M5y=ZRDd}^oqRek1nAK1yvI6d3xQq z+SJkQ%3ow{Ck|uOk$1Hd>!P)GW|b#<)-CyTsiSW!gvCdCWC5$`SiOZu+l~+7Q>9n^ z>ur2>oAZah&=un%bgtkO-C{D-cD$S8j1w-KpL#ILd&kz?Ss4*BB|G;3l>xK)!)n#H zJ(Bk1^Iu+3RaAJuw2i#ZZ)aSEZfZ#71P3^uckO}dXQ#?yL}PJ3$B#KiYi4j)&dzL! zxs&mJ*&Yy^otffE@i?!QI8NlEbn%O<+~74+h2Jv402fvTWL|@ z$+U632tWTCgl;@%*ZnE4+?QSgB6O?*!M_o}DI1N|Ybw7w=fqtxR+(M8j`94qiH#g~ zw~C{mA`t9UD_V)&p+8gvHTv2^-*?g-4x_DpyQtwqHTqo0Hp1Yf#dqY%s^a9EQ~^kD z-8dP;5^*gPv0bSdzjm3Mo#SmTX{@+au55WCiXupLkyVs3dwA|L(|wZ*hN%>s&MEr? z9z2pCm||XY=&IrsZL2w*;Ok58UPh(uA6zm%w~>r%qC_XHDXf0H;4O=N5gl zN-#+&>L8Q0L3q$rK0f3l+H|{+d)+dTO*g(>;oA?6_4~LWm6x!3`FQ9n^I10+Z~nn) z($x=NF>7;Z_P}kV>wzq54)cf4Q*@4~e!M|q+|RCpSiXUrfsGK@!#z3{ulejB%Bpaj z-iO78gOP}0Ys`D#5bq?+Q(XnI$~okSgu34jpcpxX3a&7CRZYL^m}c% z31i@G=5NIQlS40c;7OyDBNa30@wY(I25IRA($R1>lh#g?jEwZk`B$=|_cO(?mV64T zI$sWl3Myb7|7|u&6W*3^^un{_rkfmnjN!JBZ%#&jX zj~2cSa&7j2F{y}bVrga$ioOY2Wa~!Ic}^@97-V1<-6A)0!V_3IdWpUGukac15Fh^R zghOVXC^8UM$&uSF0QxqXsZuuQWP*8KI{ds<>4bCQgXn0+R|@-~w7YwrO67vji#fm>|E1aqRovGl&55R8xDJzRWb8u&#MBr9hg zbXAX9tnKBf65eqR2+^JL02PY*^3H>kzs{3Q?kPX_-7j`*SAjpPf;HqY_^+9f{iMMfMQMhfA7;A~o$Wwj*G z;v2NN^0PFvSzFU=@Aq0!);DALVoy;m=PFU@CMkKGFMeD$5xW9eUc4{S8M855P7zD5 z-aiKn?_Iy&u^%}x5}scHA5JV}oa@-fF;iqvBVR~@#fJZTfL?Xq##!AANCNF3S^2U} z_BlB`o{5Kc?_0A8ne#iFm8A1v21|<^Yf6R487mPrm%)GywuOW~78WM6wHI%6IVi_+ znKwZoP_MaG_oszS{v<`FHrOL>R|J@_ob*Oi5f9CI3tVeT{|#ia6=g%>E$h2sV?+EU zkY79a8SI^=b^OyW9klVV*XX&<%Kr?i#}26TNYIQy?Y510yCw}R$36t~1^gBPPOhDw zv+HrB$=JF}T@U$nE|VkWR}8d-&Qs3}ma~R5KdNLHvMWbKL`Bb<6|#ZUMY0Aln!g2B z`VV+5wtHEA4u7RQdt*M}F8_?8Df{fc&HTm2xCgJJskOaYHU02f`B*}0cZ055!`mzB zMWBMw$F~|sU6hl_#lj1@Z*4z}h*~!!?{6Ynt=~DEsIb|;tXO9kx%$?@Xl_UXJSVw& z^%ce7iDwr-ajc}SsB7UfDJOXok2x>N=GCyggS?z(ygt}-Xzh!)k0*B+o9foQkF2^I z4!2nXH}o#^sgCNt{@517l6YRuB{A~kC`MMN`#VpF-Kef)9L9E(O-qY_SNV`!L@iHe zgV{6Z+egmevBaF$=p*^lG0-VmwJ3?QgNw;CvX*K;XX-jvQRCuwJ$V|ABI!9P9?-Qy z`tNP%&z#wsC^}8dnd&H3=EGj>bxgBa?zX4-l9v+aQw`A^ma+^@x+D%ob&`g8z@Uw7(7Xk~8d9p5FmraVxVWlxf~ zhb1mIkt?eD+7-v0=blw*N4rLh{vp?SL@(iOzj>UK*2ll_C zSYfa8xx8+wH~ekrl5Bb?3e`Kf|Pbf?Q*|vCGT_pCmjio#v@v z?#IrCK@YjG)-zj2A;eazsNs{>Rbr=v()LvpMxsw;WE^gvIIZf1t-cI0t40X6LA=** z@F@&4&-gPa-&~aQ!}(r7zR5a?46OOon3BxXG$m?NTGEFf#So4E;L6Ah)aO`l=@x(@ z9H*qOm+}taQb~RD9&c|Ci=4}>8WK`kZFz6~t1B>DM5B}x!y-ipz4>|aRTmtm2M$|6 zk}C#%?pkDR-^4hWt%9caTOAVG6~}K#7h7x_6Nnunh9Yj;m|Ad9gVG|lqBe9drJaml zD00t8fSDC1yy4YA0_Jx%N(*`&Oc46mZ&Egx%X=6j-Rf;AUUqKTOT|96;IV@$UBXh> zr^j8a9p)6wy-Ux@o~XE>RDe}>eTjsb?h#8KSZymsGf=&Tg2@zMb7O z0>+@t?`idL4=FOeIDQ7TzrZV!Z@ac-XrDnWNk1;1!R7%D+OiovLDih|Mrg5H703rF zQ9OGQx+8^qhPA2bDUshUwBhNVK!o#ij3A%WHAowRJod;RRB)ybPUry$-!Oz6?DMoksKsNbn__w$X-@wmF7u%=B(NR=e*^sbOLnc5jUH^p$}AK}qzmQ)$bIQe}Pxk!S)ZJli;zFK)9_WGA{j)oSCT_X=s+ znCI1i?`dmB6~~BXuwSI>R&%}3-ObCK;Il_W-&-2|nI6HRd$B~s#J=%qL^bB)2EKh+ z_n}U;G@M+aap~k|-}T1ik8Vau-Ftla9 z{g^Z2%?7nU^nF4 zXZyg&ouAW81_oFhz7|=_xtT9Qp7Ke%{~pQ zs7yQ3UD!V57eXE*5PA5QcfL}gpuA09?G!LG+5B!*gx0}_7xb$O&lq6H_M^P?!Gr&5 zB$_i0a*E~kry_C*vS)Ldf*^)i#1eTq#I;{TMNsnb--Wn5oowEpyU2g_>EGd}k|g?H z@e^v_NOv^npHX+vz^c;UCO>Nf6+v0V*>m;JOubzD@PUx{@#A$0g@-5Zyc0efKMID0UT;cD#`SMS@nv(krx+ir$*^%Tu=-SuPh}ZceH>4* zs}xY0NsvyyFD>9F*&tb5CYBJIRyOU;FF?m6z$3u>wWD*%{R~(0Ek6~W+ay#gx4WTC zL%9a;=4evo>DjwyzBg|p(Thh*#&dB`sic>$J=d+wpG%BCF~43Yv(SQ`Ibd&^SE^cp z@;h619Sa*QsJ7qUkhx})eH$R5T$YYb;Y@UR02KJXA+Hjoi=la*oZXT~(B zetO!}6ix29J$9Fm;((S@wVPE))n!MGAPG5Qy*YqAcTxKyc%moh(l1uzF=H1`uVJ{; ztwe^hRlCm0Ap1QPpOTv1k1;Cm^Y0sc$$(q$x)oXe0KiV>g8juD%9*xmK%?RAL9(GCaWbqm2EWsHo#Xb6d695{A)E1?tAgGYd{kg$Nx1ECa2m(DU3S zFC!x&i*s*NPynX1r5|lU39Q3Gl0;k~r|yvI^0g+M%|=7SEWuZiJJhXDQ`5Tt$Jtoy z#o))XB&!M$zODh)+ZVFj&!b&U$5V2`_V>ebxHKh@&qda3zZEDpG1PES(E*s@^UU+0 z1>q(f#?;-eZS*FUEm%m04O3(>82vep?oy2`mT<(jYV~)sIYEZlpxoGoWNw&cO;9;# zn2vJBK=a~w`eZq$pm(aCHL->N;vK zg}YTN6J*PDvfR;pbZhVAJhbp@-rXswca)uOVO=CRyf@hq^*-7NO`Qb9B4gGo#wzPB z97-dv>7EBW>ARi+j$baFR}VULk37tvTN%&6#g;EBa%H$aK6q&rRys#x@?Jw1!V}d( zpy4sCI0{v*rk~lBSK8-%5)8lhJo+dpYz18VEcaEI=#U3tQoI?VOZ0GC>*7Z4NhE5+ zulQG(7vi#g@N5Vf|ElnyBb2DaU8i@bACM_D?2zoq1UEEC^7Hr41@T?z%rccb5*vMk zq?{CddTtqho*Y}te-VIZKM34(s2Fyp)MT>}s*tf3_7fcvg7Yc+f|Mx`v2q$S1+0s2 zX74|)NQ6GNX(Vd-e6LNm*LO_Oeg_Ud^@u|JfU{6V26!I9HCMo9)l85E$!oL5%%RyX zMIEl1?3#3sfh0HmRt7@J;SXP`4QmN_@Pb9XZYQKBOzUpjwO?JPCt(SycwZSNCWXLo|7x*YgLlvJE6>~wYmqCmS8F6tS@JE8C_SgO>A;Wj_ zNBQ9&cX&p}Cnk7inA1P67|fUEU?;3M5uQRnzl)&)>!A@Nd=Mb6GzL7g^QYj1?Hc)K zhQsUvJJ)Ghu2REz_>j?8%LZ0L&!iTwxa%PP?u${a&5S%(<|=B{ytCieZXW)OfScp& zY2s0_BSvnwuRV5C&Sc$!{q~%Z$@!tNGt9|EurPMPD{MB)kGIC>@qBr)<7J?7>P_pYr zx5GvDv?t>Dy8RV$CFP^Afw?_yd5XO+4}F)tX;PdigFej_MIW`b0F}M@D%8U!R!e!n zqqc`~O2M_%x5#@4%Sl>cz6>8mYkyL=0EJkZ^vD*LzS^An&+r!v8L-KxgF06#0#L}mZmXa{g)!olSJikfZg9rWph94%w&b@h^uS4Wetkpo zyRoxT#?>W~sC^NknfTDA?gM~|wU~j&;Eu|}*wv#lc)m?HC96YD z3Jb2|o_t~BSB}%$hlez@NwTYldpwW8Q8Sv)d#G5zH+g@kSvPSAdpq;Kxb zts>u<^|PC!(pKQLxPmnDDN!EQkFc43VT&e%Mc#2pn~2-mp%K_6AV2iU;cnsDH`L5zYz~EgnzWu^pj(gWHt(JMGoY!$zVH{JiX~h9dZD2y zdS`3n$h{!*Ul8!b8w`0@=>=E9mDhw1E`AIM`6C1<;fO=ky*hq|*fY`bx6q+AhGj`y zdLQRv(vH;D)0C;2&@;>~!B2~Eol(Yol5T)|ivWye;k>W=<}u&%ii5@u)myAQ zs%5y&hKG*p2&M16E6Y|Q29z!&?%jb}ZYHHy&U!#Mo_xC0DaKWI!4wpXVuG#D$^DA+NXL`FOwUw_{Qx zVhP{6+v>y^0LTlv4UH7qC15o05ApALa)#ALitCO%S$XMt(#pbm?RU%Z=o4W4&bZvF zGfdX6z;3-(xD{OM?9Y^cL@+N>mu&-Hu}}XeG49v@Gc#YiM}L~>YCdoCs(ty{wjS7E zl2LP)^1Uej5QJwEfiB9O8;?O*T6P5GuVMX zAq7&6$VjBU@_kSJ=wz+Fn$B;6|P^*`TNg)>XMldvhZS~FWl84cwDCZBHqaX z^>6GguMGZ8ujsEEzZ>yaG?$k_R+mMXtS%wp?{|)N*_D16!m@#jBwvRJFoaf6YgS_v z!A4tGz{n>lIC6h5iR8!8m`1I>ykF`=7!r}+W+GegJC_SM$NZM%?qhfUtry64{cJ2A zRj0tOb|QO)oCZ<;srYjZlzV&y$_srfV*EY!aPZ-`1eogm{vW7(=R0QC#(~z@6$6xS zIFQ^PCJ#FoR_)*eZS8Uz3GID>$y@lCjlwX`rKWca%YkF65}g9_zEN=vUC_)b2gS$E zF&jdZP3)g%8uDAvmVv|nF})QaBITXrp=RR>?HiPj+}Gt4R}%EMQ8$G2aqp;&u|jTQ zSA8p;D)QXuaYn$q8&nB?!VIC#+}(@Lson4E(aPpz<^tQ7{FVbN1{2oZ}Gu<`FZ(TWGuX|zLU|8w=tYf{A*>smo z_pwrGtU}#T&U=RQ47h1@3HE@5vgWs{>65h#Uz4Zh`m~L_Ou%{`gc$@tqX<^W`xe!# zaTEyXd<=~?UM5KY5EqvYVqvvQJCREDM3({{q$^sP%HuPK1`I?TB(oXH4-X7L8~DQ> z!+F&j?Z=dED%G2@u3D}hg%)ki1qfSNVigbU%hpZ7!uOC6{p1lxqY@so7ks9;VP&W#*uzswjPx3ip+vCIh?4ihrUURtuSOcp? z9rKixlrw04v9Jh6(TMH;^Et2MT`CA}MIl`w3nh7HuyRzs$LD2xv;5K#?$fG;8LN~(=Orx9 zwIem4q4dR{KyKNC{6FDx^WvGofthKA~_M17D1d!R3fEC6h zlQx7k*72N!aok8tP_q(GMWoTx*_ z{j&c(C*zJyw0DUu`Y#NwqX(0;K7_A&0UpUu9w{gbA*?pYN4TV<@~h+dlcsUdN6tit z0C3~^$$SNRyVIU@s12aDV_*_94nM7}o2-H8sleCF|4}8Rdh&KfVEJeUx6H5$Y(<8X z5&dBo0b>A(46wIs?W1gp{Bm=)^iMIWU`Z>gVUU0F4~KzWxszYJYOYUlk(&%5HZ%3k zh^m{OzO#!mLIj+u!RS=?!}20sO-9e_UEcaCCnv$Fcd3sUFL2W5fMfn^PNSd#@>KPj z8=C2e?|D#8*sJJf zVZmka)yaCCFR6I}J$@VJi&NV@$H|7DvP9Lny8!dmtIq&^5=|0jkBgZ_TF9m`NQ+zbTXUVXzELkE8V`d#l&l$#_lHZ zk_F&^QBo4-NG*miB@f}K6ustT!_|Ji)m9Rux^?A7AtKA#Wug{{{7_beGO{&iYSSY? zv!$5vqgsrM=d<53H9s@84mjZ(%Tq*$^!C8A2!M!9*Y~_{dQg3C0Nb52zy2iEjaI}NZd3Yy`xB98GG8Bg1 zIuqjD@9IOI#CB$`SzTctfz%m(lOrHazvKwxP>kneJMQ}hl=c>mrZgAO)TIfvGY}Dx zmDBegw^ZiC^lXxR=!;%!;RAj|QmB`ImjG0(r+wVeZoVf8M1t^|c>o6rmJ=Nl z{}qKTjw1>J`D2;RQB=qr8wL4U*~jgzWbKjP-R2bi6#&=r8XJN$ZX*+0fQxi$FRi9g z=)}+{O@a+A9H7Ks3*^Wuk7;4k9B=4Y3=wNQxGGE$AD}Oy4eQQ13yh@$ym*2^Ec;N~ zx{!tpey^}FCDh!WrMwXYMDlTJCkCN14b^%YBe~!1uRqB6^hL>@3&KiAUZ3s&0q^(yu zQv^sufu+ezGku{ikjTO5>MKl(*2BX1oXO(5Ke@^bbt7X0)rfM%QKa&4AA$d#|E39l z{w6APydmil*X|zjb>5u9fH7tFea*nD$WP`G5zFLQ%72SqsbK+k|ABW8{wzCqD!r+o zKoTO!F*2zAoAN;8ON*0<@{3ayU6#SZ?L72mYc?dU0VIFRkHcJlujNG6I%`Vxi0u7t zHCQat;$i`Q9e#>XKmG!w7BL;{H-QDh3Fe$l?2r06(KJo=6Mu9UyMl7Xq|ly^sHrxFHo zAf$H1G^^0n=@SWU9l=yLzTW#W9M=8K(r-kTv|$ijy+5R79&TV2c63J^$ZDr)2i8!c zMc_Rw7R5B!Vf$_eD4_E#p+bJT_%Bq2jY@s>yfV>v(n_;boZD})A>>aO9c(jXK#mJv{bDw;V44)O_9hdb#C6%-cl+-)w%9tYg_aroXDe|38!k zcV=L$Yrnp?|FU_hbeWsaU9p7L|C6!cwLMXtTZsFvc_3iSxL9K#_s#!}cO@ySI77xI z2j#vF-nfqP4*ocEEcFR4;ewj}pg76O&N6&xU(nTH@#@4~CZvrxk+@!!8;r#iTzvFm z7Ek8uqfHepy!2Nq20HHaOizV{pKdCCRDA+>8z@+;x9NCiL(D}mJI_FcZsfDa9>Eyl zy#J9HoQL@xCviYxn9npYLXzm5_rC~@x8fPb3H~e4&5BoqU@9B1xs;1{d%Syz`2TZsSs zqy8ksvkzZsMM)k+6A#gp0+^yOm(8kqI1QZ1Sb=E?OF8yDgDuI8khB2dNyh&K3!9it z%RZZl%CXVM9p~5fh4c{^;BraudQr%ku2ztQ(;%wJ#}DQn@Ic2?1Sc7e%ojDcgI2~k zt4L*OeG;P>4nJj$^81JL!)z7Qi-I@C9Apnn8M+u(pJe#^wv8xk6Qj8Z!H;V6JR<~< z%CLN@ErVXV-J{#Imyh6;v*K91i7vAo3(*fBk+9-bl zC(Ksb9Hdw#9=i`%V6*y?T1ZiPQmx;bGke&wDF8bdp{c9Sc_v0@a`8Iak3Hr&UKuPb zW^-a=KJoxhHslSsxEc0O6K1NskFhrHd8|_!svk%CYSvm8TB@j!W zD3z+l?BVq&&B&G_*CK52lqXJiT_8D*k^qj^GlJaR{Dd8 zgW~@Pj$d>+8DyU*TDumYJ90hM=@s5(QNz~lzRc&?4(uyw9&_D z70ds3D}wUQ1KPmx6suYu5&dKOJRKv`zI+xLC=k9O?1|qj7HdEmC-y7`9HwP`IHk!k znAtTG-~aRyC#ys?G{BRr%K!hnIiWB0ugr=4Y?D8k6XlZkKW?51dcKb3;jH`g-bYR8 z&33_+FeYYIU5JL%%3!m66Ae9@=tqrG zTm*LRbz(Up-#@h_kA8ruZ*&Jn*+netcBDplOin7asB%^*-N^4Uz&p2xdwVU>NT{4D z$mJy&FXKQ7bzU~rHu~>8x4%ly%_y6)yT5DRafM>o#JtW=^j;xG1fuYn4CcCW4S?tos}nAJcO}>hoI;G{>-7T%3f>U7tAl zHw-VFx$@FCMtt>mj-iqp)JwYF*?~KV)@_bNCsa5>RRWHMq?Zl;!qd}ec)nHGaVY{( z$E)?Ylc~z7dr94LGnTaT;(v~dv8C-d-7hFrt;%Ap!&*ZJ{+^t5WdG5q@ahz)$1j8V zliE2ef4VI})Xt_)VT}L?NuUfCEPg@eUujMJyP0?JKfE8Z;H*kGMU1(uDnP&{uLNJoVrPHWnJRqIj z-se`Rz8<6TZykAN?IVN5A~L6VVsicfDG2}cHB5XS{A&B}KbK_T$B4_AAKQ&9B3VBd N%1bLtl}VTc{y#R+8SMZ7 literal 0 HcmV?d00001 diff --git a/images/char array to table.png b/images/char array to table.png new file mode 100644 index 0000000000000000000000000000000000000000..2deca89854dc0f77547c5a18689ad59d6e6d8302 GIT binary patch literal 14565 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 literal 0 HcmV?d00001 diff --git a/images/double graph.png b/images/double graph.png new file mode 100644 index 0000000000000000000000000000000000000000..19e0d03b19b4a028f714231b0a66a4a37fd95ce0 GIT binary patch literal 9179 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 Z8_9my=vVf@&Fo*V$;&7M%A}1y{2xHUCiwsW literal 0 HcmV?d00001 diff --git a/images/function to graph.png b/images/function to graph.png new file mode 100644 index 0000000000000000000000000000000000000000..9a934fa01a6b6e2b59bd62615c222c520efd5f91 GIT binary patch literal 10364 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 literal 0 HcmV?d00001 diff --git a/images/graph colors.png b/images/graph colors.png new file mode 100644 index 0000000000000000000000000000000000000000..f099713ed904a61fa26429111926ea5e19d6cbd1 GIT binary patch literal 6350 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 DmD!=&i!?3m=ExD@Hjs5w}H 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 literal 0 HcmV?d00001 diff --git a/images/light dashed graph.png b/images/light dashed graph.png new file mode 100644 index 0000000000000000000000000000000000000000..e540fa01bb46dc2e37bdf7cf401597eb6be5e3d3 GIT binary patch literal 9717 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 P_T3?KE3<-qC$Ib$KbwK6 literal 0 HcmV?d00001 diff --git a/images/light dashed table.png b/images/light dashed table.png new file mode 100644 index 0000000000000000000000000000000000000000..ed10789c6722112ee92c5a787e62b313599b3542 GIT binary patch literal 15061 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¬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 Qrk|aXVsfIT!uo#y1+)JtHvj+t literal 0 HcmV?d00001 diff --git a/images/light graph.png b/images/light graph.png new file mode 100644 index 0000000000000000000000000000000000000000..669a529a9143c3715d0cf3ec69ffd69050321a94 GIT binary patch literal 8935 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 literal 0 HcmV?d00001 diff --git a/images/light table.png b/images/light table.png new file mode 100644 index 0000000000000000000000000000000000000000..c097dbee9ba43bd7eccd3867de9489ff04e9c51b GIT binary patch literal 14555 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 literal 0 HcmV?d00001 diff --git a/images/plot colors.png b/images/plot colors.png new file mode 100644 index 0000000000000000000000000000000000000000..17188deda59fccdab5e44d01c41a9069992a5991 GIT binary patch literal 10527 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 literal 0 HcmV?d00001 diff --git a/images/sorted array to table.png b/images/sorted array to table.png new file mode 100644 index 0000000000000000000000000000000000000000..ed79a463dd76312fd616b12a0c47148e6b320c49 GIT binary patch literal 6590 zcmb7JcT^MKwx)`7L;;a1sDLQ3(IIp}5ke6`AVh352_XWn;F-U@M}`6D!Qd)R3jHOLCss;czpsFkoRRLGkXnax(kezGin} zEGz4|p%ArwV;adLfmJ8XCKKVFl~ z)<1fgL->`DQ0PVxJg9pa{assoyAvMlCP*+@=?48O?(EPdjkM>GUkex>J^fVZUmI~P zGi+2)YE)tJ8|2u~J{5ZF^8~pwbc$Q-Nsj=E`bKZP?okWNY0l z2jq>LUCdGolOFe5-{{ioe15RqiP_>4M3zi$>l(Cfm;fSxIvbO(t;1Jq664OPY+!vs z!9A)z%_I~m3qhT9M}W-_w;J2(3DRj2&w8-;Hh=TllDu7n1ON!!gQ4mojKEQ(rQTH3 z5nSL%qvj4;gKctMib+Ji{lZGzxmjO?D!yKG2;Bkdo9ch88;BYS}a5V^9;EGl$8?`yK7kS14sYC?}CD-RzC$3Bjv1_>crpl5i#NB3Q44!so3bkKf;~4lQPBt?lM^C5?FD zyKYr_jdbx6@Gfup&(5VGR&2+TTy)A2cLUCU>JI*WNU(jtMH&wcxwLmuJ!pAi47=S_ z^vt)li+_2n_+gMeVX+y2@S9xhYJD}z_gIf!zqT(S8u05bX~=&d$;%0FLB4g*6}U^U zi%3(XSMsWI`9ZU#^?_TGhSAz#jAwvNT?wq>XWf$UnNGBN5S%vM(>6B@Y7Hu?DLRHa zeRzaSc*?aNcs~a?gqjxlK$ziJXRN*Wr?Pb#Y`&Xa{^@EOYZIbp!aK4KfX9p zwStjQ7w~x!afaWg{ly_;li(Et!IfS+sC+O_19u!;4td~CGEZOx zs?zjQ0CQZGJS9rq^kzCo>GX zb@?zThb-G|0TGmyF&8*pPi(C?bPMoZfvxG)2NWGl?fyzBa&ftmf0ZwQP6FLJSjAg+ zRRJH|D&m$=WX1tiU3hYy`MtN~-*p#gVYp)vC7q^Vu`ubu8$93Q;u-hH0lMg-#P`^& zB(z7wGr_}yTmtBp)J}irOh?lDNw?f-rgnZ&++i#qI%NnE-5vD=M%nHVtR81geF$wSavTi1VX@a)wFB@W$$N=Zpg?8OY| zrJ~@KHP9WBxW%{3S@)BKS{JM9(R<&o(F|yQbFHaJ#0gmP?2!e7ocE}+ar4{Q;o#-< z7vSzrP|cjnX8X(>`mY;u^|gs{MN;AAtH^`0g{z#nb9>oCFQT=wrm7vyx|9}M1A&zb z8EV#B&1y1%;MGv4%sFa(D{lCAzT=*Ygf3HqM}9|~`TlGkv?3)nyyn{{93kj;u-*y^ zY=x+DlfTgyZX(ybMO{8g2)HQk$w%(cS1l2gJ6Q_ZQZSn^~61G%! zE`t1FvbQ8PUp->~?B2t@uJ}!|lcLE&X|4MoNGv7aIaF#1wEOI!5b96sEmTJJ zYpQNc>ts0vTBa*9?!O1Q{_UFkLOlUj7P&IW=2Dbc7#GZUYcX7<@+Dei1#(ie*kkRb z?7JTiJJjDE2~s^+(s)<-m}GV6gnTzP(uXvu^LJ&!o!P zo}Hd>6a|8;oT+)2Osu+xwJ0kR*=DL)d|fj#q9>x9sb&wRntg$JXbSMV+gx81KkuMD zWW#6dfg5lU+#?k*UcR0w(}LPRtJ6HRSI(Tf?q}A~BLi=AD|IOtUdrODoXI$~^+`i! zJoHHl(gmVm!4tUb1-U@soY)+lTi$=N4xdbaCN2mihQmYlJg4!z5hbDOK_vXa^t715 zIfYgLdUShqeFnWWR~tT?4uR|GL@e!Yep$;oz}d@K92oDwDPRze-rSzhi^S=u4IIu( zD8E`!jJYf5JxW`NN@z4PYHVaT)f;u#Y29(MNjm+rYIif}B57^fVI2~E81~@&o{asG zAYJqsm3Eoge#2j^8!=n?F1`W{%qe;T9-zqqBOqb&%j&c1IMwg{=n5$fZ7oerO)cNK zrQe)uTagEe3@R@;bB+>2IIE5M3_n9_?;C#A^D%{|a2>Yp@b zCMfP7dCK3Z&C!W}O>HJtMpxxUTN+#uhkX?7>>WoyPX%wXvYaSB4r!$9U}+uOX_%va zqNBqlcV05a}%n1?>JCw z!9wx;+o5y^KIlkmwLaC5adgZ)z6wlY@7tpm8u`!+@NF!arl}Z{3#2+%;8_@L+e7|3 z!#35X#P?;z_^NH1Ww-oVxpkg&40%3f`SaY#7atO%ALUzVEs!p3T-UtaRv`Ma!7cM$ z^~XGCN1w|D8CPe}l`l%E*TG_=rUNcFo4`}L6KTkrh2jPH1mFtGX5@N+(75(5%tNSm zl^R=)gT|4vMsHZSbV5;-ehqgT1|ZqIa-_aglOiORqu!PShpM^?0li>~%1k$$o+g|m zp8Hvt-ca2GjNTHKTeewYrRgeEctHTJz_@oq#Q#^0H4LwZ%7!QC3vc`7Ha;3WQd{y?qe$m9_b&na31ll??2al+6 zXacY6PN0$D3&m6L2~9)h*vkgLhXX(P=hH`%<6~{J&BULiQ)yOk?_=&xO<|M#Mx0|ni!UwEX`z3UF~iRb5szC zyYZw)vL(d^8sC;6>pDUZiP(k5to|ZRQ`^OcFQaFZox7L}?aH|YRh^QBcag0eZ!iBL zs75CqoX4cl^HJsJRpTV~(}ncPd;#Tdt_=Cxg0di(E-%^kiaLbw%)X@f^Y}1+F%-)} zJab!}H#z^b2wwfbSbhqc5)O`!{jI?j3N61c0;Ev+XPE4F@bSM~g^=-LE#zI2CzAT) zpqTB*jamXYPMY#T&$L)tADxYsFeBTlsFSk(loZ6F|5G#k8!hgECG^|)IPe#5_o@ri z*;qA%QRZVG^m?Bs@K1R`WTP~NoY~i|bdL1nCWyiVh;I_})%xIi%BTCj#ejw|FKc_W ztokKT_&($7@p37img66%?=&W}3!{0d^~_hoDrS@#2<5EJ4Wji$=WPTc+r(acNeOWt zl@|CcB1UP8FG8@k#D>bPm0IzsjElW_uP{Q$EVcUsS-IDEB2?ubsizd(xh2&njG~lO zYCr#0exLGnxaH#BHGnXHw|Sxu(f(n^1AzlN6Ji&5bO9nU9}w-+4nE#(wv7HRi!#b5 z2PTklKeW?Us}SPP#7P}8x;cn2*j!YTaa+Kt@kNvLm2Cu+8_ul{CVZhyt({9+x|0&P z(Rg^O1ZMYS`h2M2TIp>*mEUhu@1w~Sua;17c3}^VNeklJbIY4UZ*(T9+~~K4e?kVX zQ3B0ZMOgc@Fcb^pQol0T7Dj+F;(-tet5sf;pQ3+z^1C5EM5hHiey;TT->%rLKb?A% zZuVmrXY9US#y$2=gerpzGNmSb#rLK2QM7|xI#*zr6y6uRk?~$Q(_w`D93H6Xsp(Me>WLj!XcTr> z3xPWeqQHF1)qsjHFDLXHVk*rhj|s%aU=6+5YJuA_S<{W|Dk_tn2#POPv81Q zcxLAy^@>r*8lSd#-&0XqtiqK0K}xy7qO*8^)#=zPeF<-ww4G-X*)ekEV4*pX`CTSx z_b+P=KLRWHd zUdv2}31GeXA1LaNd5nj`*2)28)2EDog{@s_8yRDQ*z{1dMVqLG(eCeJ9QXvbJ{e=1 z2VN<3{VK+jcem{nJhg>iV$50#l7L)gsNAsC3c!x@*m~*&qn}ydCy$-_H#PtN)^8-< zi#;9}<$j90&-Ql86(P*DUzFm>@(&R`RX8CYtaW(RrGh$f-cM1h;ss*ld&eRPu@U&D zTpx!lcW^`4GX^IWPu8){#GGg%mr6EG1*Ed;;N9`UJhbhntNZ74F{|)-hFC)XByM

nB6g$dtp&$z(Q6+|93n5%$|pH?SphHVvuJC+`9xEt{rZ5x1lLiL`IwKQc+4Iq#G zL&~1lb3H!Dj^B8hA%@AHma{Ilko~sx8lwTV`)KGh3>Cx28PibB9n0PF1_&NonpFq8Rmr zeP2@9AK)eyt&TZ}^{Rgbm8p2>nwu;y{j`0Zt|sFrpj0>&fDl;CIMq^)Q-@FNMkpgJ zjY=sUXc(@`75j;qA}>KeW`Z*w|I3)g*v=HqTn-{*ACv)Xn?cWbuhlpW8sa* z3s)-rnH8ocgq)EOm_)spTLq{%U}erKlZIt%p0cGC&r?b?z~W*rq6^qu_r2QAJSlqS zJeT=t5PG~g&RcV>lpb34`+g0A7}mS;)_9|!2vnPdohHb<_6d_X_G8OxP{bUy;NzUOykW58TP%7Skp54|PJ{aMmT{UI zFK|xNT0DdK(>oEizFL^A?OQp>V81YF**9@CfYo++lySdVGWzs3m|X~?uJlAfnA3@) zA(rmcQV?%7m)P9ai}w@d>~g66hLkQ8BeU#!h>bp2RM~yD$xTZcWK#8ag${oaelM8% zw<_MTYhZlwj%AzuM}8WFSg!rJT0j722y8c>21(%x`7i7q$@Mr>3QZZ0P_%5FHnc9T zklKieUBV^vU`tNk1^Bj1JsPLEV?Rr7Ob@+uB{jY}{v20wRO*|#L$^ELcb|}kxm!tbrADd(LGa!$G*s`hK=n)TV8i^D(B^ibL1gV4!FSWXYXa-8_H)AJ$FHIS0&k zUTz)x#ihH#{e?wRSCC<#dFBMigd#}nSlAu-(mI?oo5gu2fe)T(J0R$3N*^XeM5^%I zcFZ4z8Keto5RM+%ewQHU(+5EBhaNAGDJ&yzCkXc8=%K1mN9uawBqqqnar#tq$0@(E z+xm%HoXhg>P!?7zyx!0wQEESbtoGwS?+$DT(#jG_X;WSbB|(7$n|BUPj?8v>NcaCp z7_$bp(8KFAkb?AUm$q&9Ojs`G={ET}YX&+?h_Cs4yw}T5s@ z##gK6Y%&|>SLUG4zs0%5PJSRVz{pKbH~9lqx685rLB~7yi5=Wq#49}aozZ(H$bLpk zHq8D>D?O4P&elb;1y)pF+>?vsK-AnL`tM-Xc%~rvc{-ot|HLp}3u=s*+BmUK?Yw(C zsj1h7wcHTKxXODVDUtq-$@P`$2Kk5mLdT(vTnOuLx zBvGC`5l2S!E-THCxV@nG<1Xju*`ma2T8J{q)_}!@e82BQs=qQnt z8c)Aw-3|D991%|UJG--6_NPR~v;BuP{y%L6)cFHAcp>zlYc|8iw}^X7mFdUZ#l-(- w%i-D5VbvhVZ}cSX8P?NgWEhDk<_xCPltyZm+Q1FtIc)G`tu6U%u2=c>n+a literal 0 HcmV?d00001 diff --git a/tables.cpp b/tables.cpp new file mode 100644 index 0000000..48a69d2 --- /dev/null +++ b/tables.cpp @@ -0,0 +1,329 @@ +// Teal Dulcet, CS546 + +// Compile: g++ -Wall -g -O3 tables.cpp -o tables + +// Run: ./tables + +#include +// #include +#include +#include +#include "tables.hpp" + +using namespace std; + +long double afunction(long double x) +{ + return x + 1; +} + +long double function1(long double x) +{ + return 2 * x; +} + +long double function2(long double x) +{ + return pow(x, 2); +} + +int dimensions = 0; +int sortdimension = 0; + +/* template +int compare(const void *pa, const void *pb) +{ + const T *a = *(const T **)pa; + const T *b = *(const T **)pb; + + if (a[sortdimension] == b[sortdimension]) + { + for (int i = 0; i < dimensions; ++i) + { + if (sortdimension != i and a[i] != b[i]) + { + if (a[i] > b[i]) + return 1; + + return -1; + } + } + } + + if (a[sortdimension] > b[sortdimension]) + return 1; + else if (a[sortdimension] == b[sortdimension]) + return 0; + + return -1; +} */ + +template +bool compare(const T *a, const T *b) +{ + if (a[sortdimension] == b[sortdimension]) + for (int i = 0; i < dimensions; ++i) + if (sortdimension != i and a[i] != b[i]) + return a[i] < b[i]; + + return a[sortdimension] < b[sortdimension]; +} + +int main() +{ + const size_t rows = 5; + const size_t columns = 5; + + const long double xmin = -10; + const long double xmax = 10; + const long double xscl = 2; // 80 / (xmax - xmin); + + // Output array as table + cout << "\nOutput array as table\n\n"; + { + long long **array; + array = new long long *[rows]; + for (unsigned int i = 0; i < rows; ++i) + array[i] = new long long[columns]; + + for (unsigned int i = 0; i < rows; ++i) + for (unsigned int j = 0; j < columns; ++j) + array[i][j] = rand(); + + tableoptions aoptions; + + for (unsigned int k = 0; k < (sizeof styles / sizeof styles[0]); ++k) + { + aoptions.style = k; + + table(rows, columns, array, NULL, NULL, aoptions); + } + + if (array != NULL) + { + for (unsigned int i = 0; i < rows; ++i) + delete[] array[i]; + + delete[] array; + } + } + { + long double **array; + array = new long double *[rows]; + for (unsigned int i = 0; i < rows; ++i) + array[i] = new long double[columns]; + + for (unsigned int i = 0; i < rows; ++i) + for (unsigned int j = 0; j < columns; ++j) + array[i][j] = static_cast(rand()) / static_cast(RAND_MAX); + + tableoptions aoptions; + + for (unsigned int k = 0; k < (sizeof styles / sizeof styles[0]); ++k) + { + aoptions.style = k; + + table(rows, columns, array, NULL, NULL, aoptions); + } + + if (array != NULL) + { + for (unsigned int i = 0; i < rows; ++i) + delete[] array[i]; + + delete[] array; + } + } + // Output char array as table + cout << "\nOutput char array as table\n\n"; + { + const char *const aarray[rows][columns] = { + {"Header row/column 1", "Header row 2", "Header row 3", "Header row 4", "Header row 5"}, + {"Header column 2", "Data 1", "Data 2", "Data 3", "Data 4"}, + {"Header column 3", "Data 5", "Data 6", "Data 7", "Data 8"}, + {"Header column 4", "Data 9", "Data 10", "Data 11", "Data 12"}, + {"Header column 5", "Data 13", "Data 14", "Data 15", "Data 16"}}; + + char ***array; + array = new char **[rows]; + for (unsigned int i = 0; i < rows; ++i) + array[i] = new char *[columns]; + + for (unsigned int j = 0; j < columns; ++j) + { + for (unsigned int i = 0; i < rows; ++i) + { + array[i][j] = new char[strlen(aarray[i][j]) + 1]; + strcpy(array[i][j], aarray[i][j]); + } + } + + tableoptions aoptions; + aoptions.headerrow = true; + aoptions.headercolumn = true; + + for (unsigned int k = 0; k < (sizeof styles / sizeof styles[0]); ++k) + { + aoptions.style = k; + + table(rows, columns, array, NULL, NULL, aoptions); + } + + if (array != NULL) + { + for (unsigned int i = 0; i < rows; ++i) + { + for (unsigned int j = 0; j < columns; ++j) + delete[] array[i][j]; + + delete[] array[i]; + } + delete[] array; + } + } + // Output array as table with separate header row and column + cout << "\nOutput array as table with separate header row and column\n\n"; + { + const size_t rows = 4; + const size_t columns = 4; + + const char *const aarray[rows][columns] = { + {"Data 1", "Data 2", "Data 3", "Data 4"}, + {"Data 5", "Data 6", "Data 7", "Data 8"}, + {"Data 9", "Data 10", "Data 11", "Data 12"}, + {"Data 13", "Data 14", "Data 15", "Data 16"}}; + + const char *const headerrow[] = {"Header row/column 1", "Header row 2", "Header row 3", "Header row 4", "Header row 5"}; + const char *const headercolumn[] = {"Header column 2", "Header column 3", "Header column 4", "Header column 5"}; + + char ***array; + array = new char **[rows]; + for (unsigned int i = 0; i < rows; ++i) + array[i] = new char *[columns]; + + for (unsigned int j = 0; j < columns; ++j) + { + for (unsigned int i = 0; i < rows; ++i) + { + array[i][j] = new char[strlen(aarray[i][j]) + 1]; + strcpy(array[i][j], aarray[i][j]); + } + } + + tableoptions aoptions; + aoptions.headerrow = true; + aoptions.headercolumn = true; + + for (unsigned int k = 0; k < (sizeof styles / sizeof styles[0]); ++k) + { + aoptions.style = k; + + table(rows, columns, array, headerrow, headercolumn, aoptions); + } + + if (array != NULL) + { + for (unsigned int i = 0; i < rows; ++i) + { + for (unsigned int j = 0; j < columns; ++j) + delete[] array[i][j]; + + delete[] array[i]; + } + delete[] array; + } + } + { + bool **array; + array = new bool *[rows]; + for (unsigned int i = 0; i < rows; ++i) + array[i] = new bool[columns]; + + for (unsigned int i = 0; i < rows; ++i) + for (unsigned int j = 0; j < columns; ++j) + array[i][j] = rand() % 2; + + tableoptions aoptions; + aoptions.boolalpha = true; + + for (unsigned int k = 0; k < (sizeof styles / sizeof styles[0]); ++k) + { + aoptions.style = k; + + table(rows, columns, array, NULL, NULL, aoptions); + } + + if (array != NULL) + { + for (unsigned int i = 0; i < rows; ++i) + delete[] array[i]; + + delete[] array; + } + } + // Output sorted array as table + cout << "\nOutput sorted array as table\n\n"; + { + int **array; + array = new int *[rows]; + for (unsigned int i = 0; i < rows; ++i) + array[i] = new int[columns]; + + for (unsigned int i = 0; i < rows; ++i) + for (unsigned int j = 0; j < columns; ++j) + array[i][j] = rand(); + + dimensions = columns; + sortdimension = 0; + + // qsort(array, rows, sizeof(array[0]), compare); + sort(array, array + rows, compare); + + tableoptions aoptions; + + for (unsigned int k = 0; k < (sizeof styles / sizeof styles[0]); ++k) + { + aoptions.style = k; + + table(rows, columns, array, NULL, NULL, aoptions); + } + + if (array != NULL) + { + for (unsigned int i = 0; i < rows; ++i) + delete[] array[i]; + + delete[] array; + } + } + // Output single function as table + cout << "\nOutput single function as table\n\n"; + { + tableoptions aoptions; + aoptions.headerrow = true; + + for (unsigned int k = 0; k < (sizeof styles / sizeof styles[0]); ++k) + { + aoptions.style = k; + + table(xmin, xmax, xscl, afunction, aoptions); + } + } + // Output multiple functions as table + cout << "\nOutput multiple functions as table\n\n"; + { + long double (*functions[])(long double) = {function1, function2}; + + tableoptions aoptions; + aoptions.headerrow = true; + + for (unsigned int k = 0; k < (sizeof styles / sizeof styles[0]); ++k) + { + aoptions.style = k; + + table(xmin, xmax, xscl, 2, functions, aoptions); + } + } + + return 0; +} diff --git a/tables.hpp b/tables.hpp new file mode 100644 index 0000000..92e1056 --- /dev/null +++ b/tables.hpp @@ -0,0 +1,519 @@ +// Teal Dulcet, CS546 + +#include +#include +#include +#include +#include +#include +#include +#include + +using namespace std; + +const char *const styles[][11] = { + {"-", "|", "+", "+", "+", "+", "+", "+", "+", "+", "+"}, //ASCII + {"—", "|", "+", "+", "+", "+", "+", "+", "+", "+", "+"}, //Basic + {"─", "│", "┌", "┬", "┐", "├", "┼", "┤", "└", "┴", "┘"}, //Light + {"━", "┃", "┏", "┳", "┓", "┣", "╋", "┫", "┗", "┻", "┛"}, //Heavy + {"═", "║", "╔", "╦", "╗", "╠", "╬", "╣", "╚", "╩", "╝"}, //Double + {"╌", "╎", "┌", "┬", "┐", "├", "┼", "┤", "└", "┴", "┘"}, //Light Dashed + {"╍", "╏", "┏", "┳", "┓", "┣", "╋", "┫", "┗", "┻", "┛"} //Heavy Dashed +}; +// {" ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}};//No border + +struct tableoptions +{ + bool headerrow; + bool headercolumn; + bool tableborder; + bool cellborder; + unsigned int padding; + ios_base &(*alignment)(ios_base &); + bool boolalpha; + char *title; + unsigned int style; + tableoptions(void); + ~tableoptions(void); +}; + +tableoptions::tableoptions(void) +{ + headerrow = false; + headercolumn = false; + tableborder = true; + cellborder = false; + padding = 1; + alignment = left; + boolalpha = false; + title = NULL; + style = 2; +} + +tableoptions::~tableoptions(void) +{ +} + +const tableoptions tabledefaultoptions; + +// Number of columns needed to represent the string +// Adapted from: https://stackoverflow.com/a/31124065 +int strcol(const char *const str) +{ + size_t length = strlen(str); + for (size_t i = 0; i < length; ++i) + if (iscntrl(str[i])) + { + cerr << "\nError! Control character in string.\n"; + cout << "Control character: " << (int)str[i] << "\n"; + } + + length = mbstowcs(NULL, str, 0); + if (length == (size_t)-1) + { + cerr << "\nError! mbstowcs failed. Invalid multibyte character.\n"; + exit(1); + } + ++length; + + wchar_t *wcstring = new wchar_t[length]; + + if (mbstowcs(wcstring, str, length) == (size_t)-1) + { + if (wcstring != NULL) + delete[] wcstring; + + cerr << "\nError! mbstowcs failed. Invalid multibyte character.\n"; + exit(1); + } + + int width = wcswidth(wcstring, length); + if (width == -1) + { + cerr << "\nError! wcswidth failed. Nonprintable wide character.\n"; + exit(1); + } + + if (wcstring != NULL) + delete[] wcstring; + + return width; +} + +// Word wrap +// Source: https://gist.github.com/tdulcet/819821ca69501822ad3f84a060c640a0 +// Adapted from: https://stackoverflow.com/a/42016346 and https://stackoverflow.com/a/13094734 +string wrap(const char *const str, const size_t line_length) +{ + char words[strlen(str) + 1]; + strcpy(words, str); + string wrapped; + + size_t index = 0; + size_t linelen = 0; + while (words[index] != '\0') + { + if (words[index] == '\n') + { + linelen = 0; + } + else if (isspace(words[index])) + { + size_t tempindex = index + 1; + size_t templinelen = linelen; + while (!isspace(words[tempindex]) and words[tempindex] != '\0') + { + ++templinelen; + + ++tempindex; + } + + char temp[templinelen + 1]; + strncpy(temp, words + (index - linelen), templinelen); + temp[templinelen] = '\0'; + + size_t width = strcol(temp); + + if (width >= line_length) + { + words[index] = '\n'; + linelen = 0; + } + } + + if (words[index] == '\t') + linelen += 8 - (linelen % 8); + else if (words[index] != '\n') + ++linelen; + + ++index; + } + wrapped = words; + return wrapped; +} + +// Output char array as table +int table(const size_t rows, const size_t columns, char ***array, const tableoptions &aoptions) +{ + if (array == NULL) + return 1; + + const bool headerrow = aoptions.headerrow; + const bool headercolumn = aoptions.headercolumn; + const bool tableborder = aoptions.tableborder; + const bool cellborder = aoptions.cellborder; + const unsigned int padding = aoptions.padding; + const char *const title = aoptions.title; + const unsigned int style = aoptions.style; + + if (style >= (sizeof styles / sizeof styles[0])) + return 1; + + int columnwidth[columns]; + for (unsigned int j = 0; j < columns; ++j) + columnwidth[j] = 0; + + int width = 0; + + setlocale(LC_CTYPE, ""); + + for (unsigned int j = 0; j < columns; ++j) + { + for (unsigned int i = 0; i < rows; ++i) + { + int cellwidth = strcol(array[i][j]); + if (cellwidth > columnwidth[j]) + columnwidth[j] = cellwidth; + } + + width += columnwidth[j]; + } + + struct winsize w; + ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); + + if (tableborder and (cellborder or headerrow or headercolumn)) + width += (((2 * padding) + 1) * columns) + 1; + else + width += ((2 * padding) * columns) + 2; + + if (width > w.ws_col) + { + cerr << "The width of the table (" << width << ") is greater then the width of the terminal (" << w.ws_col << ").\n"; + return 1; + } + + if (title != NULL and title[0] != '\0') + cout << wrap(title, w.ws_col) << "\n"; + + if (tableborder) + { + cout << styles[style][2]; + + for (unsigned int j = 0; j < columns; ++j) + { + for (unsigned int k = 0; k < (2 * padding) + columnwidth[j]; ++k) + cout << styles[style][0]; + + if (j == (columns - 1)) + cout << styles[style][4] << "\n"; + else if (cellborder or headerrow or (j == 0 and headercolumn)) + cout << styles[style][3]; + else + cout << styles[style][0]; + } + } + + for (unsigned int i = 0; i < rows; ++i) + { + for (unsigned int j = 0; j < columns; ++j) + { + if (tableborder) + { + if (j == 0 or cellborder or (i == 0 and headerrow) or (j == 1 and headercolumn)) + cout << styles[style][1]; + else + cout << " "; + } + + if ((i == 0 and headerrow) or (j == 0 and headercolumn)) + { + int difference = columnwidth[j] - strcol(array[i][j]); + int apadding = (difference / 2); + + for (unsigned int k = 0; k < padding + apadding; ++k) + cout << " "; + + cout << "\e[1m" << array[i][j] << "\e[22m"; + + for (unsigned int k = 0; k < padding + (difference - apadding); ++k) + cout << " "; + } + else + { + for (unsigned int k = 0; k < padding; ++k) + cout << " "; + + cout << aoptions.alignment << setw(columnwidth[j]) << array[i][j]; + + for (unsigned int k = 0; k < padding; ++k) + cout << " "; + } + } + + if (tableborder) + cout << styles[style][1]; + + cout << "\n"; + + if (tableborder) + { + if (i == (rows - 1)) + cout << styles[style][8]; + else if (cellborder or (i == 0 and headerrow) or headercolumn) + cout << styles[style][5]; + + for (unsigned int j = 0; j < columns; ++j) + { + if (cellborder or i == (rows - 1) or (i == 0 and headerrow) or (j == 0 and headercolumn)) + for (unsigned int k = 0; k < (2 * padding) + columnwidth[j]; ++k) + cout << styles[style][0]; + else if (headercolumn) + for (unsigned int k = 0; k < (2 * padding) + columnwidth[j]; ++k) + cout << " "; + + if (j == (columns - 1)) + { + if (i == (rows - 1)) + cout << styles[style][10]; + else if (cellborder or (i == 0 and headerrow)) + cout << styles[style][7]; + else if (headercolumn) + cout << styles[style][1]; + + if (cellborder or (i == 0 and headerrow) or headercolumn) + cout << "\n"; + } + else + { + if (i == (rows - 1)) + { + if (cellborder or (j == 0 and headercolumn)) + cout << styles[style][9]; + else + cout << styles[style][0]; + } + else if (cellborder or ((i == 0 and headerrow) and (j == 0 and headercolumn))) + cout << styles[style][6]; + else if (i == 0 and headerrow) + cout << styles[style][9]; + else if (headercolumn) + { + if (j == 0) + cout << styles[style][7]; + else + cout << " "; + } + } + } + } + } + + cout << endl; + + return 0; +} + +// Convert array to char array and output as table +template +int table(size_t rows, size_t columns, T **array, const char *const headerrow[], const char *const headercolumn[], const tableoptions &aoptions) +{ + if (array == NULL) + return 1; + + unsigned int i = 0; + unsigned int j = 0; + + if (headerrow != NULL) + ++rows; + + if (headercolumn != NULL) + ++columns; + + char ***aarray; + aarray = new char **[rows]; + for (unsigned int i = 0; i < rows; ++i) + aarray[i] = new char *[columns]; + + if (headerrow != NULL) + { + for (unsigned int j = 0; j < columns; ++j) + { + aarray[i][j] = new char[strlen(headerrow[j]) + 1]; + strcpy(aarray[i][j], headerrow[j]); + } + + ++i; + } + + for (unsigned int ii = 0; i < rows; ++i) + { + if (headercolumn != NULL) + { + unsigned int ii = i; + + if (headerrow != NULL) + --ii; + + aarray[i][j] = new char[strlen(headercolumn[ii]) + 1]; + strcpy(aarray[i][j], headercolumn[ii]); + + ++j; + } + + for (unsigned int jj = 0; j < columns; ++j) + { + ostringstream strm; + + if (aoptions.boolalpha) + strm << boolalpha; + + strm << array[ii][jj]; + string str = strm.str(); + aarray[i][j] = new char[str.length() + 1]; + strcpy(aarray[i][j], str.c_str()); + + ++jj; + } + + j = 0; + ++ii; + } + + int code = table(rows, columns, aarray, aoptions); + + if (aarray != NULL) + { + for (unsigned int i = 0; i < rows; ++i) + { + for (unsigned int j = 0; j < columns; ++j) + delete[] aarray[i][j]; + + delete[] aarray[i]; + } + delete[] aarray; + } + + return code; +} + +// Convert one or more functions to array and output as table +template +int table(const long double xmin, const long double xmax, const long double xscl, const size_t numfunctions, T (*functions[])(T), const tableoptions &aoptions) +{ + if (numfunctions == 0) + return 1; + + if (xmin >= xmax) + { + cerr << "xmin must be less than xmax.\n"; + return 1; + } + + if (xscl <= 0) + { + cerr << "xscl must be greater than zero.\n"; + return 1; + } + + const size_t rows = ((xmax - xmin) * xscl) + 1; + const size_t columns = numfunctions + 1; + + const char *const aheaderrow[] = {"x", "y"}; + // const char* const aheaderrow[] = {"", "x", "y"}; + + char **headerrow = NULL; + headerrow = new char *[columns]; + + for (unsigned int j = 0; j < columns; ++j) + { + const size_t length = (sizeof aheaderrow / sizeof aheaderrow[0]); + + if (j < (length - 1) or numfunctions == 1) + { + headerrow[j] = new char[strlen(aheaderrow[j]) + 1]; + strcpy(headerrow[j], aheaderrow[j]); + } + else + { + ostringstream strm; + strm << aheaderrow[length - 1] << j - length + 2; + string str = strm.str(); + headerrow[j] = new char[str.length() + 1]; + strcpy(headerrow[j], str.c_str()); + } + } + + char **headercolumn = NULL; + // headercolumn = new char *[rows + 1]; + + // for (unsigned int i = 0; i < rows + 1; ++i) + // { + // ostringstream strm; + // strm << i + 1; + // string str = strm.str(); + // headercolumn[i] = new char[str.length() + 1]; + // strcpy(headercolumn[i], str.c_str()); + // } + + T **array; + array = new T *[rows]; + for (unsigned int i = 0; i < rows; ++i) + array[i] = new T[columns]; + + for (unsigned int i = 0; i < rows; ++i) + { + array[i][0] = (i / xscl) + xmin; + + for (unsigned int j = 0; j < numfunctions; ++j) + array[i][j + 1] = (functions[j])(array[i][0]); + } + + int code = table(rows, columns, array, headerrow, headercolumn, aoptions); + + if (array != NULL) + { + for (unsigned int i = 0; i < rows; ++i) + delete[] array[i]; + + delete[] array; + } + + if (headerrow != NULL) + { + for (unsigned int j = 0; j < columns; ++j) + delete[] headerrow[j]; + + delete[] headerrow; + } + + // if (headercolumn != NULL) + // { + // for (unsigned int i = 0; i < rows + 1; ++i) + // delete[] headercolumn[i]; + + // delete[] headercolumn; + // } + + return code; +} + +// Convert single function to array and output as table +template +int table(const long double xmin, const long double xmax, const long double xscl, T afunction(T), const tableoptions &aoptions) +{ + T(*functions[]) + (T) = {afunction}; + + return table(xmin, xmax, xscl, 1, functions, aoptions); +}