├── .gitignore ├── Exam_rank_03 ├── micro_paint │ ├── Glagan_tester │ │ ├── _our_micro_paint │ │ ├── coutput │ │ ├── example_ │ │ ├── gen │ │ ├── generate_example.cpp │ │ ├── micro_paint │ │ ├── our_micro_paint │ │ ├── our_micro_paint.c │ │ ├── output │ │ └── test.sh │ ├── micro_paint.c │ ├── micro_paint.h │ ├── micro_paint_utils.c │ └── subject │ │ ├── examples │ │ ├── 0 │ │ ├── 1 │ │ ├── 2 │ │ ├── 3 │ │ ├── 4 │ │ ├── 5 │ │ ├── 6 │ │ ├── 7 │ │ └── 8 │ │ ├── micro_paint.png │ │ ├── subject.en.txt │ │ └── subject.fr.txt └── mini_paint │ ├── Glagan_tester │ ├── _our_mini_paint │ ├── coutput │ ├── example_ │ ├── gen │ ├── generate_example.cpp │ ├── mini_paint │ ├── our_mini_paint.c │ ├── output │ └── test.sh │ ├── mini_paint.c │ ├── mini_paint.h │ ├── mini_paint_utils.c │ └── subject │ ├── examples │ ├── 1 │ └── 2 │ ├── subject.en.txt │ └── subject.fr.txt ├── Exam_rank_04 ├── Makefile ├── main.c ├── microshell ├── microshell.c ├── microshell.h ├── subject │ ├── subject.en.txt │ └── subject.fr.txt └── utils.c ├── Exam_rank_05 ├── cpp_module_00 │ ├── Warlock.cpp │ ├── Warlock.hpp │ ├── subject.en.txt │ ├── tester.sh │ └── tests │ │ ├── not_comp_0.cpp │ │ ├── not_comp_1.cpp │ │ ├── not_comp_2.cpp │ │ ├── not_comp_3.cpp │ │ ├── subject_main.cpp │ │ └── subject_output.txt ├── cpp_module_01 │ ├── ASpell.cpp │ ├── ASpell.hpp │ ├── ATarget.cpp │ ├── ATarget.hpp │ ├── Dummy.cpp │ ├── Dummy.hpp │ ├── Fwoosh.cpp │ ├── Fwoosh.hpp │ ├── Warlock.cpp │ ├── Warlock.hpp │ ├── subject.en.txt │ ├── tester.sh │ └── tests │ │ ├── compile.cpp │ │ ├── not_comp_0.cpp │ │ ├── not_comp_1.cpp │ │ ├── not_comp_2.cpp │ │ ├── not_comp_5.cpp │ │ ├── subject_main.cpp │ │ └── subject_output.txt └── cpp_module_02 │ ├── ASpell.cpp │ ├── ASpell.hpp │ ├── ATarget.cpp │ ├── ATarget.hpp │ ├── BrickWall.cpp │ ├── BrickWall.hpp │ ├── Dummy.cpp │ ├── Dummy.hpp │ ├── Fireball.cpp │ ├── Fireball.hpp │ ├── Fwoosh.cpp │ ├── Fwoosh.hpp │ ├── Polymorph.cpp │ ├── Polymorph.hpp │ ├── SpellBook.cpp │ ├── SpellBook.hpp │ ├── TargetGenerator.cpp │ ├── TargetGenerator.hpp │ ├── Warlock.cpp │ ├── Warlock.hpp │ ├── subject.en.txt │ ├── tester.sh │ └── tests │ ├── compile.cpp │ ├── subject_main.cpp │ └── subject_output.txt ├── Exam_rank_06 ├── mini_serv.c └── subject │ ├── main.c │ └── subject.en.txt └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | *.o 2 | *.out 3 | *.dSYM 4 | .DS_Store -------------------------------------------------------------------------------- /Exam_rank_03/micro_paint/Glagan_tester/_our_micro_paint: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adbenoit-9/42_exams/444f36cd1ed51a7c02dd3a7c656f22287fd1a0d3/Exam_rank_03/micro_paint/Glagan_tester/_our_micro_paint -------------------------------------------------------------------------------- /Exam_rank_03/micro_paint/Glagan_tester/coutput: -------------------------------------------------------------------------------- 1 | iiiiiiiiiiiiiiiiiiiiiiiiii 2 | iiiiiiiiiTTTTTTTTTTTTTTTTT 3 | iiiiiiiiiTTTTTTTTTTTTTTTTT 4 | iiiiiiiiiTTTTTTTTTTTTTTTTT 5 | iiiiiiiiiTT}}}}}}}}}}}}}}} 6 | iiiiiiiiiTT}}}}}}}}}}}}}}} 7 | iiiiiiiiiTT}}}}}}}}}}}}}}} 8 | iiiiiiiiiTT}}}}}}}}}}}}}}} 9 | iiiiiiiiiTT}}}}}}}}}}}}}}} 10 | iiiiiiiiiTT}}}}}}}}}}}}}}} 11 | *********TT}}}}}}}}}}}}}}} 12 | **********5}}}}}}}}}}}}}}} 13 | **********5}}}}}}}}}}}}}}} 14 | **********5}}}}}}}}}}}}}}} 15 | **********5}}}}}}}}}}}}}}} 16 | **********5}}}}}}}}}}}}}}} 17 | **********5}}}}}}}}}}}}}}} 18 | **********5}}}}}}}}}}}}}}} 19 | ******uuuuuuuuuuuuuuuuuuuu 20 | ******uuuuuuuuuuuuuuuuuuuu 21 | ******uuuuuuuuuuuuuuuuuuuu 22 | ******uuuuuuuuuuuuuuuuuuuu 23 | ******uuuuuuuuuuuuuuuuuuuu 24 | ******uuuuuuuuuuuuuuuuuuuu 25 | iiiiiiuuuuuuuuuuuuuuuuuuuu 26 | iiiiiiuuuuuuuuuuuuuuuuuuuu 27 | iiiiiiuuuuuuuuuuuuuuuuuuuu 28 | iiiii$uuuuuuuuuuuuuuuuuuuu 29 | iiiii$uuuuuuuuuuuuuuuuuuuu 30 | iiiii$uuuuuuuuuuuuuuuuuuuu 31 | iiiii$uuuuuuuuuuuuuuuuuuuu 32 | iiiii$uuuuuuuuuuuuuuuuuuuu 33 | iiiii$uuuuuuuuuuuuuuuuuuuu 34 | iiiii$uuuuuuuuuuuuuuuuuuuu 35 | iiiii$uuuuuuuuuuuuuuuuuuuu 36 | iiiii$uuuuuuuuuuuuuuuuuuuu 37 | iiiii$uuuuuuuuuuuuuuuuuuuu 38 | iiiiiiuuuuuuuuuuuuuuuuuuuu 39 | iiiiiiuuuuuuuuuuuuuuuuuuuu 40 | iiiiiiuuuuuuuuuuuuuuuuuuuu 41 | iiiiiiuuuuuuuuuuuuuuuuuuuu 42 | iiiiiiuuuuuuuuuuuuuuuuuuuu 43 | iiiiiiuuuuuuuuuuuuuuuuuuuu 44 | iiiiiiuuuuuuuuuuuuuuuuuuuu 45 | iiiiiiuuuuuuuuuuuuuuuuuuuu 46 | iiiiiiuuuuuuuuuuuuuuuuuuuu 47 | iiiiiiuuuuuuuuuuuuuuuuuuuu 48 | iiiiiiuuuuuuuuuuuuuuuuuuuu 49 | iiiiiiuuuuuuuuuuuuuuuuuuuu 50 | iiiiiiuuuuuuuuuuuuuuuuuuuu 51 | iiiiiiuuuuuuuuuuuuuuuuuuuu 52 | iiiiiiiiiiiiiiiiiiiiiiiiii 53 | iiiiiiiiiiiiiiiiiiiiiiiiii 54 | iiiiiiiiiiiiiiiiiiiiiiiiii 55 | iiiiiiiiiiiiiiiiiiiiiiiiii 56 | iiiiiiiiiiiiiiiiiiiiiiiiii 57 | iiiiiiiiiiiiiiiiiiiiiiiiii 58 | iiiiiiiiiiiiiiiiiiiiiiiiii 59 | iiiiiiiiiiiiiiiiiiiiiiiiii 60 | iiiiiiiiiiiiiiiiiiiiiiiiii 61 | iiiiiiiiiiiiiiiiiiiiiiiiii 62 | iiiiiiiiiiiiiiiiiiiiiiiiii 63 | iiiiiiiiiiiiiiiiiiiiiiiiii 64 | iiiiiiiiiiiiiiiiiiiiiiiiii 65 | iiiiiiiiiiiiiiiiiiiiiiiiii 66 | iiiiiiiiiiiiiiiiiiiiiiiiii 67 | iiiiiiiiiiiiiiiiiiiiiiiiii 68 | iiiiiiiiiiiiiiiiiiiiiiiiii 69 | iiiiiiiiiiiiiiiiiiiiiiiiii 70 | iiiiiiiiiiiiiiiiiiiiiiiiii 71 | iiiiiiiiiiiiiiiiiiiiiiiiii 72 | iiiiiiiiiiiiiiiiiiiiiiiiii 73 | iiiiiiiiiiiiiiiiiiiiiiiiii 74 | iiiiiiiiiiiiiiiiiiiiiiiiii 75 | iiiiiiiiiiiiiiiiiiiiiiiiii 76 | iiiiiiiiiiiiiiiiiiiiiiiiii 77 | iiiiiiiiiiiiiiiiiiiiiiiiii 78 | iiiiiiiiiiiiiiiiiiiiiiiiii 79 | iiiiiiiiiiiiiiiiiiiiiiiiii 80 | iiiiiiiiiiiiiiiiiiiiiiiiii 81 | iiiiiiiiiiiiiiiiiiiiiiiiii 82 | iiiiiiiiiiiiiiiiiiiiiiiiii 83 | iiiiiiiiiiiiiiiiiiiiiiiiii 84 | iiiiiiiiiiiiiiiiiiiiiiiiii 85 | iiiiiiiiiiiiiiiiiiiiiiiiii 86 | iiiiiiiiiiiiiiiiiiiiiiiiii 87 | iiiiiiiiiiiiiiiiiiiiiiiiii 88 | iiiiiiiiiiiiiiiiiiiiiiiiii 89 | iiiiiiiiiiiiiiiiiiiiiiiiii 90 | iiiiiiiiiiiiiiiiiiiiiiiiii 91 | iiiiiiii666666666666666666 92 | iiiiiiii6iiiiiiiiiiiiiiiii 93 | iiiiiiii6iiiiiiiiiiiiiiiii 94 | iiiiiiii6iiiiiiiiiiiiiiiii 95 | iiiiiiii6iiiiiiiiiiiiiiiii 96 | iiiiiiii6iiiiiiiiiiiiiiiii 97 | iiiiiiii6iiiiiiiiiiiiiiiii 98 | iiiiiiii6iiiiiiiiiiiiiiiii 99 | iiiiiiii6iiiiiiiiiiiiiiiii 100 | iiiiiiii6iiiiiiiiiiiiiiiii 101 | iiiiiiii6iiiiiiiiiiiiiiiii 102 | iiiiiiii6iiiiiiiiiiiiiiiii 103 | iiiiiiii6iiiiiiiiiiiiiiiii 104 | iiiiiiii6iiiiiiiiiiiiiiiii 105 | iiiiiiii6iiiiiiiiiiiiiiiii 106 | iiiiiiii6iiiiiiiiiiiiiiiii 107 | iiiiiiii6iiiiiiiiiiiiiiiii 108 | iiiiiiii6iiiiiiiiiiiiiiiii 109 | iiiiiiii6iiiiiiiiiiiiiiiii 110 | iiiiiiii6iiiiiiiiiiiiiiiii 111 | iiiiiiii6iiiiiiiiiiiiiiiii 112 | iiiiiiii6iiiiiiiiiiiiiiiii 113 | iiiiiiii6iiiiiiiiiiiiiiiii 114 | iiiiiiii6iiiiiiiiiiiiiiiii 115 | iiiiiiii6iiiiiiiiiiiiiiiii 116 | iiiiiiii6iiiiiiiiiiiiiiiii 117 | iiiiiiii6iiiiiiiiiiiiiiiii 118 | iiiiiiii6iiiiiiiiiiiiiiiii 119 | iiiiiiii6iiiiiiiiiiiiiiiii 120 | iiiiiiii6iiiiiiiiiiiiiiiii 121 | iiiiiiii6iiiiiiiiiiiiiiiii 122 | iiiiiiii6iiiiiiiiiiiiiiiii 123 | iiiiiiii6iiiiiiiiiiiiiiiii 124 | iiiiiiii6iiiiiiiiiiiiiiiii 125 | iiiiiiii6iiiiiiiiiiiiiiiii 126 | iiiiiiii6iiiiiiiiiiiiiiiii 127 | iiiiiiii6iiiiiiiiiiiiiiiii 128 | iiiiiiii6iiiiiiiiiiiiiiiii 129 | iiiiiiii6iiiiiiiiiiiiiiiii 130 | iiiiiiii6iiiiiiiiiiiiiiiii 131 | iiiiiiii6iiiiiiiiiiiiiiiii 132 | iiiiiiii6iiiiiiiiiiiiiiiii 133 | iiiiiiii6iiiiiiiiiiiiiiiii 134 | iiiiiiii6iiiiiiiiiiiiiiiii 135 | iiiiiiii6iiiiiiiiiiiiiiiii 136 | iiiiiiii6iiiiiiiiiiiiiiiii 137 | iiiiiiii6iiiiiiiiiiiiiiiii 138 | iiiiiiii6iiiiiiiiiiiiiiiii 139 | iiiiiiii6iiiiiiiiiiiiiiiii 140 | iiiiiiii6iiiiiiiiiiiiiiiii 141 | iiiiiiii6iiiiiiiiiiiiiiiii 142 | iiiiiiii6iiiiiiiiiiiiiiiii 143 | iiiiiiii6iiiiiiiiiiiiiiiii 144 | iiiiiiii6iiiiiiiiiiiiiiiii 145 | iiiiiiii6iiiiiiiiiiiiiiiii 146 | iiiiiiii6iiiiiiiiiiiiiiiii 147 | iiiiiiii6iiiiiiiiiiiiiiiii 148 | iiiiiiii666666666666666666 149 | iiiiiiiiiiiiiiiiiiiiiiiiii 150 | iiiiiiiiiiiiiiiiiiiiiiiiii 151 | iiiiiiiiiiiiiiiiiiiiiiiiii 152 | iiiiiiiiiiiiiiiiiiiiiiiiii 153 | iiiiiiiiiiiiiiiiiiiiiiiiii 154 | iiiiiiiiiiiiiiiiiiiiiiiiii 155 | iiiiiiiiiiiiiiiiiiiiiiiiii 156 | iiiiiiiiiiiiiiiiiiiiiiiiii 157 | iiiiiiiiiiiiiiiiiiiiiiiiii 158 | iiiiiiiiiiiiiiiiiiiiiiiiii 159 | iiiiiiiiiiiiiiiiiiiiiiiiii 160 | iiiiiiiiiiiiiiiiiiiiiiiiii 161 | iiiiiiiiiiiiiiiiiiiiiiiiii 162 | iiiiiiiiiiiiiiiiiiiiiiiiii 163 | iiiiiiiiiiiiiiiiiiiiiiiiii 164 | iiiiiiiiiiiiiiiiiiiiiiiiii 165 | iiiiiiiiiiiiiiiiiiiiiiiiii 166 | iiiiiiiiiiiiiiiiiiiiiiiiii 167 | iiiiiiiiiiiiiiiiiiiiiiiiii 168 | iiiiiiiiiiiiiiiiiiiiiiiiii 169 | iiiiiiiiiiiiiiiiiiiiiiiiii 170 | iiiiiiiiiiiiiiiiiiiiiiiiii 171 | iiiiiiiiiiiiiiiiiiiiiiiiii 172 | iiiiiiiiiiiiiiiiiiiiiiiiii 173 | iiiiiiiiiiiiiiiiiiiiiiiiii 174 | iiiiiiiiiiiiiiiiiiiiiiiiii 175 | iiiiiiiiiiiiiiiiiiiiiiiiii 176 | iiiiiiiiiiiiiiiiiiiiiiiiii 177 | iiiiiiiiiiiiiiiiiiiiiiiiii 178 | iiiiiiiiiiiiiiiiiiiiiiiiii 179 | iiiiiiiiiiiiiiiiiiiiiiiiii 180 | iiiiiiiiiiiiiiiiiiiiiiiiii 181 | iiiiiiiiiiiiiiiiiiiiiiiiii 182 | iiiiiiiiiiiiiiiiiiiiiiiiii 183 | iiiiiiiiiiiiiiiiiiiiiiiiii 184 | iiiiiiiiiiiiiiiiiiiiiiiiii 185 | iiiiiiiiiiiiiiiiiiiiiiiiii 186 | iiiiiiiiiiiiiiiiiiiiiiiiii 187 | iiiiiiiiiiiiiiiiiiiiiiiiii 188 | iiiiiiiiiiiiiiiiiiiiiiiiii 189 | iiiiiiiiiiiiiiiiiiiiiiiiii 190 | iiiiiiiiiiiiiiiiiiiiiiiiii 191 | iiiiiiiiiiiiiiiiiiiiiiiiii 192 | iiiiiiiiiiiiiiiiiiiiiiiiii 193 | iiiiiiiiiiiiiiiiiiiiiiiiii 194 | iiiiiiiiiiiiiiiiiiiiiiiiii 195 | iiiiiiiiiiiiiiiiiiiiiiiiii 196 | iiiiiiiiiiiiiiiiiiiiiiiiii 197 | iiiiiiiiiiiiiiiiiiiiiiiiii 198 | iiiiiiiiiiiiiiiiiiiiiiiiii 199 | iiiiiiiiiiiiiiiiiiiiiiiiii 200 | iiiiiiiiiiiiiiiiiiiiiiiiii 201 | iiiiiiiiiiiiiiiiiiiiiiiiii 202 | iiiiiiiiiiiiiiiiiiiiiiiiii 203 | iiiiiiiiiiiiiiiiiiiiiiiiii 204 | iiiiiiiiiiiiiiiiiiiiiiiiii 205 | iiiiiiiiiiiiiiiiiiiiiiiiii 206 | iiiiiiiiiiiiiiiiiiiiiiiiii 207 | iiiiiiiiiiiiiiiiiiiiiiiiii 208 | iiiiiiiiiiiiiiiiiiiiiiiiii 209 | iiiiiiiiiiiiiiiiiiiiiiiiii 210 | iiiiiiiiiiiiiiiiiiiiiiiiii 211 | iiiiiiiiiiiiiiiiiiiiiiiiii 212 | iiiiiiiiiiiiiiiiiiiiiiiiii 213 | -------------------------------------------------------------------------------- /Exam_rank_03/micro_paint/Glagan_tester/example_: -------------------------------------------------------------------------------- 1 | 149 63 M 2 | r 11.681216 23.590179 27.904922 13.635566 k 3 | R 51.273163 39.352894 30.488880 7.131500 | 4 | R -95.329536 -76.501335 271.113617 185.279999 q 5 | R 39 18 23 14 ? 6 | r 104 6 168 368 a 7 | R 8 59 15 58 E 8 | r 228.835358 174.251221 225.663483 158.408981 9 | r 276 238 201 99 O 10 | r 49 17 15 43 F 11 | r 278.949371 -75.172958 61.737640 212.150681 - 12 | R 42.570961 63.910229 23.460840 7.035294 t 13 | R 196.111633 123.565796 337.386719 268.291748 B 14 | R 89.128555 276.393433 117.472565 261.606995 o 15 | R 3 62 26 48 c 16 | r 51.884296 45.709293 39.024883 10.273902 \ 17 | R 63.701416 388.706970 224.364670 86.554413 z 18 | r 173.419983 373.085938 74.181137 225.361084 } 19 | r 1.346368 18.756151 10.511327 30.991098 8 20 | R 56.761909 29.025539 20.964977 64.329361 K 21 | r 47.348354 56.009323 27.258181 8.860128 " 22 | R 188.918060 -6.412613 213.011993 287.328705 [ 23 | R 243.104095 -56.318768 24.718348 71.150841 E 24 | R 19.695120 2.603534 47.945705 56.588066 U 25 | r 377 87 192 161 O 26 | R 274.444733 -86.768486 275.386597 322.038818 " 27 | r -58.464531 287.226868 364.561127 352.514435 A 28 | R 28 30 45 4 \ 29 | r 25.104156 8.876881 18.914099 3.248926 [ 30 | r 47.498661 14.001748 30.933050 29.756922 . -------------------------------------------------------------------------------- /Exam_rank_03/micro_paint/Glagan_tester/gen: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adbenoit-9/42_exams/444f36cd1ed51a7c02dd3a7c656f22287fd1a0d3/Exam_rank_03/micro_paint/Glagan_tester/gen -------------------------------------------------------------------------------- /Exam_rank_03/micro_paint/Glagan_tester/generate_example.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* generate_example.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: ncolomer +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2019/11/22 13:09:44 by ncolomer #+# #+# */ 9 | /* Updated: 2019/11/23 16:29:24 by ncolomer ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | 19 | # define FULL_ASCII 0 20 | # define ASCII_RANGE (FULL_ASCII) ? 1 : 32, (FULL_ASCII) ? 255 : 126 21 | # define MODE "rR" 22 | 23 | int 24 | rand_int_range(int min, int max, std::mt19937 &rng) 25 | { 26 | return (std::uniform_int_distribution(min, max)(rng)); 27 | } 28 | 29 | float 30 | rand_float_range(float min, float max, std::mt19937 &rng) 31 | { 32 | return (std::uniform_real_distribution(min, max)(rng)); 33 | } 34 | 35 | int 36 | main(void) 37 | { 38 | FILE* file; 39 | int width, height, background; 40 | int i, nbr_shapes; 41 | int type, color; 42 | float x, y, swidth, sheight; 43 | int size; 44 | 45 | std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count()); 46 | if (!(file = fopen("example_", "w"))) 47 | return (printf("file: fopen error.\n")); 48 | width = rand_int_range(-1, 301, rng); 49 | height = rand_int_range(-1, 301, rng); 50 | background = rand_int_range(ASCII_RANGE, rng); 51 | if (fprintf(file, "%d %d %c\n", width, height, background) < 0) 52 | return (fclose(file) && printf("file: fprintf error.\n")); 53 | 54 | nbr_shapes = rand_int_range(-2, 42, rng); 55 | i = 0; 56 | while (i < nbr_shapes) 57 | { 58 | type = rand_int_range(0, 10000, rng); 59 | if (type == 10000 || type == 0) 60 | type = 'a'; 61 | else if (type >= 5000) 62 | type = 'r'; 63 | else 64 | type = 'R'; 65 | color = rand_int_range(ASCII_RANGE, rng); 66 | if ((size = rand_int_range(0, 100, rng)) >= 25) 67 | { 68 | x = rand_float_range(.001, (float)size, rng); 69 | y = rand_float_range(.001, (float)size, rng); 70 | swidth = rand_float_range(.001, (float)size, rng); 71 | sheight = rand_float_range(.001, (float)size, rng); 72 | } 73 | else 74 | { 75 | x = rand_float_range(-100., 400., rng); 76 | y = rand_float_range(-100., 400., rng); 77 | swidth = rand_float_range(-.90, 400., rng); 78 | sheight = rand_float_range(-.90, 400., rng); 79 | } 80 | if (rand_int_range(0, 100, rng) >= 35) 81 | size = fprintf(file, (++i == nbr_shapes) ? "%c %f %f %f %f %c" : "%c %f %f %f %f %c\n", type, x, y, swidth, sheight, color); 82 | else 83 | size = fprintf(file, (++i == nbr_shapes) ? "%c %d %d %d %d %c" : "%c %d %d %d %d %c\n", type, (int)x, (int)y, (int)swidth, (int)sheight, color); 84 | if (size < 0) 85 | return (fclose(file) && printf("file: fprintf error.\n")); 86 | } 87 | fclose(file); 88 | return (0); 89 | } 90 | -------------------------------------------------------------------------------- /Exam_rank_03/micro_paint/Glagan_tester/micro_paint: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adbenoit-9/42_exams/444f36cd1ed51a7c02dd3a7c656f22287fd1a0d3/Exam_rank_03/micro_paint/Glagan_tester/micro_paint -------------------------------------------------------------------------------- /Exam_rank_03/micro_paint/Glagan_tester/our_micro_paint: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adbenoit-9/42_exams/444f36cd1ed51a7c02dd3a7c656f22287fd1a0d3/Exam_rank_03/micro_paint/Glagan_tester/our_micro_paint -------------------------------------------------------------------------------- /Exam_rank_03/micro_paint/Glagan_tester/our_micro_paint.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | 5 | typedef struct drawing drawing, *Pdrawing; 6 | 7 | struct drawing { 8 | int width; 9 | int height; 10 | char * matrice; 11 | }; 12 | 13 | typedef struct rectangle rectangle, *Prectangle; 14 | 15 | struct rectangle { 16 | char type; 17 | float x; 18 | float y; 19 | float width; 20 | float height; 21 | char color; 22 | }; 23 | 24 | int ft_strlen(char *str) 25 | { 26 | int i; 27 | 28 | i = 0; 29 | while (str[i]) 30 | i++; 31 | return (i); 32 | } 33 | 34 | int get_info(FILE *file, drawing *drawing) 35 | { 36 | char *tmp; 37 | int i; 38 | char background; 39 | 40 | if (fscanf(file, "%d %d %c\n", &drawing->width, &drawing->height, &background) == 3) 41 | { 42 | if ((((drawing->width < 1) || (300 < drawing->width)) || (drawing->height < 1)) || (300 < drawing->height)) 43 | return (1); 44 | tmp = (char *)malloc(drawing->width * drawing->height); 45 | drawing->matrice = tmp; 46 | if (!drawing->matrice) 47 | return (1); 48 | i = 0; 49 | while (i < drawing->width * drawing->height) 50 | drawing->matrice[i++] = background; 51 | return (0); 52 | } 53 | return (1); 54 | } 55 | 56 | int is_in_rectangle(float x, float y, rectangle *rectangle) 57 | { 58 | if ((((x < rectangle->x) || (rectangle->x + rectangle->width < x)) || (y < rectangle->y)) || (rectangle->y + rectangle->height < y)) 59 | return (0); 60 | if (((x - rectangle->x < 1.00000000) || ((rectangle->x + rectangle->width) - x < 1.00000000)) || 61 | ((y - rectangle->y < 1.00000000 || ((rectangle->y + rectangle->height) - y < 1.00000000)))) 62 | return (2); // Border 63 | return (1); // Inside 64 | } 65 | 66 | void execute_one(rectangle *rect, drawing *drawing, int x, int y) 67 | { 68 | int is_in; 69 | 70 | is_in = is_in_rectangle((float)x, (float)y, rect); 71 | if ((is_in == 2) || ((is_in == 1 && (rect->type == 'R')))) 72 | drawing->matrice[x + y * drawing->width] = rect->color; 73 | return; 74 | } 75 | 76 | int apply_op(rectangle *rect,drawing *drawing) 77 | { 78 | int j; 79 | int i; 80 | 81 | if (((rect->width <= 0.00000000) || (rect->height <= 0.00000000)) || ((rect->type != 'R' && (rect->type != 'r')))) 82 | return (1); 83 | i = 0; 84 | while (i < drawing->width) 85 | { 86 | j = 0; 87 | while (j < drawing->height) 88 | execute_one(rect, drawing, i, j++); 89 | i++; 90 | } 91 | return (0); 92 | } 93 | 94 | void print_info(drawing *zone) 95 | { 96 | int i; 97 | 98 | i = 0; 99 | while (i < zone->height) 100 | printf("%.*s\n", zone->width, zone->matrice + i++ * zone->width); 101 | } 102 | 103 | int execute(FILE *file) 104 | { 105 | int scan_ret; 106 | rectangle rect; 107 | drawing drawing; 108 | 109 | if (!get_info(file, &drawing)) 110 | { 111 | scan_ret = fscanf(file,"%c %f %f %f %f %c\n", &rect.type, &rect.x, &rect.y, &rect.width, &rect.height, &rect.color); 112 | while (scan_ret == 6) 113 | { 114 | if (apply_op(&rect, &drawing)) 115 | return (1); 116 | scan_ret = fscanf(file,"%c %f %f %f %f %c\n", &rect.type, &rect.x, &rect.y, &rect.width, &rect.height, &rect.color); 117 | } 118 | if (scan_ret == -1) 119 | { 120 | print_info(&drawing); 121 | return (0); 122 | } 123 | } 124 | return (1); 125 | } 126 | 127 | int main(int argc, char **argv) 128 | { 129 | int i; 130 | FILE *file; 131 | 132 | if (argc == 2) 133 | { 134 | file = fopen(argv[1],"r"); 135 | if (file && !execute(file)) 136 | return 0; 137 | i = ft_strlen("Error: Operation file corrupted\n"); 138 | write(1, "Error: Operation file corrupted\n", i); 139 | } 140 | else 141 | { 142 | i = ft_strlen("Error: argument\n"); 143 | write(1, "Error: argument\n", i); 144 | } 145 | return (1); 146 | } 147 | -------------------------------------------------------------------------------- /Exam_rank_03/micro_paint/Glagan_tester/output: -------------------------------------------------------------------------------- 1 | iiiiiiiiiiiiiiiiiiiiiiiiii 2 | iiiiiiiiiTTTTTTTTTTTTTTTTT 3 | iiiiiiiiiTTTTTTTTTTTTTTTTT 4 | iiiiiiiiiTTTTTTTTTTTTTTTTT 5 | iiiiiiiiiTT}}}}}}}}}}}}}}} 6 | iiiiiiiiiTT}}}}}}}}}}}}}}} 7 | iiiiiiiiiTT}}}}}}}}}}}}}}} 8 | iiiiiiiiiTT}}}}}}}}}}}}}}} 9 | iiiiiiiiiTT}}}}}}}}}}}}}}} 10 | iiiiiiiiiTT}}}}}}}}}}}}}}} 11 | *********TT}}}}}}}}}}}}}}} 12 | **********5}}}}}}}}}}}}}}} 13 | **********5}}}}}}}}}}}}}}} 14 | **********5}}}}}}}}}}}}}}} 15 | **********5}}}}}}}}}}}}}}} 16 | **********5}}}}}}}}}}}}}}} 17 | **********5}}}}}}}}}}}}}}} 18 | **********5}}}}}}}}}}}}}}} 19 | ******uuuuuuuuuuuuuuuuuuuu 20 | ******uuuuuuuuuuuuuuuuuuuu 21 | ******uuuuuuuuuuuuuuuuuuuu 22 | ******uuuuuuuuuuuuuuuuuuuu 23 | ******uuuuuuuuuuuuuuuuuuuu 24 | ******uuuuuuuuuuuuuuuuuuuu 25 | iiiiiiuuuuuuuuuuuuuuuuuuuu 26 | iiiiiiuuuuuuuuuuuuuuuuuuuu 27 | iiiiiiuuuuuuuuuuuuuuuuuuuu 28 | iiiii$uuuuuuuuuuuuuuuuuuuu 29 | iiiii$uuuuuuuuuuuuuuuuuuuu 30 | iiiii$uuuuuuuuuuuuuuuuuuuu 31 | iiiii$uuuuuuuuuuuuuuuuuuuu 32 | iiiii$uuuuuuuuuuuuuuuuuuuu 33 | iiiii$uuuuuuuuuuuuuuuuuuuu 34 | iiiii$uuuuuuuuuuuuuuuuuuuu 35 | iiiii$uuuuuuuuuuuuuuuuuuuu 36 | iiiii$uuuuuuuuuuuuuuuuuuuu 37 | iiiii$uuuuuuuuuuuuuuuuuuuu 38 | iiiiiiuuuuuuuuuuuuuuuuuuuu 39 | iiiiiiuuuuuuuuuuuuuuuuuuuu 40 | iiiiiiuuuuuuuuuuuuuuuuuuuu 41 | iiiiiiuuuuuuuuuuuuuuuuuuuu 42 | iiiiiiuuuuuuuuuuuuuuuuuuuu 43 | iiiiiiuuuuuuuuuuuuuuuuuuuu 44 | iiiiiiuuuuuuuuuuuuuuuuuuuu 45 | iiiiiiuuuuuuuuuuuuuuuuuuuu 46 | iiiiiiuuuuuuuuuuuuuuuuuuuu 47 | iiiiiiuuuuuuuuuuuuuuuuuuuu 48 | iiiiiiuuuuuuuuuuuuuuuuuuuu 49 | iiiiiiuuuuuuuuuuuuuuuuuuuu 50 | iiiiiiuuuuuuuuuuuuuuuuuuuu 51 | iiiiiiuuuuuuuuuuuuuuuuuuuu 52 | iiiiiiiiiiiiiiiiiiiiiiiiii 53 | iiiiiiiiiiiiiiiiiiiiiiiiii 54 | iiiiiiiiiiiiiiiiiiiiiiiiii 55 | iiiiiiiiiiiiiiiiiiiiiiiiii 56 | iiiiiiiiiiiiiiiiiiiiiiiiii 57 | iiiiiiiiiiiiiiiiiiiiiiiiii 58 | iiiiiiiiiiiiiiiiiiiiiiiiii 59 | iiiiiiiiiiiiiiiiiiiiiiiiii 60 | iiiiiiiiiiiiiiiiiiiiiiiiii 61 | iiiiiiiiiiiiiiiiiiiiiiiiii 62 | iiiiiiiiiiiiiiiiiiiiiiiiii 63 | iiiiiiiiiiiiiiiiiiiiiiiiii 64 | iiiiiiiiiiiiiiiiiiiiiiiiii 65 | iiiiiiiiiiiiiiiiiiiiiiiiii 66 | iiiiiiiiiiiiiiiiiiiiiiiiii 67 | iiiiiiiiiiiiiiiiiiiiiiiiii 68 | iiiiiiiiiiiiiiiiiiiiiiiiii 69 | iiiiiiiiiiiiiiiiiiiiiiiiii 70 | iiiiiiiiiiiiiiiiiiiiiiiiii 71 | iiiiiiiiiiiiiiiiiiiiiiiiii 72 | iiiiiiiiiiiiiiiiiiiiiiiiii 73 | iiiiiiiiiiiiiiiiiiiiiiiiii 74 | iiiiiiiiiiiiiiiiiiiiiiiiii 75 | iiiiiiiiiiiiiiiiiiiiiiiiii 76 | iiiiiiiiiiiiiiiiiiiiiiiiii 77 | iiiiiiiiiiiiiiiiiiiiiiiiii 78 | iiiiiiiiiiiiiiiiiiiiiiiiii 79 | iiiiiiiiiiiiiiiiiiiiiiiiii 80 | iiiiiiiiiiiiiiiiiiiiiiiiii 81 | iiiiiiiiiiiiiiiiiiiiiiiiii 82 | iiiiiiiiiiiiiiiiiiiiiiiiii 83 | iiiiiiiiiiiiiiiiiiiiiiiiii 84 | iiiiiiiiiiiiiiiiiiiiiiiiii 85 | iiiiiiiiiiiiiiiiiiiiiiiiii 86 | iiiiiiiiiiiiiiiiiiiiiiiiii 87 | iiiiiiiiiiiiiiiiiiiiiiiiii 88 | iiiiiiiiiiiiiiiiiiiiiiiiii 89 | iiiiiiiiiiiiiiiiiiiiiiiiii 90 | iiiiiiiiiiiiiiiiiiiiiiiiii 91 | iiiiiiii666666666666666666 92 | iiiiiiii6iiiiiiiiiiiiiiiii 93 | iiiiiiii6iiiiiiiiiiiiiiiii 94 | iiiiiiii6iiiiiiiiiiiiiiiii 95 | iiiiiiii6iiiiiiiiiiiiiiiii 96 | iiiiiiii6iiiiiiiiiiiiiiiii 97 | iiiiiiii6iiiiiiiiiiiiiiiii 98 | iiiiiiii6iiiiiiiiiiiiiiiii 99 | iiiiiiii6iiiiiiiiiiiiiiiii 100 | iiiiiiii6iiiiiiiiiiiiiiiii 101 | iiiiiiii6iiiiiiiiiiiiiiiii 102 | iiiiiiii6iiiiiiiiiiiiiiiii 103 | iiiiiiii6iiiiiiiiiiiiiiiii 104 | iiiiiiii6iiiiiiiiiiiiiiiii 105 | iiiiiiii6iiiiiiiiiiiiiiiii 106 | iiiiiiii6iiiiiiiiiiiiiiiii 107 | iiiiiiii6iiiiiiiiiiiiiiiii 108 | iiiiiiii6iiiiiiiiiiiiiiiii 109 | iiiiiiii6iiiiiiiiiiiiiiiii 110 | iiiiiiii6iiiiiiiiiiiiiiiii 111 | iiiiiiii6iiiiiiiiiiiiiiiii 112 | iiiiiiii6iiiiiiiiiiiiiiiii 113 | iiiiiiii6iiiiiiiiiiiiiiiii 114 | iiiiiiii6iiiiiiiiiiiiiiiii 115 | iiiiiiii6iiiiiiiiiiiiiiiii 116 | iiiiiiii6iiiiiiiiiiiiiiiii 117 | iiiiiiii6iiiiiiiiiiiiiiiii 118 | iiiiiiii6iiiiiiiiiiiiiiiii 119 | iiiiiiii6iiiiiiiiiiiiiiiii 120 | iiiiiiii6iiiiiiiiiiiiiiiii 121 | iiiiiiii6iiiiiiiiiiiiiiiii 122 | iiiiiiii6iiiiiiiiiiiiiiiii 123 | iiiiiiii6iiiiiiiiiiiiiiiii 124 | iiiiiiii6iiiiiiiiiiiiiiiii 125 | iiiiiiii6iiiiiiiiiiiiiiiii 126 | iiiiiiii6iiiiiiiiiiiiiiiii 127 | iiiiiiii6iiiiiiiiiiiiiiiii 128 | iiiiiiii6iiiiiiiiiiiiiiiii 129 | iiiiiiii6iiiiiiiiiiiiiiiii 130 | iiiiiiii6iiiiiiiiiiiiiiiii 131 | iiiiiiii6iiiiiiiiiiiiiiiii 132 | iiiiiiii6iiiiiiiiiiiiiiiii 133 | iiiiiiii6iiiiiiiiiiiiiiiii 134 | iiiiiiii6iiiiiiiiiiiiiiiii 135 | iiiiiiii6iiiiiiiiiiiiiiiii 136 | iiiiiiii6iiiiiiiiiiiiiiiii 137 | iiiiiiii6iiiiiiiiiiiiiiiii 138 | iiiiiiii6iiiiiiiiiiiiiiiii 139 | iiiiiiii6iiiiiiiiiiiiiiiii 140 | iiiiiiii6iiiiiiiiiiiiiiiii 141 | iiiiiiii6iiiiiiiiiiiiiiiii 142 | iiiiiiii6iiiiiiiiiiiiiiiii 143 | iiiiiiii6iiiiiiiiiiiiiiiii 144 | iiiiiiii6iiiiiiiiiiiiiiiii 145 | iiiiiiii6iiiiiiiiiiiiiiiii 146 | iiiiiiii6iiiiiiiiiiiiiiiii 147 | iiiiiiii6iiiiiiiiiiiiiiiii 148 | iiiiiiii666666666666666666 149 | iiiiiiiiiiiiiiiiiiiiiiiiii 150 | iiiiiiiiiiiiiiiiiiiiiiiiii 151 | iiiiiiiiiiiiiiiiiiiiiiiiii 152 | iiiiiiiiiiiiiiiiiiiiiiiiii 153 | iiiiiiiiiiiiiiiiiiiiiiiiii 154 | iiiiiiiiiiiiiiiiiiiiiiiiii 155 | iiiiiiiiiiiiiiiiiiiiiiiiii 156 | iiiiiiiiiiiiiiiiiiiiiiiiii 157 | iiiiiiiiiiiiiiiiiiiiiiiiii 158 | iiiiiiiiiiiiiiiiiiiiiiiiii 159 | iiiiiiiiiiiiiiiiiiiiiiiiii 160 | iiiiiiiiiiiiiiiiiiiiiiiiii 161 | iiiiiiiiiiiiiiiiiiiiiiiiii 162 | iiiiiiiiiiiiiiiiiiiiiiiiii 163 | iiiiiiiiiiiiiiiiiiiiiiiiii 164 | iiiiiiiiiiiiiiiiiiiiiiiiii 165 | iiiiiiiiiiiiiiiiiiiiiiiiii 166 | iiiiiiiiiiiiiiiiiiiiiiiiii 167 | iiiiiiiiiiiiiiiiiiiiiiiiii 168 | iiiiiiiiiiiiiiiiiiiiiiiiii 169 | iiiiiiiiiiiiiiiiiiiiiiiiii 170 | iiiiiiiiiiiiiiiiiiiiiiiiii 171 | iiiiiiiiiiiiiiiiiiiiiiiiii 172 | iiiiiiiiiiiiiiiiiiiiiiiiii 173 | iiiiiiiiiiiiiiiiiiiiiiiiii 174 | iiiiiiiiiiiiiiiiiiiiiiiiii 175 | iiiiiiiiiiiiiiiiiiiiiiiiii 176 | iiiiiiiiiiiiiiiiiiiiiiiiii 177 | iiiiiiiiiiiiiiiiiiiiiiiiii 178 | iiiiiiiiiiiiiiiiiiiiiiiiii 179 | iiiiiiiiiiiiiiiiiiiiiiiiii 180 | iiiiiiiiiiiiiiiiiiiiiiiiii 181 | iiiiiiiiiiiiiiiiiiiiiiiiii 182 | iiiiiiiiiiiiiiiiiiiiiiiiii 183 | iiiiiiiiiiiiiiiiiiiiiiiiii 184 | iiiiiiiiiiiiiiiiiiiiiiiiii 185 | iiiiiiiiiiiiiiiiiiiiiiiiii 186 | iiiiiiiiiiiiiiiiiiiiiiiiii 187 | iiiiiiiiiiiiiiiiiiiiiiiiii 188 | iiiiiiiiiiiiiiiiiiiiiiiiii 189 | iiiiiiiiiiiiiiiiiiiiiiiiii 190 | iiiiiiiiiiiiiiiiiiiiiiiiii 191 | iiiiiiiiiiiiiiiiiiiiiiiiii 192 | iiiiiiiiiiiiiiiiiiiiiiiiii 193 | iiiiiiiiiiiiiiiiiiiiiiiiii 194 | iiiiiiiiiiiiiiiiiiiiiiiiii 195 | iiiiiiiiiiiiiiiiiiiiiiiiii 196 | iiiiiiiiiiiiiiiiiiiiiiiiii 197 | iiiiiiiiiiiiiiiiiiiiiiiiii 198 | iiiiiiiiiiiiiiiiiiiiiiiiii 199 | iiiiiiiiiiiiiiiiiiiiiiiiii 200 | iiiiiiiiiiiiiiiiiiiiiiiiii 201 | iiiiiiiiiiiiiiiiiiiiiiiiii 202 | iiiiiiiiiiiiiiiiiiiiiiiiii 203 | iiiiiiiiiiiiiiiiiiiiiiiiii 204 | iiiiiiiiiiiiiiiiiiiiiiiiii 205 | iiiiiiiiiiiiiiiiiiiiiiiiii 206 | iiiiiiiiiiiiiiiiiiiiiiiiii 207 | iiiiiiiiiiiiiiiiiiiiiiiiii 208 | iiiiiiiiiiiiiiiiiiiiiiiiii 209 | iiiiiiiiiiiiiiiiiiiiiiiiii 210 | iiiiiiiiiiiiiiiiiiiiiiiiii 211 | iiiiiiiiiiiiiiiiiiiiiiiiii 212 | iiiiiiiiiiiiiiiiiiiiiiiiii 213 | -------------------------------------------------------------------------------- /Exam_rank_03/micro_paint/Glagan_tester/test.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "> start" 3 | echo "$ compile" 4 | rm -f micro_paint gen 5 | gcc -Wall -Wextra -Werror -lm ../micro_paint.c ../micro_paint_utils.c -I ../ -o micro_paint 6 | gcc -Wall -Wextra -Werror -lm our_micro_paint.c -o _our_micro_paint 7 | g++ -Wall -Wextra -Werror generate_example.cpp -o gen 8 | echo "$ test" 9 | counter=1 10 | max=2 11 | our_res=-1 12 | bad_res=-1 13 | while [ $counter -le $max ] 14 | do 15 | ./gen 16 | if [ $? ] 17 | then 18 | sleep .01 19 | ./_our_micro_paint example_ > coutput 2>&1 20 | our_res=$? 21 | ./micro_paint example_ > output 2>&1 22 | bad_res=$? 23 | if [ $our_res -ne $bad_res ] 24 | then 25 | printf "\n: different return result, our \e[1;31m$our_res\e[0m and yours \e[1;32m$bad_res\e[0m !\n" 26 | exit 1 27 | fi 28 | diff -y --suppress-common-lines coutput output 29 | if [ $? -ne 0 ] 30 | then 31 | printf "\e[1;31m: difference in output, coutput is our, output yours and the example is in example_ !\e[0m\n" 32 | exit 2 33 | fi 34 | if ! (( counter % 50 )) 35 | then 36 | printf "\e[1;34m[$counter]\e[0m" 37 | fi 38 | if [ $our_res -ne 0 ] 39 | then 40 | printf "\e[1;33m$our_res\e[0m" 41 | else 42 | printf "\e[1;32m$our_res\e[0m" 43 | fi 44 | fi 45 | ((max++)) 46 | ((counter++)) 47 | done 48 | rm -rf gen micro_paint example_ output coutput 49 | printf "\n> done" 50 | -------------------------------------------------------------------------------- /Exam_rank_03/micro_paint/micro_paint.c: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* micro_paint.c :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/01/13 13:41:08 by adbenoit #+# #+# */ 9 | /* Updated: 2021/01/14 12:29:24 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "micro_paint.h" 14 | 15 | static int init_paint(char **paint, t_zone zone) 16 | { 17 | int i; 18 | 19 | if (!paint) 20 | return (1); 21 | i = 0; 22 | while (i < zone.h) 23 | { 24 | if (!(paint[i] = calloc(1, zone.w + 1))) 25 | return (1); 26 | memset(paint[i], zone.bc, zone.w); 27 | ++i; 28 | } 29 | paint[i] = 0; 30 | return (0); 31 | } 32 | 33 | static int is_in_rect(float x, float y, t_draw draw) 34 | { 35 | float xbr; 36 | float ybr; 37 | 38 | xbr = draw.x + draw.w; 39 | ybr = draw.y + draw.h; 40 | if (x >= draw.x && x <= xbr && y >= draw.y && y <= ybr) 41 | { 42 | if (x - draw.x < 1.0 || xbr - x < 1.0 || y - draw.y < 1.0 43 | || ybr - y < 1.0) 44 | return (0); 45 | return (1); 46 | } 47 | return (-1); 48 | } 49 | 50 | static void draw_rect(t_zone zone, t_draw draw, char **paint) 51 | { 52 | int i; 53 | int j; 54 | int k; 55 | 56 | i = 0; 57 | while (i < zone.h) 58 | { 59 | j = 0; 60 | while (j < zone.w) 61 | { 62 | k = is_in_rect(j, i, draw); 63 | if (k == 0 || (k == 1 && draw.type == 'R')) 64 | paint[i][j] = draw.c; 65 | ++j; 66 | } 67 | ++i; 68 | } 69 | 70 | } 71 | 72 | static int drawing(FILE *stream, t_zone zone) 73 | { 74 | int ret; 75 | char **paint; 76 | t_draw draw; 77 | char n; 78 | 79 | paint = (char **)malloc(sizeof(char *) * (zone.h + 1)); 80 | if (init_paint(paint, zone) == 1) 81 | return (ft_freetab(paint)); 82 | draw.type = 0; 83 | while ((ret = fscanf(stream, "%c%c %f %f %f %f %c", &n, &draw.type, 84 | &draw.x, &draw.y, &draw.w, &draw.h, &draw.c)) == 7) 85 | { 86 | if ((draw.type != 'r' && draw.type != 'R') || draw.h <= 0.0 87 | || draw.w <= 0.0 || n != '\n'|| draw.c == 0 || draw.c == '\n') 88 | return (ft_freetab(paint)); 89 | draw_rect(zone, draw, paint); 90 | draw.type = 0; 91 | } 92 | if (draw.type != 0 && ret != -1) 93 | return (ft_freetab(paint)); 94 | ft_puttab(paint); 95 | ft_freetab(paint); 96 | return (0); 97 | } 98 | 99 | static int get_info(FILE *stream, t_zone *zone) 100 | { 101 | int ret; 102 | 103 | ret = fscanf(stream, "%d %d %c", &zone->w, &zone->h, &zone->bc); 104 | if (zone->h <= 0 || zone->h > 300 || zone->w <= 0 || zone->w > 300 105 | || zone->bc == 0 || zone->bc == '\n') 106 | return (1); 107 | return (0); 108 | } 109 | 110 | int main(int ac, char **av) 111 | { 112 | FILE *stream; 113 | t_zone zone; 114 | 115 | if (ac != 2) 116 | return (ft_putstr("Error: argument\n")); 117 | if(!(stream = fopen(av[1], "r"))) 118 | return (ft_putstr("Error: Operation file corrupted\n")); 119 | if (get_info(stream, &zone) == 1) 120 | return (ft_putstr("Error: Operation file corrupted\n")); 121 | if (drawing(stream, zone) == 1) 122 | return (ft_putstr("Error: Operation file corrupted\n")); 123 | fclose(stream); 124 | return (0); 125 | } -------------------------------------------------------------------------------- /Exam_rank_03/micro_paint/micro_paint.h: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* micro_paint.h :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/01/13 13:42:50 by adbenoit #+# #+# */ 9 | /* Updated: 2021/01/13 14:12:37 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #ifndef MICRO_PAINT_H 14 | # define MICRO_PAINT_H 15 | 16 | # include 17 | # include 18 | # include 19 | # include 20 | # include 21 | 22 | typedef struct s_zone 23 | { 24 | int w; 25 | int h; 26 | char bc; 27 | } t_zone; 28 | 29 | typedef struct s_draw 30 | { 31 | char type; 32 | char c; 33 | float x; 34 | float y; 35 | float h; 36 | float w; 37 | } t_draw; 38 | 39 | int ft_strlen(char *str); 40 | int ft_putstr(char *str); 41 | void ft_puttab(char **tab); 42 | int ft_freetab(char **tab); 43 | 44 | #endif -------------------------------------------------------------------------------- /Exam_rank_03/micro_paint/micro_paint_utils.c: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* micro_paint_utils.c :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/01/13 13:43:07 by adbenoit #+# #+# */ 9 | /* Updated: 2021/01/13 13:43:13 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "micro_paint.h" 14 | 15 | int ft_strlen(char *str) 16 | { 17 | int i; 18 | 19 | i = 0; 20 | while (str[i]) 21 | ++i; 22 | return (i); 23 | } 24 | 25 | int ft_putstr(char *str) 26 | { 27 | write(1, str, ft_strlen(str)); 28 | return (1); 29 | } 30 | 31 | void ft_puttab(char **tab) 32 | { 33 | int i; 34 | 35 | i = 0; 36 | while (tab[i]) 37 | { 38 | ft_putstr(tab[i]); 39 | write(1, "\n", 1); 40 | ++i; 41 | } 42 | } 43 | 44 | int ft_freetab(char **tab) 45 | { 46 | int i; 47 | 48 | i = 0; 49 | while (tab[i]) 50 | { 51 | free(tab[i]); 52 | ++i; 53 | } 54 | free(tab); 55 | return (1); 56 | } 57 | -------------------------------------------------------------------------------- /Exam_rank_03/micro_paint/subject/examples/0: -------------------------------------------------------------------------------- 1 | 100 100 , -------------------------------------------------------------------------------- /Exam_rank_03/micro_paint/subject/examples/1: -------------------------------------------------------------------------------- 1 | 5 3 . 2 | r 2.5 1.5 1 1 X -------------------------------------------------------------------------------- /Exam_rank_03/micro_paint/subject/examples/2: -------------------------------------------------------------------------------- 1 | 100 100 , 2 | R 17.45 60.86 100.3 80.55 o 3 | r 17.45 60.86 100.3 80.55 $ 4 | r 35.135 76.91 39.12 42.5 I 5 | R 35.135 76.91 39.12 42.5 _ 6 | r 15.5 12.5 10.2 5.41 O 7 | R -5 -8 15 12 @ 8 | R 100 100 300 1000 \ -------------------------------------------------------------------------------- /Exam_rank_03/micro_paint/subject/examples/3: -------------------------------------------------------------------------------- 1 | 10 10 , 2 | r 1 1 3.01 3 j -------------------------------------------------------------------------------- /Exam_rank_03/micro_paint/subject/examples/4: -------------------------------------------------------------------------------- 1 | 217 292 e 2 | r 77 62 75 13 } 3 | r -38.520359 188.332764 7.157817 66.482018 B 4 | r 73.800674 -32.050583 20.716619 343.611237 < 5 | r -46 0 216 246 I 6 | r 66.876938 100.818924 130.981689 322.192200 H 7 | r 60.385437 -1.899094 225.519257 375.371429 | 8 | r 59.053360 61.718555 55.722382 13.846536 l 9 | r 50.204052 14.090234 18.235579 9.151034 @ 10 | r 375 87 167 165 Z 11 | r 73.541084 82.661156 70.003815 52.791901 < 12 | r 36 16 66 42 ? 13 | r 76.704247 12.211145 55.285141 74.853493 A 14 | r 385.401733 47.416901 108.772667 264.611969 B 15 | r 23.105032 60.171700 7.589799 59.265453 ] 16 | r 372 220 310 300 . 17 | r -91.430481 -72.160027 325.137512 217.906143 S 18 | r 9.568840 46.092941 35.751064 43.576378 B 19 | r 144 37 320 309 ( 20 | r 38.894196 29.789022 30.976677 15.901771 i 21 | r 250.240417 391.157867 312.630829 23.433510 - 22 | r 48.795258 202.063141 220.469940 313.709930 ' 23 | r 12.250774 88.303474 22.391188 49.394497 d 24 | r 176.229279 -14.527222 32.827801 291.107849 j 25 | r 23.919907 21.008120 32.522327 2.203353 d 26 | r -61.095886 261.490021 50.582951 294.448608 h 27 | r 26.690733 12.316304 16.820597 12.595391 @ 28 | r 151.020691 304.820312 251.939529 10.035322 9 29 | r 8 5 29 13 a 30 | r 37.019852 55.792469 15.592926 20.952156 h 31 | r 59.076317 63.501205 0.769014 59.154881 1 32 | r -90.213898 374.977051 351.844391 269.541656 + 33 | r 73.475143 21.689898 40.953438 28.644855 > -------------------------------------------------------------------------------- /Exam_rank_03/micro_paint/subject/examples/5: -------------------------------------------------------------------------------- 1 | 20 20 e 2 | r 77 62 75 13 } 3 | r -38.520359 188.332764 7.157817 66.482018 B 4 | r 73.800674 -32.050583 20.716619 343.611237 < 5 | r -1 -1 3 3 I 6 | r -2 -2 3 3 L 7 | r -2 -1 3 3 J 8 | r -1 -2 3 3 K 9 | r -1 -3 3 3 P 10 | r -2 -3 3 3 I 11 | r 60.385437 -1.899094 225.519257 375.371429 | -------------------------------------------------------------------------------- /Exam_rank_03/micro_paint/subject/examples/6: -------------------------------------------------------------------------------- 1 | 160 41 Y 2 | r 27 56 33 28 = 3 | r 298.476654 97.439362 290.741394 136.565689 | 4 | r 170 -22 204 295 | 5 | r 104.628738 95.535599 293.736755 78.670204 3 6 | r 1.01 7.537012 40.109295 49.569710 ' 7 | r 94.110725 96.830009 33.864655 76.144783 ^ 8 | r -9.919762 378.645966 82.341591 48.740616 . 9 | r -89 349 247 378 . 10 | r 19.120731 67.835785 27.784399 13.307995 m 11 | r 63.207596 -69.879059 194.145905 296.628052 c 12 | r 57.391319 26.565788 22.126339 14.181762 J 13 | r 231.050201 360.986603 241.503357 213.363464 _ 14 | r 3.620598 -48.540524 303.564423 48.250889 ' 15 | r 148.986130 110.059036 369.994598 112.125191 . 16 | r 62 -81 170 125 a 17 | r 360 0 316 263 ? 18 | r 55 57 2 55 e 19 | r 314 341 214 192 } 20 | r 14 1 9 40 } 21 | r 9.772509 53.179295 24.323938 11.505808 D 22 | r 24.614918 57.790016 50.347771 25.440958 e 23 | r 306.195312 324.874786 296.842926 282.834167 V 24 | r 36 18 27 22 k 25 | r -81 209 64 272 * 26 | r 121.266815 231.474457 73.108612 73.765175 E 27 | r 374.699524 175.541382 19.516144 167.696487 1 28 | r 78.528572 55.715405 21.354914 13.824533 \ 29 | r 33.610474 -8.489433 14.572325 279.003052 z 30 | r 16 6 73 20 # 31 | r 260 279 333 16 & 32 | r 225.992798 361.306213 139.401566 231.564575 [ 33 | r 68.720245 81.462509 272.325836 234.095978 _ 34 | r 147 -75 349 20 q 35 | r -71 363 133 35 w 36 | r -1 -86 57 104 d 37 | r 16.669809 8.175250 39.904060 26.719580 M 38 | r 32.259487 24.266792 42.846931 55.666046 \ 39 | r 69.329460 20.119007 38.939163 74.726807 R -------------------------------------------------------------------------------- /Exam_rank_03/micro_paint/subject/examples/7: -------------------------------------------------------------------------------- 1 | 160 41 Y 2 | r 3.620598 -48.540524 303.564423 48.250889 ' -------------------------------------------------------------------------------- /Exam_rank_03/micro_paint/subject/examples/8: -------------------------------------------------------------------------------- 1 | 297 298 b 2 | r 325 295 273 326 j 3 | r 188.080078 162.359833 385.567444 238.466751 n 4 | r -45 177 129 56 @ 5 | r 380.579987 7.887222 208.546524 321.722870 ` 6 | r 62 32 7 14 . 7 | r 198.470490 293.862823 122.297478 370.559113 ! 8 | r 27.429260 42.471390 55.848068 77.963387 ] 9 | r 93.360092 203.241913 69.646553 288.477997 e 10 | r 14.698265 16.510256 6.687268 55.442657 ) 11 | r 122 312 250 288 o 12 | r 388 291 30 285 o 13 | r 331 324 8 281 % 14 | r -91.057793 191.647217 171.820190 277.907776 / 15 | r -14 312 5 347 P 16 | r 88.132317 39.657551 23.475546 52.240532 o 17 | r 213 278 223 295 { 18 | r 71.351402 60.645622 83.367340 16.618242 q 19 | r 75 -90 366 91 T 20 | r 219.744263 342.164642 369.163422 142.636002 = -------------------------------------------------------------------------------- /Exam_rank_03/micro_paint/subject/micro_paint.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adbenoit-9/42_exams/444f36cd1ed51a7c02dd3a7c656f22287fd1a0d3/Exam_rank_03/micro_paint/subject/micro_paint.png -------------------------------------------------------------------------------- /Exam_rank_03/micro_paint/subject/subject.en.txt: -------------------------------------------------------------------------------- 1 | Assignment name : micro_paint 2 | Expected files : *.c *.h 3 | Allowed functions: fopen, fread, fscanf, fclose, write, malloc, calloc, realloc, free, memset, powf, sqrtf 4 | -------------------------------------------------------------------------------------- 5 | 6 | Write a program that will read an "operation file" and print the result in the terminal 7 | 8 | Your program must take one argument, it will be the path to the "operation file" 9 | If 0 or more than 1 argument is given to your program write "Error: argument" followed by a \n in STDOUT 10 | 11 | $> ./micro_paint | cat -e 12 | Error: argument$ 13 | $> ./micro_paint do not fear mathematics | cat -e 14 | Error: argument$ 15 | $> 16 | 17 | If any problem occurs while you open and/or read the "operation file" write "Error: Operation file corrupted" followed by a \n in STDOUT 18 | 19 | The "operation file" will contains lines with one operation per line 20 | If a line is incorrect an error occurs. 21 | If an error has occured your program must return 1 22 | If no error has occured it must return 0 23 | The last line can be with or without a \n 24 | The lines must be read in order and therefore operations must be executed in the same order 25 | There must be one space between each variable in a line 26 | 27 | WIDTH HEIGHT BACKGROUND_CHAR 28 | This line is always the first line of the file and it defines the zone where to draw. Your program should not display anything outside the draw zone. It must be there only once. 29 | - WIDTH: must be a int with 0 < WIDTH <= 300, the horizontal number of characters to use for the draw zone 30 | - HEIGHT: must be a int with 0 < HEIGHT <= 300, the vertical number of characters to use for the draw zone 31 | - BACKGROUND_CHAR: any empty space will be filled with BACKGROUND_CHAR 32 | 33 | r X Y WIDTH HEIGHT CHAR 34 | This operation will draw an empty rectangle, where only the border of the rectangle is drawn 35 | - r: the character r 36 | - X: any float, the horizontal position of the top left corner of the rectangle 37 | - Y: any float, the vertical position of the top left corner of the rectangle 38 | - WIDTH: a positive float but not 0, the width of the rectangle (horizontal) 39 | - HEIGHT: a positive float but not 0, the height of the rectangle (vertical) 40 | - CHAR: the char use to draw the rectangle 41 | 42 | R X Y WIDTH HEIGHT CHAR 43 | This operation will draw a filled rectangle 44 | - R: the character R 45 | - X: any float, the horizontal position of the top left corner of the rectangle 46 | - Y: any float, the vertical position of the top left corner of the rectangle 47 | - WIDTH: a positive float but not 0, the width of the rectangle (horizontal) 48 | - HEIGHT: a positive float but not 0, the height of the rectangle (vertical) 49 | - CHAR: the char use to draw the rectangle 50 | 51 | The draw zone is divided in rectangles that can contain one character each (because we are in a terminal...), we will call them pixel 52 | To make everything easier, we will use only the top left corner of the pixel to know if that pixel is in a rectangle or not 53 | A pixel with a top left corner with a distance bigger or equal than 1 from the border of a rectangle is not part of an empty rectangle 54 | A pixel with a top left corner with a distance lower than 1 from the border of a rectangle is part of an empty rectangle. 55 | 56 | You should look at the image while reading the next few lines. It represents a terminal. We've set a draw zone of WIDTH 5 and HEIGHT 3. 57 | We've wrote different character to help you understand the following explanations. 58 | - If you want to draw the operation: r 2.5 1.5 1 1 X (the green rectangle) 59 | -- it means that the character 'D' in the image will be replaced by 'X' 60 | 61 | You should find our_micro_paint to help you test yours with some operation_file.example 62 | 63 | Hint: 64 | If a point is defined as (Xa, Ya) 65 | And a rectangle with a top left corner (Xtl, Ytl) and a bottom right corner (Xbr, Ybr) 66 | If Xtl <= Xa <= Xbr and Ytl <= Ya <= Ybr then the point is in the rectangle -------------------------------------------------------------------------------- /Exam_rank_03/micro_paint/subject/subject.fr.txt: -------------------------------------------------------------------------------- 1 | Assignment name : micro_paint 2 | Expected files : *.c *.h 3 | Allowed functions: fopen, fread, fscanf, fclose, write, malloc, calloc, realloc, free, memset, powf, sqrtf 4 | -------------------------------------------------------------------------------------- 5 | 6 | Ecrire un programme qui prendra en parametre un "fichier d'operations" et affichera le resultat dans le terminal 7 | 8 | Votre programme ne prendra qu un seul argument, ce sera le chemin vers le "fichier d'operations" 9 | Si votre programme recoit 0 ou plus de 1 argument il devra afficher "Error: argument" suivi d'un \n dans STDOUT 10 | 11 | $> ./micro_paint | cat -e 12 | Error: argument$ 13 | $> ./micro_paint do not fear mathematics | cat -e 14 | Error: argument$ 15 | $> 16 | 17 | Si votre programme rencontre un probleme quand il ouvre ou bien lit le "fichier d'operation", il devra écrire "Error: Operation file corrupted" suivi d'un \n dans STDOUT 18 | 19 | Le "fichier d'operation" sera composé d'une opération par ligne 20 | Si une ligne n'est pas correct, alors c'est qu'un probleme vient d'avoir lieu 21 | Si votre programme à un probleme il doit renvoyer 1 22 | Si votre programme n'a pas rencontré de probleme, il doit renvoyer 0 23 | La derniere ligne du fichier ne sera pas forcement terminer par un \n 24 | Les lignes doivent etre lu dans l'ordre et par consequent les operations doivent etre executer dans le meme ordre 25 | Il doit n'y avoir qu'un espace entre chaque variable d'une ligne 26 | 27 | WIDTH HEIGHT BACKGROUND_CHAR 28 | Cette ligne sera toujours la premiere ligne du fichier et elle definie la zone dites "de dessin". Votre programme ne devrait rien afficher en dehors de cette "zone de dessin". Cette ligne ne sera presente qu une fois. 29 | - WIDTH: doit etre un int tel que 0 < WIDTH <= 300, C est le nombre de caractères horizontaux utilisés pour la zone de dessin 30 | - HEIGHT: doit etre un int tel que 0 < HEIGHT <= 300, C est le nombre de caractères verticaux utilisés pour la zone de dessin 31 | - BACKGROUND_CHAR: Par defaut toutes la "zone de dessin" est rempli avec BACKGROUND_CHAR 32 | 33 | r X Y WIDTH HEIGHT CHAR 34 | Cette operation fera dessiné un rectangle vide, ou seulement la bordure du rectangle est dessinée 35 | - r: le caractère r 36 | - X: un float, la position horizontale du coin en haut a gauche du rectangle 37 | - Y: un float, la position verticale du coin en haut a gauche du rectangle 38 | - WIDTH: un float positif different de 0, la largeur du cercle (horizontale) 39 | - HEIGHT: un float positif different de 0, la hauteur du cercle (verticale) 40 | - CHAR: un char, le caractère utilisé pour dessiner le rectangle 41 | 42 | R X Y WIDTH HEIGHT CHAR 43 | Cette operation fera dessiné un rectangle plein 44 | - R: le caractère R 45 | - X: un float, la position horizontale du coin en haut a gauche du rectangle 46 | - Y: un float, la position verticale du coin en haut a gauche du rectangle 47 | - WIDTH: un float positif different de 0, la largeur du cercle (horizontale) 48 | - HEIGHT: un float positif different de 0, la hauteur du cercle (verticale) 49 | - CHAR: un char, le caractère utilisé pour dessiner le rectangle 50 | 51 | La "zone de dessin" est divisé en rectangle qui peuvent chacun contenir un seul caractère (c'est parce qu'on est dans un terminal...) nous les appelerons pixel 52 | Pour faciliter les calculs nous n'utiliserons que le coin en haut à gauche d'un pixel pour savoir si celui ci est dans un rectangle ou pas 53 | Si le coin en haut a gauche d'un pixel est à une distance superieure ou egale à 1 de la bordure d un rectangle celui ci ne fait pas parti d'un rectangle vide 54 | Si le coin en haut a gauche d'un pixel est à une distance inferieur à 1 de la bordure d'un rectangle, il fait alors parti d'un rectangle vide 55 | 56 | Vous devriez regarder l'image fournie tout en lisant les prochaines lignes. Cette image represente le terminal. Nous avons fait une "zone de dessin" avec un WIDTH à 5 et une HEIGHT à 3 57 | Nous avons écrit une lettre différente par caractère dans la "zone de dessin" afin de faciliter les explications. 58 | - Si vous voulez effectuer l'operation: r 2.5 1.5 1 1 X (le rectangle vert) 59 | -- Cela fera que le caractère 'D' dans l'image sera remplacés par 'X' 60 | 61 | Vous trouverez our_micro_paint afin de vous aider à tester ainsi que des fichiers operation_file.example 62 | 63 | Astuce: 64 | Si 1 point est définis par (Xa, Ya) 65 | Et qu'un rectangle est defini par son coin en haut a gauche (Xtl, Ytl) et son coin en bas a droite (Xbr, Ybr) 66 | If Xtl <= Xa <= Xbr and Ytl <= Ya <= Ybr alors le point est dans le rectangle -------------------------------------------------------------------------------- /Exam_rank_03/mini_paint/Glagan_tester/_our_mini_paint: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adbenoit-9/42_exams/444f36cd1ed51a7c02dd3a7c656f22287fd1a0d3/Exam_rank_03/mini_paint/Glagan_tester/_our_mini_paint -------------------------------------------------------------------------------- /Exam_rank_03/mini_paint/Glagan_tester/coutput: -------------------------------------------------------------------------------- 1 | UUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSSSSSSSSSSOSSSSSSSSSScccccccccccccccccIccccccAAAAAAAAAAAAAAA22AAAAAAAAAAAAAlAAAAKKKKKKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 2 | UUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSSSSSSSSSOSSSSSSSSScccccccccccccccccIcccccccAAAAAAAAAAAAAA2AAAAAAAAAAAAAAlAAAAAKKKKKKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 3 | UUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSSSSSSSSSOSSSSSSSSScccccccccccccccccIcccccccAAAAAAAAAAAA2AAAAAAAAAAAAAAAAlAAAAAKKKKKKKKKKKK33KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 4 | UUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSSSSSSSSSOSSSSSSSScccccccccccccccccIcccccccccAAAAAAAAA2AAAAAAAAAAAAAAAAlAAAAAAAKKKKKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 5 | UUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSSSSSSSOSSSSSSSScccccccccccccccccIccccccccccAAAAAAA2AAAAAAAAAAAAAAAAAlAAAAAAAAAKKKKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 6 | UUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSSSSSSSOSSSSSSScccccccccccccccccIcccccccccccAAAAA2AAAAAAAAAAAAAAAAAAlAAAAAAAAAAKKKKKKKKKK33KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 7 | UUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSSSSSSSOOSSSSSScccccccccccccccccIccccccccccccAAA2AAAAAAAAAAAAAAAAAAAlAAAAAAAAAAAKKKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 8 | UUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSSSSSSSOSSSSSScccccccccccccccccIcccccccccccccA22AAAAAAAAAAAAAAAAAAAlAAAAAAAAAAAKKKKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 9 | UUUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSSSSSSSOSSSSScccccccccccccccccIccccccccccccc22AAAAAAAAAAAAAAAAAAAAlAAAAAAAAAAAAKKKKKKKKKK33KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 10 | UUUUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSSSSSSOSSSSS/ccccccccccccccccIccccccccccccc2cAAAAAAAAAAAAAAAAAAAAlAAAAAAAAAAAAAKKKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 11 | UUUUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSSSSSSOSSSSS//ccccccccccccccccIccccccccccc2cccAAAAAAAAAAAAAAAAAAAlAAAAAAAAAAAAAAKKKKKKKKK33KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 12 | UUUUUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSSSSSSOSSSS///ccccccccccccccIccccccccccc2cccccAAAAAAAAAAAAAAAAAAlAAAAAAAAAAAAAAAKKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 13 | UUUUUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSSSSSSOSSSS////cccccccccccccIcccccccccc2ccccccAAAAAAAAAAAAAAAAAAlAAAAAAAAAAAAAAAKKKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 14 | UUUUUUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSSSSSOSSSS/////ccccccccccccIccccccccc22cccccccAAAAAAAAAAAAAAAAAlAAAAAAAAAAAAAAAAKKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 15 | UUUUUUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSSSSSSOSS///////cccccccccccIcccccccc22cccccccccAAAAAAAAAAAAAAAAlAAAAAAAAAAAAAAAAAKKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 16 | UUUUUUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSSSSSSOSS////////ccccccccccIcccccccc2cccccccccccAAAAAAAAAAAAAdlddddddddddddddddddddddddddd3dddddddKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 17 | UUUUUUUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSSSSSOSS/////////cccccccccIccccccc2ccccccccccccdddddddddddddAlAAAAAAAAAAAAAAAAAAAKKKKKKKK33KKKKKKddddddddddddddKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 18 | UUUUUUUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSSSSSOSS//////////ccccccccIcccccc2ccccccccccccccAAAAAAAAAAAAAlAAAAAAAAAAAAAAAAAAAAKKKKKKKK3KKKKKKKKKKKKKKKKKKKKddddddddddKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 19 | UUUUUUUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSSSSSOS////////////cccccccIccccc22cccccccccccccccAAAAAAAAAAAAlAAAAAAAAAAAAAAAAAAAAKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKdddddddKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 20 | UUUUUUUUUUUUUUUUUUUUUUUUUUUUUvvvvvvvvvvvvvvvvvvvvOvvvvvvvvv////ccccccIcccccc2ccccccccccccccccAAAAAAAAAAAAlAAAAAAAAAAAAAAAAAAAAAKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKdddddddKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 21 | UUUUUUUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSSSSSO/////////vvvvvvvvvvIccccc2ccccccccccccccccccAAAAAAAAAAllAAAAAAAAAAAAAAAAAAAAAKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKddddddKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 22 | UUUUUUUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSSSSSSO//////////////ccccIvvvvvvvvvcccccccccccccccAAAAAAAAAAlAAAAAAAAAAAAAAAAAAAAAAAKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKdddddKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 23 | UUUUUUUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSSSSSO///////////////ccccIccc22cccvvvvvvvccccccccccAAAAAAAAAlAAAAAAAAAAAAAAAAAAAAAAAKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKddddddKKKKKKKKKKKKKKKKKKKKKKKKKK 24 | UUUUUUUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSSSS/O////////////////ccIcccc2cccccccccccvvvvvvccccAAAAAAAAAlAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKdddddKKKKKKKKKKKKKKKKKKKKKK 25 | UUUUUUUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSSSS/O////////////////ccIccc2ccccccccccccccccccvvvvvvAAAAAAlAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKdddddKKKKKKKKKKKKKKKKK 26 | UUUUUUUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSSS//O/////////////////IIcc2ccccccccccccccccccccccccvvvvvAAlAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKdddddKKKKKKKKKKKKK 27 | UUUUUUUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSSS///O/////////////////Icc22cccccccccccccccccccccccccAAAAvvvvvAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKddddKKKKKKKKK 28 | UUUUUUUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSSS////O////////////////IIcc2ccccccccccccccccccccccccccAAAAAAlAAvvvvAAAAAAAAAAAAAAAAAAAAKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKddddKKKKK 29 | UUUUUUUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSS/////O////////////////I/c2ccccccccccccccccccccccccccccAAAAlAAAAAAAvvvvAAAAAAAAAAAAAAAAAKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKddddKK 30 | UUUUUUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSSS/////O////////////////II/2cccccccccccccccccccccccccccccAAAAlAAAAAAAAAAAvvvvAAAAAAAAAAAAAKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKdd 31 | UUUUUUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSSSS//////O////////////////I///cccccccccccccccccccccccccccccAAAAlAAAAAAAAAAAAAAAvvvAAAAAAAAAAKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 32 | IUUUUUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSSS////////O///////////////I////ccccccccccccccccccccccccccccccAAlAAAAAAAAAAAAAAAAAAAvvvvAAAAAAAKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 33 | IIUUUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSSSS/////////O///////////////II////ccccccccccccccccccccccccccccccAAlAAAAAAAAAAAAAAAAAAAAAAAvvvAAAAKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 34 | UIUUUUUUUUUUUUUUUUUUUUUUUUUSSSSSSSSS///////////O///////////////I//////cccccccccccccccccccccccccccccAlAAAAAAAAAAAAAAAAAAAAAAAAAAAvvvAKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 35 | UUIUUUUUUUUUUUUUUUUUUUUUUUSSSSSSS//////////////O//////////////I///////cccccccccccccccccccccccccccccclAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAvvvKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 36 | UUUIUUUUUUUUUUUUUUUUUUUUU/////////////////////O//////////////I////////cccccccccccccccccccccccccccccllAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKvvvKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 37 | UUUIIUUUUUUUUUUUUUUUUUUUU////////////////////OO/////////////II////////ccccccccccccccccccccccccccccclAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKvvvKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 38 | UUUUIIUUUUUUUUUUUUUUUUUU/////////////////////O/////////////II//////////cccccccccccccccccccccccccccclAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKK3vvvKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 39 | UUUUUIIUUUUUUUUUUUUUUUU/////////////////uuuuOuuuuuu///////II///////////ccccccccccccccccccccccccccclccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKK3KKKvvvKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 40 | UUUUUUIIUUUUUUUUUUUUUU////////////////uuuuuuOuuuuuuuu////II////////////ccccccccccccccccccccccccccclccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKK3KKKKKvvvKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 41 | UUUUUUUUIUUUUUUUUUUUU////////////////uuuuuuOuuuuuuuuuu//I//////////////cccccccccccccccccccccccccclcccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKK3KKKKKKKKvvvKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 42 | UUUUUUUUUIIUUUUUUUUU////////////////uuuuuuOuuuuuuuuuuuII///////////////cccccccccccccccccccccccccllcccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKK3KKKKKKKKKKvvvKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 43 | UUUUUUUUUUIIUUUUUUU////////////////uuuuuuOuuuuuuuuuuuIIu///////////////ccccccccccccccccccccccccclccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKK3KKKKKKKKKKKKKvvvKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 44 | UUUUUUUUUUUUIIUUU/////////////////uuuuuuOuuuuuuuuuuIIuuuu//////////////ccccccccccccccccccccccccllccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKK3KKKKKKKKKKKKKKKvvvKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-- 45 | UUUUUUUUUUUUUIII/////////////////uuuuuuOuuuuuuuuuIIIuuuuuu/////////////cccccccccccccccccccccccclccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKK3KKKKKKKKKKKKKKKKKvvKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KK 46 | OUUUUUUUUUUU///III///////////////uuuuuOuuuuuuuuIIIuuuuuuuu/////////////ccccccccccccccccccccccclcccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKK3KKKKKKKKKKKKKKKKKKKvvKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKK 47 | /OOUUUU//////////III////////////uuuuOOuuuuuuuIIIuuuuuuuuuuu////////////ccccccccccccccccccccccclcccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKK3KKKKKKKKKKKKKKKKKKKKKvvvKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKK 48 | ///OO///////////////IIII////////uuOOuuuuuIIIIuuuuuuuuuuuuuu////////////cccccccccccccccccccccclccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKvvvKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKK 49 | ////OO//////////////////IIIIIIIIuIIIIIIIIuuuuuuuuuuuuuuuuuu////////////ccccccccccccccccccccclcccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKvvKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKK 50 | //////OOO/////////////////////OOIuuuuuuuuuuuuuuuuuuuuuuuuuu////////////ccccccccccccccccccccllcccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKvvKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKK 51 | /////////OOO///////////////OOO//uuuuuuuuuuuuuuuuuuuuuuuuuuu////////////cccccccccccccccccccclccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKvvKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKK 52 | ////////////OOOOOOO/OOOOOOO////uuuuuuuuuuuuuuuuuuuuuuuuuuuuu///////////ccccccccccccccccccclcccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKvvKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKK 53 | ///////////////////O////////////uuuuuuuuuuuuuuuuuuuuuuuuuuu////////////cccccccccccccccccclccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKvvKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKK 54 | ////////////////////////////////uuuuuuuuuuuuuuuuuuuuuuuuuuu///////////ccccccccccccccccccllccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKvvKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKK 55 | ////////////////////////////////uuuuuuuuuuuuuuuuuuuuuuuuuuu///////////cccccccccccccccccclcccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKvvKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKK 56 | ////////////////////////////////uuuuuuuuuuuuuuuuuuuuuuuuuuu///////////ccccccccccccccccclccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKvvKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKK 57 | ////////////////////////////////uuuuuuuuuuuuuuuuuuuuuuuuuuu///////////cccccccccccccccclcccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKvvvKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKK 58 | /////////////////////////////////uuuuuuuuuuuuuuuuuuuuuuuuu////////////ccccccccccccccclccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKvvKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKK 59 | /////////////////////////////////uuuuuuuuuuuuuuuuuuuuuuuuu///////////ccccccccccccccclcccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKvvKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKK 60 | //////////////////////////////////uuuuuuuuuuuuuuuuuuuuuuu////////////cccccccccccccclcccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKvvKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKK 61 | ///////////////////////////////////uuuuuuuuuuuuuuuuuuuuu/////////////ccccccccccccclccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKvv--KKKKKKKKKKKKKKKKKKKKKKKKKKKK 62 | ////////////////////////////////////uuuuuuuuuuuuuuuuuuu/////////////ccccccccccccclcccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-vKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 63 | /////////////////////////////////////uuuuuuuuuuuuuuuuu//////////////cccccccccccclccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKvvKKKKKKKKKKKKKKKKKKKKKKKKKKK 64 | //////////////////////////////////////uuuuuuuuuuuuuuu//////////////cccccccccccclcccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKvvKKKKKKKKKKKKKKKKKKKKKKKKK 65 | ////////////////////////////////////////uuuuuuuuuuu////////////////ccccccccccclccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKvvKKKKKKKKKKKKKKKKKKKKKKKK 66 | /////////////////////////////////////////////u////////////////////ccccccccccllccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKvvKKKKKKKKKKKKKKKKKKKKKK 67 | //////////////////////////////////////////////////////////////////cccccccccllcccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKvvKKKKKKKKKKKKKKKKKKKKK 68 | /////////////////////////////////////////////////////////////////ccccccccclcccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKvvKKKKKKKKKKKKKKKKKKK 69 | /////////////////////////////////////////////////////////////////cccccccllccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKvKKKKKKKKKKKKKKKKKK 70 | ////////////////////////////////////////////////////////////////cccccccllccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKvvKKKKKKKKKKKKKKKK 71 | ////////////////////////////////////////////////////////////////cccccclccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKvKKKKKKKKKKKKKKK 72 | ///////////////////////////////////////////////////////////////cccccllcccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKvvKKKKKKKKKKKKK 73 | //////////////////////////////////////////////////////////////ccccllccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKvKKKKKKKKKKKK 74 | /////////////////////////////////////////////////////////////ccclllcccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKvvKKKKKKKKKK 75 | /////////////////////////////////////////////////////////////ccllcccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKvKKKKKKKKK 76 | ////////////////////////////////////////////////////////////cllccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKvvKKKKKKK 77 | ///////////////////////////////////////////////////////////llccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKvvKKKKKK 78 | //////////////////////////////////////////////////////////lcccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKvKKKKK 79 | /////////////////////////////////////////////////////////cccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKvvKKK 80 | ////////////////////////////////////////////////////////cccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKKK33KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKvvKK 81 | ///////////////////////////////////////////////////////ccccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKvK 82 | /////////////////////////////////////////////////////cccccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKv 83 | ////////////////////////////////////////////////////ccccccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 84 | ///////////////////////////////////////////////////ccccccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 85 | cc///////////////////////////////////////////////cccccccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 86 | cc33///////////////////////////////////////////cccccccccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 87 | ccc3cc///////////////////////////////////////ccccccccccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKKKK33KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 88 | cccc3ccc///////////////////////////////////cccccccccccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 89 | cccc33ccccc/////////////////////////////ccccccccccccccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 90 | ccccc3cccccccc///////////////////////2cccccccccccccccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 91 | cccccc3cccccccccccc/////////////ccccc2ccccccccccccccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKKKKKK33KKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 92 | ccccccc3cccccccccccccccccccccccccccc2ccccccccccccccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 93 | ccccccc33ccccccccccccccccccccccccccc2cccccccccccccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAAAKKKKKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 94 | cccccccc3ccccccccccccccccccccccccccc2cccccccccccccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAKKKKKKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 95 | ccccccccc3ccccccccccccccccccccccccc2cccccccccccccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAKKKKKKKKKKKKK33KKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 96 | cccccccccc3cccccccccccccccccccccccc2ccccccccccccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAAKKKKKKKKKKKKK33KKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 97 | ccccccccccc3ccccccccccccccccccccccc2cccccccccccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAAKKKKKKKKKKKKKK33KKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 98 | cccccccccccc3ccccccccccccccccccccc2cccccccccccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAKKKKKKKKKKKKKKK33KKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 99 | ccccccccccccc3cccccccccccccccccccc2cccccccccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAAKKKKKKKKKKKKKKKK33KKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 100 | cccccccccccccc3ccccccccccccccccccc2ccccccccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAAKKKKKKKKKKKKKKKKK33KKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 101 | Kcccccccccccccc3ccccccccccccccccc2ccccccccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAAAKKKKKKKKKKKKKKKKKK33KKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 102 | KKcccccccccccccc3cccccccccccccccc2cccccccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAAKKKKKKKKKKKKKKKKKKKK33KKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 103 | KKKKccccccccccccc33cccccccccccccc2cccccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAAAAAKKKKKKKKKKKKKKKKKKKKKK33KKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 104 | KKKKKccccccccccccc33cccccccccccc2cccccccccccccccccccccccccccccccccccccccccAAAAAAAAAAAAKKKKKKKKKKKKKKKKKKKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 105 | KKKKKKKcccccccccccc33ccccccccccc2cccccccccccccccccccccccccccccccccccccccKKKAKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK33KKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 106 | KKKKKKKKKcccccccccccc3cccccccccc2ccccccccccccccccccccccccccccccccccccccKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK33KKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 107 | KKKKKKKKKKcccccccccccc33ccccccc22ccccccccccccccccccccccccccccccccccccKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK3KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 108 | KKKKKKKKKKKKccccccccccc33cccccc2cccccccccccccccccccccccccccccccccccKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK33KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 109 | KKKKKKKKKKKKKKccccccccccc33cccc2cccccccccccccccccccccccccccccccccKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK33KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 110 | KKKKKKKKKKKKKKKKKcccccccccc3ccc2ccccccccccccccccccccccccccccccKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK33KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 111 | KKKKKKKKKKKKKKKKKKKKcccccccc332ccccccccccccccccccccccccccccKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK33KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 112 | KKKKKKKKKKKKKKKKKKKKKKKccccccc33ccccccccccccccccccccccccKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK333KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 113 | KKKKKKKKKKKKKKKKKKKKKKKKKKKccc2c33ccccccccccccccccccKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK333KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 114 | KKKKKKKKKKKKKKKKKKKKKKKKKKKKK22KKK33cccccccccKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK333KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 115 | KKKKKKKKKKKKKKKKKKKKKKKKKKKKK2KKKKKK333KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK33KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 116 | KKKKKKKKKKKKKKKKKKKKKKKKKKKKK2KKKKKKKKK33KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK333KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 117 | KKKKKKKKKKKKKKKKKKKKKKKKKKKKK2KKKKKKKKKKK3333KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK333KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 118 | KKKKKKKKKKKKKKKKKKKKKKKKKKKK22KKKKKKKKKKKKKK3333KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK3333KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 119 | KKKKKKKKKKKKKKKKKKKKKKKKKKKK2KKKKKKKKKKKKKKKKKKK33333KKKKKKKKKKKKKKKKKKKKKKKKKK3333KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 120 | KKKKKKKKKKKKKKKKKKKKKKKKKKKK2KKKKKKKKKKKKKKKKKKKKKKKK333333333KKKKKKKK333333333KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 121 | KKKKKKKKKKKKKKKKKKKKKKKKKKKK2KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK33333333KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 122 | KKKKKKKKKKKKKKKKKKKKKKKKKKKK2KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 123 | KKKKKKKKKKKKKKKKKKKKKKKKKKK2KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 124 | qqKKKKKKKKKKKKKKKKKKKKKKKKK2KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 125 | KqqKKKKKKKKKKKKKKKKKKKKKKKK2KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 126 | KKKqKKKKKKKKKKKKKKKKKKKKKKK2KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 127 | KKKKqKKKKKKKKKKKKKKKKKKKKK2KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 128 | KKKKKqKKKKKKKKKKKKKKKKKKKK2KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 129 | KKKKKKqqKKKKKKKKKKKKKKKKKK2KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 130 | KKKKKKKqqKKKKKKKKKKKKKKKKK2KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 131 | KKKKKKKKqqKKKKKKKKKKKKKKKK2KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 132 | KKKKKKKKKqqKKKKKKKKKKKKKK2KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 133 | KKKKKKKKKKqqKKKKKKKKKKKKK2KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 134 | KKKKKKKKKKKqqKKKKKKKKKKKK2KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 135 | KKKKKKKKKKKKqqKKKKKKKKKKK2KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 136 | KKKKKKKKKKKKKqqKKKKKKKKKK2KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 137 | KKKKKKKKKKKKKKqqKKKKKKKK2KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 138 | KKKKKKKKKKKKKKKqKKKKKKKK2KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK--KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 139 | KKKKKKKKKKKKKKKKqKKKKKKK2KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK-KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK 140 | -------------------------------------------------------------------------------- /Exam_rank_03/mini_paint/Glagan_tester/example_: -------------------------------------------------------------------------------- 1 | 222 139 K 2 | c 18 14 23 [ 3 | C 20.297712 8.252874 37.276833 _ 4 | c 59.830082 21.594612 45.135880 _ 5 | c -78.524727 367.271423 236.992554 a 6 | c 20.827131 7.023138 27.997646 P 7 | C 75 46 58 A 8 | C 16.253622 18.998438 26.551186 w 9 | c 121.911697 375.618500 361.092896 d 10 | c 3.913340 14.686516 26.057556 R 11 | C 32.659161 21.281975 44.970165 [ 12 | c 37.020645 9.096132 37.007412 4 13 | c 8.213668 49.786324 1.196826 ( 14 | C 14 26 52 A 15 | c 54.104698 8.394490 16.375328 * 16 | c 2.664143 23.280935 10.113174 & 17 | C -93 -15 139 l 18 | c 23.077299 10.393598 19.424257 R 19 | C 17.534557 8.308875 23.535686 Q 20 | c 139 120 149 = 21 | C 39.031536 50.810207 62.434952 c 22 | C 26.459003 21.917820 1.594472 A 23 | c 289 182 269 2 24 | c 25 2 82 l 25 | c -25 172 374 N 26 | c 65.266296 45.361340 74.747879 3 27 | C 24.990240 44.757843 45.698990 / 28 | C 25.500210 7.649467 27.206949 S 29 | C 45 51 14 u 30 | c -73 216 119 q 31 | c 37.260239 322.395660 304.139008 v 32 | C 4.487782 21.800615 24.326277 U 33 | c 19 21 31 O 34 | c 32 10 39 I 35 | c 363.760590 308.209381 302.055389 - -------------------------------------------------------------------------------- /Exam_rank_03/mini_paint/Glagan_tester/gen: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adbenoit-9/42_exams/444f36cd1ed51a7c02dd3a7c656f22287fd1a0d3/Exam_rank_03/mini_paint/Glagan_tester/gen -------------------------------------------------------------------------------- /Exam_rank_03/mini_paint/Glagan_tester/generate_example.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* generate_example.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: ncolomer +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2019/11/22 13:09:44 by ncolomer #+# #+# */ 9 | /* Updated: 2019/11/23 16:29:24 by ncolomer ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | 19 | # define FULL_ASCII 0 20 | # define ASCII_RANGE (FULL_ASCII) ? 1 : 32, (FULL_ASCII) ? 255 : 126 21 | # define MODE "cC" 22 | 23 | int 24 | rand_int_range(int min, int max, std::mt19937 &rng) 25 | { 26 | return (std::uniform_int_distribution(min, max)(rng)); 27 | } 28 | 29 | float 30 | rand_float_range(float min, float max, std::mt19937 &rng) 31 | { 32 | return (std::uniform_real_distribution(min, max)(rng)); 33 | } 34 | 35 | int 36 | main(void) 37 | { 38 | FILE* file; 39 | int width, height, background; 40 | int i, nbr_shapes; 41 | int type, color; 42 | float x, y, sradius; 43 | int size; 44 | 45 | std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count()); 46 | if (!(file = fopen("example_", "w"))) 47 | return (printf("file: fopen error.\n")); 48 | width = rand_int_range(-1, 301, rng); 49 | height = rand_int_range(-1, 301, rng); 50 | background = rand_int_range(ASCII_RANGE, rng); 51 | if (fprintf(file, "%d %d %c\n", width, height, background) < 0) 52 | return (fclose(file) && printf("file: fprintf error.\n")); 53 | 54 | nbr_shapes = rand_int_range(-2, 42, rng); 55 | i = 0; 56 | while (i < nbr_shapes) 57 | { 58 | type = rand_int_range(0, 10000, rng); 59 | if (type == 10000 || type == 0) 60 | type = 'a'; 61 | else if (type >= 5000) 62 | type = 'c'; 63 | else 64 | type = 'C'; 65 | color = rand_int_range(ASCII_RANGE, rng); 66 | if ((size = rand_int_range(0, 100, rng)) >= 25) 67 | { 68 | x = rand_float_range(.001, (float)size, rng); 69 | y = rand_float_range(.001, (float)size, rng); 70 | sradius = rand_float_range(.001, (float)size, rng); 71 | } 72 | else 73 | { 74 | x = rand_float_range(-100., 400., rng); 75 | y = rand_float_range(-100., 400., rng); 76 | sradius = rand_float_range(-.90, 400., rng); 77 | } 78 | if (rand_int_range(0, 100, rng) >= 35) 79 | size = fprintf(file, (++i == nbr_shapes) ? "%c %f %f %f %c" : "%c %f %f %f %c\n", type, x, y, sradius, color); 80 | else 81 | size = fprintf(file, (++i == nbr_shapes) ? "%c %d %d %d %c" : "%c %d %d %d %c\n", type, (int)x, (int)y, (int)sradius, color); 82 | if (size < 0) 83 | return (fclose(file) && printf("file: fprintf error.\n")); 84 | } 85 | fclose(file); 86 | return (0); 87 | } 88 | -------------------------------------------------------------------------------- /Exam_rank_03/mini_paint/Glagan_tester/mini_paint: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adbenoit-9/42_exams/444f36cd1ed51a7c02dd3a7c656f22287fd1a0d3/Exam_rank_03/mini_paint/Glagan_tester/mini_paint -------------------------------------------------------------------------------- /Exam_rank_03/mini_paint/Glagan_tester/our_mini_paint.c: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | 6 | typedef struct drawing drawing, *Pdrawing; 7 | 8 | struct drawing { 9 | int width; 10 | int height; 11 | char * matrice; 12 | }; 13 | 14 | typedef struct circle circle, *Pcircle; 15 | 16 | struct circle { 17 | char type; 18 | float x; 19 | float y; 20 | float radius; 21 | char color; 22 | }; 23 | 24 | int ft_strlen(char *str) 25 | { 26 | int i; 27 | 28 | i = 0; 29 | while (str[i]) 30 | i++; 31 | return (i); 32 | } 33 | 34 | int get_info(FILE *file, drawing *drawing) 35 | 36 | { 37 | int scan_ret; 38 | char *tmp; 39 | int i; 40 | char background; 41 | 42 | scan_ret = fscanf(file,"%d %d %c\n", &drawing->width, &drawing->height, &background); 43 | if (scan_ret == 3) 44 | { 45 | if ((((drawing->width < 1) || (300 < drawing->width)) || (drawing->height < 1)) || (300 < drawing->height)) 46 | return (1); 47 | tmp = (char *)malloc(drawing->width * drawing->height); 48 | drawing->matrice = tmp; 49 | if (!drawing->matrice) 50 | return (1); 51 | i = 0; 52 | while (i < drawing->width * drawing->height) 53 | drawing->matrice[i++] = background; 54 | return (0); 55 | } 56 | return (1); 57 | } 58 | 59 | float square(float a) 60 | { 61 | return (a * a); 62 | } 63 | 64 | float sq_dist(float x1, float y1, float x2, float y2) 65 | { 66 | float dist_x; 67 | float dist_y; 68 | 69 | dist_x = square(x1 - x2); 70 | dist_y = square(y1 - y2); 71 | return (dist_x + dist_y); 72 | } 73 | 74 | int is_in_circle(float x, float y, circle *circle) 75 | { 76 | float distance; 77 | float distance_sqrt; 78 | 79 | distance_sqrt = sqrtf(sq_dist(x, y, circle->x, circle->y)); 80 | distance = distance_sqrt - circle->radius; 81 | if (distance <= 0.00000000) 82 | { 83 | if (distance <= -1.00000000) 84 | return (1); // Inside 85 | return (2); // Border 86 | } 87 | return (0); 88 | } 89 | 90 | void execute_one(circle *circle, drawing *drawing, int x, int y) 91 | { 92 | int is_in; 93 | 94 | is_in = is_in_circle((float)x, (float)y, circle); 95 | if ((is_in == 2) || ((is_in == 1 && (circle->type == 'C')))) 96 | drawing->matrice[x + y * drawing->width] = circle->color; 97 | } 98 | 99 | int apply_op(circle *circle, drawing *drawing) 100 | { 101 | int j; 102 | int i; 103 | 104 | if ((circle->radius <= 0.00000000) || ((circle->type != 'C' && (circle->type != 'c')))) 105 | return (1); 106 | i = 0; 107 | while (i < drawing->width) 108 | { 109 | j = 0; 110 | while (j < drawing->height) 111 | execute_one(circle, drawing, i, j++); 112 | i++; 113 | } 114 | return (0); 115 | } 116 | 117 | int print_info(drawing *drawing) 118 | { 119 | int i; 120 | 121 | i = 0; 122 | while (i < drawing->height) 123 | { 124 | printf("%.*s\n", drawing->width, drawing->matrice + i * drawing->width); 125 | i = i + 1; 126 | } 127 | return i; 128 | } 129 | 130 | int execute(FILE *file) 131 | { 132 | int scan_ret; 133 | circle circle; 134 | drawing drawing; 135 | 136 | if (!get_info(file, &drawing)) 137 | { 138 | scan_ret = fscanf(file,"%c %f %f %f %c\n", &circle.type, &circle.x, &circle.y, &circle.radius, &circle.color); 139 | while (scan_ret == 5) 140 | { 141 | if (apply_op(&circle, &drawing)) 142 | return (1); 143 | scan_ret = fscanf(file,"%c %f %f %f %c\n", &circle.type, &circle.x, &circle.y, &circle.radius, &circle.color); 144 | } 145 | if (scan_ret == -1) 146 | { 147 | print_info(&drawing); 148 | return (0); 149 | } 150 | return (1); 151 | } 152 | return (1); 153 | } 154 | 155 | int main(int argc,char **argv) 156 | { 157 | int i; 158 | FILE *file; 159 | 160 | if (argc == 2) 161 | { 162 | file = fopen(argv[1], "r"); 163 | if (file && !execute(file)) 164 | return (0); 165 | i = ft_strlen("Error: Operation file corrupted\n"); 166 | write(1, "Error: Operation file corrupted\n", i); 167 | } 168 | else 169 | { 170 | i = ft_strlen("Error: argument\n"); 171 | write(1, "Error: argument\n", i); 172 | } 173 | return (1); 174 | } 175 | -------------------------------------------------------------------------------- /Exam_rank_03/mini_paint/Glagan_tester/test.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "> start" 3 | echo "$ compile" 4 | rm -f mini_paint gen 5 | gcc -Wall -Wextra -Werror -lm ../mini_paint.c ../mini_paint_utils.c -I ../ -o mini_paint 6 | gcc -Wall -Wextra -Werror -lm our_mini_paint.c -o _our_mini_paint 7 | g++ -Wall -Wextra -Werror generate_example.cpp -o gen 8 | echo "$ test" 9 | counter=1 10 | max=2 11 | our_res=-1 12 | bad_res=-1 13 | while [ $counter -le $max ] 14 | do 15 | ./gen 16 | if [ $? ] 17 | then 18 | sleep .01 19 | ./_our_mini_paint example_ > coutput 2>&1 20 | our_res=$? 21 | ./mini_paint example_ > output 2>&1 22 | bad_res=$? 23 | if [ $our_res -ne $bad_res ] 24 | then 25 | printf "\n: different return result, our \e[1;31m$our_res\e[0m and yours \e[1;32m$bad_res\e[0m !\n" 26 | exit 1 27 | fi 28 | diff -y --suppress-common-lines coutput output 29 | if [ $? -ne 0 ] 30 | then 31 | printf "\e[1;31m: difference in output, coutput is our, output yours and the example is in example_ !\e[0m\n" 32 | exit 2 33 | fi 34 | if ! (( counter % 50 )) 35 | then 36 | printf "\e[1;34m[$counter]\e[0m" 37 | fi 38 | if [ $our_res -ne 0 ] 39 | then 40 | printf "\e[1;33m$our_res\e[0m" 41 | else 42 | printf "\e[1;32m$our_res\e[0m" 43 | fi 44 | fi 45 | ((max++)) 46 | ((counter++)) 47 | done 48 | rm -rf gen mini_paint example_ output coutput 49 | printf "\n> done" 50 | -------------------------------------------------------------------------------- /Exam_rank_03/mini_paint/mini_paint.c: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* mini_paint.c :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/01/12 22:46:32 by adbenoit #+# #+# */ 9 | /* Updated: 2021/01/14 12:29:02 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "mini_paint.h" 14 | 15 | static int set_paint(char **paint, t_zone zone) 16 | { 17 | int i; 18 | 19 | i = 0; 20 | if (!paint) 21 | return (1); 22 | while (i < zone.h) 23 | { 24 | if (!(paint[i] = calloc(1, zone.w + 1))) 25 | return (1); 26 | memset(paint[i], zone.bc, zone.w); 27 | ++i; 28 | } 29 | paint[i] = 0; 30 | return (0); 31 | } 32 | 33 | static int is_in_circle(float xa, float ya, t_draw draw) 34 | { 35 | float d; 36 | 37 | d = sqrtf((xa - draw.x) * (xa - draw.x) + (ya - draw.y) * (ya - draw.y)); 38 | if (d <= draw.rad) 39 | { 40 | if ((draw.rad - d) < 1.0) 41 | return (1); 42 | return (0); 43 | } 44 | return (-1); 45 | 46 | } 47 | 48 | static int draw_circle(t_draw draw, t_zone zone, char **paint) 49 | { 50 | int i; 51 | int j; 52 | int k; 53 | 54 | i = 0; 55 | while (i < zone.h) 56 | { 57 | j = 0; 58 | while (j < zone.w) 59 | { 60 | k = is_in_circle(j, i, draw); 61 | if (k == 1 || (draw.type == 'C' && k == 0)) 62 | paint[i][j] = draw.c; 63 | ++j; 64 | } 65 | ++i; 66 | } 67 | return (0); 68 | } 69 | 70 | static int drawing(FILE *stream, t_zone zone) 71 | { 72 | int ret; 73 | t_draw draw; 74 | char n; 75 | char **paint; 76 | 77 | paint = (char **)malloc(sizeof(char *) * (zone.h + 1)); 78 | if (set_paint(paint, zone) == 1) 79 | return (ft_freetab(paint)); 80 | draw.type = 0; 81 | while ((ret = fscanf(stream, "%c%c %f %f %f %c", &n, &draw.type, 82 | &draw.x, &draw.y, &draw.rad, &draw.c)) == 6) 83 | { 84 | if ((draw.type != 'c' && draw.type != 'C') || n != '\n' || 85 | draw.rad <= 0.0 || draw.c == 0 || draw.c == '\n') 86 | return (ft_freetab(paint)); 87 | draw_circle(draw, zone, paint); 88 | draw.type = 0; 89 | } 90 | if (draw.type != '\0' && ret != -1) 91 | return (ft_freetab(paint)); 92 | ft_puttab(paint); 93 | ft_freetab(paint); 94 | return (0); 95 | } 96 | 97 | static int get_zone(FILE *stream, t_zone *zone) 98 | { 99 | size_t ret; 100 | 101 | ret = fscanf(stream, "%d %d %c", &zone->w, &zone->h, &zone->bc); 102 | if (ret != 3) 103 | return (1); 104 | if (zone->w <= 0 || zone->w > 300 || zone->h <= 0 || zone->h > 300 || zone->bc == '\n') 105 | return (1); 106 | return (0); 107 | } 108 | 109 | int main(int ac, char **av) 110 | { 111 | FILE *stream; 112 | t_zone zone; 113 | 114 | if (ac != 2) 115 | return (ft_putstr("Error: argument\n")); 116 | if (!(stream = fopen(av[1], "r"))) 117 | return (ft_putstr("Error: Operation file corrupted\n")); 118 | if (get_zone(stream, &zone) == 1) 119 | return (ft_putstr("Error: Operation file corrupted\n")); 120 | if (drawing(stream, zone) == 1) 121 | return (ft_putstr("Error: Operation file corrupted\n")); 122 | fclose(stream); 123 | return (0); 124 | } 125 | -------------------------------------------------------------------------------- /Exam_rank_03/mini_paint/mini_paint.h: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* mini_paint.h :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/01/13 02:30:14 by adbenoit #+# #+# */ 9 | /* Updated: 2021/01/13 02:33:00 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #ifndef MINI_PAINT_H 14 | # define MINI_PAINT_H 15 | 16 | # include 17 | # include 18 | # include 19 | # include 20 | # include 21 | 22 | typedef struct s_zone 23 | { 24 | int w; 25 | int h; 26 | char bc; 27 | } t_zone; 28 | 29 | typedef struct s_draw 30 | { 31 | char type; 32 | char c; 33 | float rad; 34 | float x; 35 | float y; 36 | } t_draw; 37 | 38 | int ft_strlen(char *str); 39 | int ft_putstr(char *str); 40 | void ft_puttab(char **tab); 41 | int ft_freetab(char **tab); 42 | 43 | #endif -------------------------------------------------------------------------------- /Exam_rank_03/mini_paint/mini_paint_utils.c: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* mini_paint_utils.c :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/01/13 02:29:06 by adbenoit #+# #+# */ 9 | /* Updated: 2021/01/13 02:32:29 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "mini_paint.h" 14 | 15 | int ft_strlen(char *str) 16 | { 17 | int i; 18 | 19 | i = 0; 20 | while (str[i]) 21 | ++i; 22 | return (i); 23 | } 24 | 25 | int ft_putstr(char *str) 26 | { 27 | write(1, str, ft_strlen(str)); 28 | return (1); 29 | } 30 | 31 | void ft_puttab(char **tab) 32 | { 33 | int i; 34 | 35 | i = 0; 36 | while (tab[i]) 37 | { 38 | ft_putstr(tab[i]); 39 | write(1, "\n", 1); 40 | ++i; 41 | } 42 | } 43 | 44 | int ft_freetab(char **tab) 45 | { 46 | int i; 47 | 48 | i = 0; 49 | while (tab[i]) 50 | { 51 | free(tab[i]); 52 | ++i; 53 | } 54 | free(tab); 55 | return (1); 56 | } 57 | -------------------------------------------------------------------------------- /Exam_rank_03/mini_paint/subject/examples/1: -------------------------------------------------------------------------------- 1 | 5 3 . 2 | C 1.5 1.5 1 @ -------------------------------------------------------------------------------- /Exam_rank_03/mini_paint/subject/examples/2: -------------------------------------------------------------------------------- 1 | 100 100 , 2 | C 110.45 110.86 100.3 o 3 | c 110.45 110.86 100.3 $ 4 | c 80.135 76.91 39.12 I 5 | C 80.135 76.91 39.12 _ 6 | c 15.5 12.5 10.2 O 7 | C -5 -8 15 @ 8 | C 103 103 3 \ -------------------------------------------------------------------------------- /Exam_rank_03/mini_paint/subject/subject.en.txt: -------------------------------------------------------------------------------- 1 | Assignment name : mini_paint 2 | Expected files : *.c *.h 3 | Allowed functions: fopen, fread, fscanf, fclose, write, malloc, calloc, realloc, free, memset, powf, sqrtf 4 | -------------------------------------------------------------------------------------- 5 | 6 | Write a program that will read an "operation file" and print the result in the terminal 7 | 8 | Your program must take one argument, it will be the path to the "operation file" 9 | If 0 or more than 1 argument is given to your program write "Error: argument" followed by a \n in STDOUT 10 | 11 | $> ./mini_paint | cat -e 12 | Error: argument$ 13 | $> ./mini_paint do not fear mathematics | cat -e 14 | Error: argument$ 15 | $> 16 | 17 | If any problem occurs while you open and/or read the "operation file" write "Error: Operation file corrupted" followed by a \n in STDOUT 18 | 19 | The "operation file" will contains lines with one operation per line 20 | If a line is incorrect an error occurs. 21 | If an error has occured your program must return 1 22 | If no error has occured it must return 0 23 | The last line can be with or without a \n 24 | The lines must be read in order and therefore operations must be executed in the same order 25 | There must be one space between each variable in a line 26 | 27 | WIDTH HEIGHT BACKGROUND_CHAR 28 | This line is always the first line of the file and it defines the zone where to draw. Your program should not display anything outside the draw zone. It must be there only once. 29 | - WIDTH: must be a int with 0 < WIDTH <= 300, the horizontal number of characters to use for the draw zone 30 | - HEIGHT: must be a int with 0 < HEIGHT <= 300, the vertical number of characters to use for the draw zone 31 | - BACKGROUND_CHAR: any empty space will be filled with BACKGROUND_CHAR 32 | 33 | c X Y RADIUS CHAR 34 | This operation will draw a empty circle, where only the border of the circle is drawn 35 | - c: the character c 36 | - X: a float, the horizontal position of the center of the circle 37 | - Y: a float, the vertical position of the center of the circle 38 | - RADIUS: a positive float but not 0, the radius of the circle 39 | - CHAR: the char use to draw the circle 40 | 41 | C X Y RADIUS CHAR 42 | This operation will draw a filled circle 43 | - C: the character C 44 | - X: a float, the horizontal position of the center of the circle 45 | - Y: a float, the vertical position of the center of the circle 46 | - RADIUS: a positive float but not 0, the radius of the circle 47 | - CHAR: the char use to draw the circle 48 | 49 | 50 | The draw zone is divided in rectangles that can contain one character each (because we are in a terminal...), we will call them pixel 51 | To make everything easier, we will use only the top left corner of the pixel to know if that pixel is in a circle or not 52 | If the distance between the top left corner of a pixel and the center of a circle is lower or equal to the radius of the circle, the pixel is part of the circle 53 | but also: 54 | A pixel with a top left corner with a distance bigger or equal than 1 from the border of a circle is not part of an empty circle 55 | A pixel with a top left corner with a distance lower than 1 from the border of a circle is part of an empty circle. 56 | 57 | You should look at the image while reading the next few lines. It represents a terminal. We've set a draw zone of WIDTH 5 and HEIGHT 3. 58 | We've wrote different character to help you understand the following explanations. 59 | - If you want to draw the operation: C 1.5 1.5 1 0 @ (the pink circle) 60 | -- it means that the characters 'b', 'c', 'B', 'C' in the image will be replaced by '@' 61 | 62 | You should find our_mini_paint to help you test yours with some operation_file.example 63 | 64 | Hint: 65 | If you've got 2 points are defined as (Xa,Ya) and (Xb,Yb) 66 | You can get the distance between the two points with this formula: srqt((Xa - Xb) * (Xa - Xb) + (Ya - Yb) * (Ya - Yb)) -------------------------------------------------------------------------------- /Exam_rank_03/mini_paint/subject/subject.fr.txt: -------------------------------------------------------------------------------- 1 | Assignment name : mini_paint 2 | Expected files : *.c *.h 3 | Allowed functions: fopen, fread, fscanf, fclose, write, malloc, calloc, realloc, free, memset, powf, sqrtf 4 | -------------------------------------------------------------------------------------- 5 | 6 | Ecrire un programme qui prendra en parametre un "fichier d'operations" et affichera le resultat dans le terminal 7 | 8 | Votre programme ne prendra qu un seul argument, ce sera le chemin vers le "fichier d'operations" 9 | Si votre programme recoit 0 ou plus de 1 argument il devra afficher "Error: argument" suivi d'un \n dans STDOUT 10 | 11 | $> ./mini_paint | cat -e 12 | Error: argument$ 13 | $> ./mini_paint do not fear mathematics | cat -e 14 | Error: argument$ 15 | $> 16 | 17 | Si votre programme rencontre un probleme quand il ouvre ou bien lit le "fichier d'operation", il devra écrire "Error: Operation file corrupted" suivi d'un \n dans STDOUT 18 | 19 | Le "fichier d'operation" sera composé d'une opération par ligne 20 | Si une ligne n'est pas correct, alors c'est qu'un probleme vient d'avoir lieu 21 | Si votre programme à un probleme il doit renvoyer 1 22 | Si votre programme n'a pas rencontré de probleme, il doit renvoyer 0 23 | La derniere ligne du fichier ne sera pas forcement terminer par un \n 24 | Les lignes doivent etre lu dans l'ordre et par consequent les operations doivent etre executer dans le meme ordre 25 | Il doit n'y avoir qu'un espace entre chaque variable d'une ligne 26 | 27 | WIDTH HEIGHT BACKGROUND_CHAR 28 | Cette ligne sera toujours la premiere ligne du fichier et elle definie la zone dites "de dessin". Votre programme ne devrait rien afficher en dehors de cette "zone de dessin". Cette ligne ne sera presente qu une fois. 29 | - WIDTH: doit etre un int tel que 0 < WIDTH <= 300, C est le nombre de caractères horizontaux utilisés pour la zone de dessin 30 | - HEIGHT: doit etre un int tel que 0 < HEIGHT <= 300, C est le nombre de caractères verticaux utilisés pour la zone de dessin 31 | - BACKGROUND_CHAR: Par defaut toutes la "zone de dessin" est rempli avec BACKGROUND_CHAR 32 | 33 | c X Y RADIUS CHAR 34 | Cette operation fera dessiné un cercle vide, ou seulement la bordure du cercle est dessinée 35 | - c: le caractère c 36 | - X: un float, la position horizontale du centre du cercle 37 | - Y: un float, la position verticale du centre du cercle 38 | - RADIUS: un float positif different de 0, le rayon du cercle 39 | - CHAR: un char, le caractère utilisé pour dessiner le cercle 40 | 41 | C X Y RADIUS CHAR 42 | Cette operation fera dessiné un cercle plein 43 | - C: le caractère C 44 | - X: un float, la position horizontale du centre du cercle 45 | - Y: un float, la position verticale du centre du cercle 46 | - RADIUS: un float positif different de 0, le rayon du cercle 47 | - CHAR: un char, le caractère utilisé pour dessiner le cercle 48 | 49 | La "zone de dessin" est divisé en rectangle qui peuvent chacun contenir un seul caractère (c'est parce qu'on est dans un terminal...) nous les appelerons pixel 50 | Pour faciliter les calculs nous n'utiliserons que le coin en haut à gauche d'un pixel pour savoir si celui ci est dans un cercle ou pas 51 | Si le coin en haut a gauche d'un pixel est à une distance inferieur ou égale au rayon d'un cercle, il fait alors parti de ce cercle 52 | De plus: 53 | Si le coin en haut a gauche d'un pixel est à une distance superieure ou egale à 1 de la bordure d un cercle celui ci ne fait pas parti d'un cercle vide 54 | Si le coin en haut a gauche d'un pixel est à une distance inferieur à 1 de la bordure d'un cercle, il fait alors parti d'un cercle vide 55 | 56 | Vous devriez regarder l'image fournie tout en lisant les prochaines lignes. Cette image represente le terminal. Nous avons fait une "zone de dessin" avec un WIDTH à 5 et une HEIGHT à 3 57 | Nous avons écrit une lettre différente par caractère dans la "zone de dessin" afin de faciliter les explications. 58 | - Si vous voulez effectuer l'operation: C 1.5 1.5 1 0 @ (le cercle rose) 59 | -- Cela fera que les caractères 'b', 'c', 'B', 'C' dans l'image seront remplacés par '@' 60 | 61 | Vous trouverez our_mini_paint afin de vous aider à tester ainsi que des fichiers operation_file.example 62 | 63 | Astuce: 64 | Si 2 points définis par (Xa, Ya) et (Xb, Yb) 65 | Pour calculer la distance entre les deux points il suffit d'utiliser la formule suivante: srqt((Xa - Xb) * (Xa - Xb) + (Ya - Yb) * (Ya - Yb)) -------------------------------------------------------------------------------- /Exam_rank_04/Makefile: -------------------------------------------------------------------------------- 1 | # **************************************************************************** # 2 | # # 3 | # ::: :::::::: # 4 | # Makefile :+: :+: :+: # 5 | # +:+ +:+ +:+ # 6 | # By: adbenoit +#+ +:+ +#+ # 7 | # +#+#+#+#+#+ +#+ # 8 | # Created: 2021/05/03 11:21:34 by adbenoit #+# #+# # 9 | # Updated: 2021/12/03 17:44:29 by adbenoit ### ########.fr # 10 | # # 11 | # **************************************************************************** # 12 | 13 | NAME = microshell 14 | CC = gcc 15 | FLAG = -Wall -Wextra -Werror 16 | 17 | SRC = main.c microshell.c utils.c 18 | OBJ = $(SRC:.c=.o) 19 | 20 | all: $(NAME) 21 | 22 | $(NAME): $(OBJ) 23 | @$(CC) $(FLAG) -o $(NAME) $(OBJ) 24 | @printf "\n" 25 | @echo "Compilation of \033[33;1m$(NAME)\033[0;1m: [\033[1;32mOK\033[0;1m]\033[0m" 26 | 27 | %.o: %.c 28 | @printf "\033[34;1m|\033[0;m" 29 | @mkdir $(OBJ_PATH) 2> /dev/null || true 30 | @$(CC) $(CFLAGS) -c $< -o $@ 31 | 32 | clean: 33 | @rm $(OBJ) 2> /dev/null || true 34 | @echo "\033[33;1m$(NAME)\033[0;1m: objects deleted\033[0m" 35 | 36 | fclean: clean 37 | @rm $(NAME) 2> /dev/null || true 38 | @echo "\033[33;1m$(NAME)\033[0;1m: $(NAME) deleted\033[0m" 39 | 40 | re: fclean all 41 | 42 | .PHONY: all clean fclean re 43 | -------------------------------------------------------------------------------- /Exam_rank_04/main.c: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* main.c :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/06/29 13:49:50 by adbenoit #+# #+# */ 9 | /* Updated: 2021/12/03 17:44:18 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "microshell.h" 14 | 15 | int main(int ac, char **av, char *envp[]) 16 | { 17 | int i; 18 | int start; 19 | 20 | if (ac < 2) 21 | return (0); 22 | i = 1; 23 | start = 1; // skip a.out 24 | while (av[i]) 25 | { 26 | if (strcmp(av[i], ";") == 0) 27 | { 28 | av[i] = 0; // to use av until ";" => one command 29 | launch_cmd(av + start, envp); 30 | ++i; 31 | while (av[i] && strcmp(av[i], ";") == 0) 32 | ++i; 33 | start = i; // next command => after ";" 34 | } 35 | else 36 | ++i; 37 | } 38 | launch_cmd(av + start, envp); //launch last command 39 | return (0); 40 | } 41 | 42 | -------------------------------------------------------------------------------- /Exam_rank_04/microshell: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/adbenoit-9/42_exams/444f36cd1ed51a7c02dd3a7c656f22287fd1a0d3/Exam_rank_04/microshell -------------------------------------------------------------------------------- /Exam_rank_04/microshell.c: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* microshell.c :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/06/29 15:09:39 by adbenoit #+# #+# */ 9 | /* Updated: 2021/12/03 17:39:44 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "microshell.h" 14 | 15 | void ft_cd(char **arg) 16 | { 17 | if (!arg[1] || arg[2]) // check the number of arguments 18 | ft_strerror("error: cd: bad arguments", NULL); 19 | else if (chdir(arg[1]) == -1) 20 | ft_strerror("error: cd: cannot change directory to ", arg[1]); 21 | } 22 | 23 | void child_process(char **arg, int *fd, int fd_in, int last, char *envp[]) 24 | { 25 | if (dup2(fd_in, STDIN_FILENO) == -1) // reading the output of the previous command 26 | ft_strerror("error: fatal", NULL); 27 | if (last == 0) 28 | if (dup2(fd[1], STDOUT_FILENO) == -1) // set the fd output 29 | ft_strerror("error: fatal", NULL); 30 | close(fd_in); 31 | close(fd[0]); 32 | close(fd[1]); 33 | if (execve(arg[0], arg, envp) == -1) // execute command 34 | ft_strerror("error: cannot execute ", arg[0]); 35 | } 36 | 37 | int ft_execute(char **arg, char *envp[], int fd_in) 38 | { 39 | pid_t pid; 40 | int fd[2]; 41 | int i; 42 | int last; 43 | 44 | i = 0; 45 | last = 0; 46 | while (arg[i] && strcmp(arg[i], "|")) 47 | ++i; 48 | if (!arg[i]) // is this the last pipe ? 49 | last = 1; 50 | arg[i] = 0; // to execute command until "|" 51 | if (pipe(fd) == -1 || (pid = fork()) == -1) 52 | ft_strerror("error: fatal", NULL); 53 | else if (pid == 0) 54 | child_process(arg, fd, fd_in, last, envp); 55 | else 56 | { 57 | if (dup2(fd[0], fd_in) == -1) // save fd[0] for the next command 58 | ft_strerror("error: fatal", NULL); 59 | close(fd[0]); 60 | close(fd[1]); 61 | } 62 | if (last == 0) 63 | return (i + 1); 64 | return (i); 65 | } 66 | 67 | void launch_cmd(char **arg, char *envp[]) 68 | { 69 | int i; 70 | int status; 71 | int count; 72 | int fd_in; 73 | 74 | if (!arg[0]) 75 | return ; 76 | count = 0; 77 | if (!strcmp(arg[0], "cd")) 78 | return (ft_cd(arg)); 79 | if ((fd_in = dup(STDIN_FILENO)) == -1) // duplicate the fd of the stdin 80 | ft_strerror("error: fatal", NULL); 81 | i = 0; 82 | while (arg[i]) 83 | { 84 | i += ft_execute(arg + i, envp, fd_in); 85 | ++count; 86 | } 87 | close(fd_in); 88 | 89 | /* 90 | ** wait for all processes to terminated 91 | */ 92 | while (count > 0) 93 | { 94 | waitpid(-1, &status, 0); 95 | --count; 96 | } 97 | } 98 | -------------------------------------------------------------------------------- /Exam_rank_04/microshell.h: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* microshell.h :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/06/24 15:14:49 by adbenoit #+# #+# */ 9 | /* Updated: 2021/12/03 17:49:16 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #ifndef MICROSHELL_H 14 | # define MICROSHELL_H 15 | 16 | # include 17 | # include 18 | # include 19 | # include 20 | # include 21 | # include 22 | 23 | 24 | void launch_cmd(char **arg, char *envp[]); 25 | 26 | size_t ft_strlen(char *str); 27 | void ft_strerror(char *str, char *arg); 28 | void fatal_error(void); 29 | 30 | #endif 31 | -------------------------------------------------------------------------------- /Exam_rank_04/subject/subject.en.txt: -------------------------------------------------------------------------------- 1 | Assignment name : microshell 2 | Expected files : *.c *.h 3 | Allowed functions: malloc, free, write, close, fork, waitpid, signal, kill, exit, chdir, execve, dup, dup2, pipe, strcmp, strncmp 4 | -------------------------------------------------------------------------------------- 5 | 6 | Write a program that will behave like executing a shell command 7 | - The command line to execute will be the arguments of this program 8 | - Executable's path will be absolute or relative but your program must not build a path (from the PATH variable for example) 9 | - You must implement "|" and ";" like in bash 10 | - we will never try a "|" immediately followed or preceded by nothing or "|" or ";" 11 | - Your program must implement the built-in command cd only with a path as argument (no '-' or without parameters) 12 | - if cd has the wrong number of argument your program should print in STDERR "error: cd: bad arguments" followed by a '\n' 13 | - if cd failed your program should print in STDERR "error: cd: cannot change directory to path_to_change" followed by a '\n' with path_to_change replaced by the argument to cd 14 | - a cd command will never be immediately followed or preceded by a "|" 15 | - You don't need to manage any type of wildcards (*, ~ etc...) 16 | - You don't need to manage environment variables ($BLA ...) 17 | - If a system call, except execve and chdir, returns an error your program should immediatly print "error: fatal" in STDERR followed by a '\n' and the program should exit 18 | - If execve failed you should print "error: cannot execute executable_that_failed" in STDERR followed by a '\n' with executable_that_failed replaced with the path of the failed executable (It should be the first argument of execve) 19 | - Your program should be able to manage more than hundreds of "|" even if we limit the number of "open files" to less than 30. 20 | 21 | for example this should work: 22 | $>./microshell /bin/ls "|" /usr/bin/grep microshell ";" /bin/echo i love my microshell 23 | microshell 24 | i love my microshell 25 | $> 26 | 27 | Hints: 28 | Don't forget to pass the environment variable to execve 29 | 30 | Hints: 31 | Do not leak file descriptors! 32 | -------------------------------------------------------------------------------- /Exam_rank_04/subject/subject.fr.txt: -------------------------------------------------------------------------------- 1 | Assignment name : microshell 2 | Expected files : *.c *.h 3 | Allowed functions: malloc, free, write, close, fork, waitpid, signal, kill, exit, chdir, execve, dup, dup2, pipe, strcmp, strncmp 4 | -------------------------------------------------------------------------------------- 5 | 6 | Ecrire un programme qui aura ressemblera à un executeur de commande shell 7 | - La ligne de commande à executer sera passer en argument du programme 8 | - Les executables seront appelés avec un chemin relatif ou absolut mais votre programme ne devra pas construire de chemin (en utilisant la variable d environment PATH par exemple) 9 | - Votre programme doit implementer "|" et ";" comme dans bash 10 | - Nous n'essaierons jamais un "|" immédiatement suivi ou précédé par rien ou un autre "|" ou un ";" 11 | - Votre programme doit implementer la commande "built-in" cd et seulement avec un chemin en argument (pas de '-' ou sans argument) 12 | - si cd n'a pas le bon nombre d'argument votre programme devra afficher dans STDERR "error: cd: bad arguments" suivi d'un '\n' 13 | - si cd a echoué votre programme devra afficher dans STDERR "error: cd: cannot change directory to path_to_change" suivi d'un '\n' avec path_to_change remplacer par l'argument à cd 14 | - une commande cd ne sera jamais immédiatement précédée ou suivie par un "|" 15 | - Votre programme n'a pas à gerer les "wildcards" (*, ~ etc...) 16 | - Votre programme n'a pas à gerer les variables d'environment ($BLA ...) 17 | - Si un appel systeme, sauf execve et chdir, retourne une erreur votre programme devra immédiatement afficher dans STDERR "error: fatal" suivi d'un '\n' et sortir 18 | - Si execve echoue votre programme doit afficher dans STDERR "error: cannot execute executable_that_failed" suivi d'un '\n' en ayant remplacé executable_that_failed avec le chemin du programme qui n'a pu etre executé (ca devrait etre le premier argument de execve) 19 | - Votre programme devrait pouvoir accepter des centaines de "|" meme si la limite du nombre de "fichier ouvert" est inferieur à 30. 20 | 21 | Par exemple, la commande suivante doit marcher: 22 | $>./microshell /bin/ls "|" /usr/bin/grep microshell ";" /bin/echo i love my microshell 23 | microshell 24 | i love my microshell 25 | $> 26 | 27 | Conseils: 28 | N'oubliez pas de passer les variables d'environment à execve 29 | 30 | Conseils: 31 | Ne fuitez pas de file descriptor! 32 | -------------------------------------------------------------------------------- /Exam_rank_04/utils.c: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* utils.c :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/06/29 14:31:51 by adbenoit #+# #+# */ 9 | /* Updated: 2021/12/03 17:49:53 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "microshell.h" 14 | 15 | size_t ft_strlen(char *str) 16 | { 17 | int i; 18 | 19 | i = 0; 20 | while (str[i]) 21 | ++i; 22 | return (i); 23 | 24 | } 25 | 26 | void ft_strerror(char *str, char *arg) 27 | { 28 | write(STDERR_FILENO, str, ft_strlen(str)); 29 | if (arg) 30 | write(STDERR_FILENO, arg, ft_strlen(arg)); 31 | write(STDERR_FILENO, "\n", 1); 32 | kill(0, SIGINT); 33 | } 34 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_00/Warlock.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* Warlock.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 17:38:10 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/15 14:07:25 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "Warlock.hpp" 14 | 15 | Warlock::Warlock(const std::string &n, const std::string &t) : 16 | name(n), title(t) { 17 | std::cout << this->name << ": This looks like another boring day." << std::endl; 18 | } 19 | 20 | Warlock::~Warlock() { 21 | std::cout << this->name << ": My job here is done!" << std::endl; 22 | } 23 | 24 | const std::string& Warlock::getName() const { 25 | return this->name; 26 | } 27 | const std::string& Warlock::getTitle() const { 28 | return this->title; 29 | } 30 | void Warlock::setTitle(const std::string &t) { 31 | this->title = t; 32 | } 33 | 34 | void Warlock::introduce() const { 35 | std::cout << this->name << ": I am " << this->name << ", " 36 | << this->title << "!" << std::endl; 37 | } 38 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_00/Warlock.hpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* Warlock.hpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 17:38:14 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/14 17:58:28 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #ifndef WARLOCK_HPP 14 | # define WARLOCK_HPP 15 | 16 | # include 17 | # include 18 | 19 | class Warlock 20 | { 21 | private: 22 | std::string name; 23 | std::string title; 24 | 25 | Warlock(); 26 | Warlock(const Warlock &); 27 | Warlock& operator= (const Warlock &); 28 | 29 | public: 30 | Warlock(const std::string &, const std::string &); 31 | ~Warlock(); 32 | 33 | const std::string& getName() const; 34 | const std::string& getTitle() const; 35 | void setTitle(const std::string &); 36 | void introduce() const; 37 | }; 38 | 39 | #endif 40 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_00/subject.en.txt: -------------------------------------------------------------------------------- 1 | Assignment name : cpp_module_00 2 | Expected files : Warlock.cpp Warlock.hpp 3 | -------------------------------------------------------------------------------- 4 | 5 | Make a Warlock class. It has to be in Coplien's form. 6 | 7 | It has the following private attributes : 8 | * name (string) 9 | * title (string) 10 | 11 | Since they're private, you will write the following getters : 12 | * getName, returns a reference to constant string 13 | * getTitle, returns a reference to constant string 14 | 15 | Both these functions will have to be callable on a constant Warlock. 16 | 17 | Create the following setter: 18 | * setTitle, returns void and takes a reference to constant string 19 | 20 | Your Warlock will also have, in addition to whatever's required by Coplien's 21 | form, a constructor that takes, in this order, its name and title. Your Warlock 22 | will not be able to be copied, instantiated by copy, or instantiated without a 23 | name and a title. 24 | 25 | For example : 26 | 27 | Warlock bob; //Does not compile 28 | Warlock bob("Bob", "the magnificent"); //Compiles 29 | Warlock jim("Jim", "the nauseating"); //Compiles 30 | bob = jim; //Does not compile 31 | Warlock jack(jim); //Does not compile 32 | 33 | Upon creation, the Warlock says : 34 | 35 | : This looks like another boring day. 36 | 37 | Of course, whenever we use placeholders like , , etc... 38 | in outputs, you will replace them by the appropriate value. Without the < and >. 39 | 40 | When he dies, he says: 41 | 42 | <NAME>: My job here is done! 43 | 44 | Our Warlock must also be able to introduce himself, while boasting with all its 45 | might. 46 | 47 | So you will write the following function: 48 | * void introduce() const; 49 | 50 | It must display: 51 | 52 | <NAME>: I am <NAME>, <TITLE> ! 53 | 54 | Here's an example of a test main function and its associated output: 55 | 56 | int main() 57 | { 58 | Warlock const richard("Richard", "Mistress of Magma"); 59 | richard.introduce(); 60 | std::cout << richard.getName() << " - " << richard.getTitle() << std::endl; 61 | 62 | Warlock* jack = new Warlock("Jack", "the Long"); 63 | jack->introduce(); 64 | jack->setTitle("the Mighty"); 65 | jack->introduce(); 66 | 67 | delete jack; 68 | 69 | return (0); 70 | } 71 | 72 | ~$ ./a.out | cat -e 73 | Richard: This looks like another boring day.$ 74 | Richard: I am Richard, Mistress of Magma!$ 75 | Richard - Mistress of Magma$ 76 | Jack: This looks like another boring day.$ 77 | Jack: I am Jack, the Long!$ 78 | Jack: I am Jack, the Mighty!$ 79 | Jack: My job here is done!$ 80 | Richard: My job here is done!$ 81 | ~$ 82 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_00/tester.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cc="clang++ -Wall -Wextra -Werror -W -std=c++98 -g3 -fsanitize=address" 4 | test_ok=0 5 | 6 | $cc *.cpp tests/subject_main.cpp > /dev/null 2> /dev/null 7 | ./a.out | cat -e > my_output.txt 8 | diff my_output.txt tests/subject_output.txt > /dev/null 2> /dev/null 9 | if [ $? -ne 0 ] 10 | then 11 | test_ok=1 12 | echo -e "tests/subject_main.cpp ❌" 13 | echo -e "\t\033[2m## output ##" 14 | cat my_output.txt 15 | echo -ne "\033[0m" 16 | fi 17 | rm my_output.txt 18 | rm a.out 19 | 20 | not_compile_test() { 21 | $cc *.cpp $1 > /dev/null 2> /dev/null 22 | if [ $? -eq 0 ] 23 | then 24 | test_ok=1 25 | echo -e "$1 ❌" 26 | fi 27 | } 28 | 29 | not_compile_test tests/not_comp_0.cpp 30 | not_compile_test tests/not_comp_1.cpp 31 | not_compile_test tests/not_comp_2.cpp 32 | not_compile_test tests/not_comp_3.cpp 33 | 34 | if [ $test_ok -eq 0 ] 35 | then 36 | echo -e "cpp_module_00 [\033[32mOK\033[0m]" 37 | else 38 | echo -e "\ncpp_module_00 [\033[31mKO\033[0m]" 39 | fi -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_00/tests/not_comp_0.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* not_comp_0.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/16 19:38:48 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/16 20:16:32 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "../Warlock.hpp" 14 | 15 | void isConst(std::string& str) { 16 | std::cout << str; 17 | } 18 | 19 | int main(void) 20 | { 21 | Warlock richard("Richard", "Mistress of Magma"); 22 | isConst(richard.getName()); 23 | 24 | return 0; 25 | } 26 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_00/tests/not_comp_1.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* not_comp_1.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/16 19:38:27 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/16 19:38:43 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "../Warlock.hpp" 14 | 15 | int main(void) 16 | { 17 | Warlock richard(); 18 | 19 | return 0; 20 | } 21 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_00/tests/not_comp_2.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* not_comp_2.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/16 19:37:53 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/16 19:38:07 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "../Warlock.hpp" 14 | 15 | int main(void) 16 | { 17 | Warlock richard("Richard", "Mistress of Magma"); 18 | Warlock bob(richard); 19 | 20 | return 0; 21 | } 22 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_00/tests/not_comp_3.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* not_comp_3.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/16 19:36:33 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/16 19:37:43 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "../Warlock.hpp" 14 | 15 | int main(void) 16 | { 17 | Warlock richard("Richard", "Mistress of Magma"); 18 | Warlock bob("Bob", "Mistress of Magma"); 19 | bob = richard; 20 | 21 | return 0; 22 | } 23 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_00/tests/subject_main.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* subject_main.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/16 18:13:58 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/16 19:59:44 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "../Warlock.hpp" 14 | 15 | int main(void) 16 | { 17 | Warlock const richard("Richard", "Mistress of Magma"); 18 | richard.introduce(); 19 | std::cout << richard.getName() << " - " << richard.getTitle() << std::endl; 20 | 21 | Warlock* jack = new Warlock("Jack", "the Long"); 22 | jack->introduce(); 23 | jack->setTitle("the Mighty"); 24 | jack->introduce(); 25 | 26 | delete jack; 27 | 28 | return 0; 29 | } 30 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_00/tests/subject_output.txt: -------------------------------------------------------------------------------- 1 | Richard: This looks like another boring day.$ 2 | Richard: I am Richard, Mistress of Magma!$ 3 | Richard - Mistress of Magma$ 4 | Jack: This looks like another boring day.$ 5 | Jack: I am Jack, the Long!$ 6 | Jack: I am Jack, the Mighty!$ 7 | Jack: My job here is done!$ 8 | Richard: My job here is done!$ 9 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_01/ASpell.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* ASpell.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 22:07:02 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/14 23:03:38 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "ASpell.hpp" 14 | 15 | ASpell::ASpell() {} 16 | 17 | ASpell::ASpell(const std::string &n, const std::string &e) : 18 | name(n), effects(e) {} 19 | 20 | ASpell::ASpell(const ASpell &x) : 21 | name(x.name), effects(x.effects) {} 22 | 23 | ASpell::~ASpell() {} 24 | 25 | ASpell& ASpell::operator=(const ASpell &x) { 26 | this->name = x.getName(); 27 | this->effects = x.getEffects(); 28 | return (*this); 29 | } 30 | 31 | const std::string& ASpell::getName() const { 32 | return (this->name); 33 | } 34 | 35 | const std::string& ASpell::getEffects() const { 36 | return (this->effects); 37 | } 38 | 39 | void ASpell::launch(const ATarget &target) const { 40 | target.getHitBySpell(*this); 41 | } 42 | 43 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_01/ASpell.hpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* ASpell.hpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 21:37:49 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/15 13:47:28 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #ifndef ASPELL_HPP 14 | # define ASPELL_HPP 15 | 16 | # include <string> 17 | # include <iostream> 18 | # include "ATarget.hpp" 19 | 20 | class ATarget; 21 | 22 | class ASpell 23 | { 24 | protected: 25 | std::string name; 26 | std::string effects; 27 | 28 | public: 29 | ASpell(); 30 | ASpell(const std::string &, const std::string &); 31 | ASpell(const ASpell &); 32 | virtual ~ASpell(); 33 | ASpell& operator=(const ASpell &); 34 | 35 | const std::string& getName() const; 36 | const std::string& getEffects() const; 37 | virtual ASpell* clone() const = 0; 38 | void launch(const ATarget &) const; 39 | }; 40 | 41 | #endif 42 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_01/ATarget.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* ATarget.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 21:57:26 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/14 23:03:44 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "ATarget.hpp" 14 | 15 | ATarget::ATarget() {} 16 | 17 | ATarget::ATarget(const std::string &t) : type(t) {} 18 | 19 | ATarget::ATarget(const ATarget &x) : type(x.type) {} 20 | 21 | ATarget::~ATarget() {} 22 | 23 | ATarget& ATarget::operator=(const ATarget &x) { 24 | this->type = x.getType(); 25 | return (*this); 26 | } 27 | 28 | const std::string& ATarget::getType() const { 29 | return (this->type); 30 | } 31 | 32 | void ATarget::getHitBySpell(const ASpell &spell) const { 33 | std::cout << this->type << " has been " 34 | << spell.getEffects() << "!" << std::endl; 35 | } 36 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_01/ATarget.hpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* ATarget.hpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 21:37:49 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/15 13:47:47 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #ifndef ATARGET_HPP 14 | # define ATARGET_HPP 15 | 16 | # include "ASpell.hpp" 17 | 18 | class ASpell; 19 | 20 | class ATarget 21 | { 22 | protected: 23 | std::string type; 24 | 25 | public: 26 | ATarget(); 27 | ATarget(const std::string &); 28 | ATarget(const ATarget &); 29 | virtual ~ATarget(); 30 | ATarget& operator=(const ATarget &); 31 | 32 | const std::string& getType() const; 33 | virtual ATarget* clone() const = 0; 34 | void getHitBySpell(const ASpell &) const; 35 | }; 36 | 37 | #endif 38 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_01/Dummy.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* Dummy.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 22:23:06 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/14 22:53:40 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "Dummy.hpp" 14 | 15 | Dummy::Dummy() : ATarget("Target Practice Dummy") {} 16 | 17 | Dummy::~Dummy() {} 18 | 19 | Dummy* Dummy::clone() const { 20 | return (new Dummy(*this)); 21 | } 22 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_01/Dummy.hpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* Dummy.hpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 21:37:49 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/15 13:47:00 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #ifndef DUMMY_HPP 14 | # define DUMMY_HPP 15 | 16 | # include "ATarget.hpp" 17 | 18 | class Dummy : public ATarget 19 | { 20 | public: 21 | Dummy(); 22 | virtual ~Dummy(); 23 | 24 | virtual Dummy* clone() const; 25 | }; 26 | 27 | #endif 28 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_01/Fwoosh.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* Fwoosh.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 22:07:02 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/14 22:53:32 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "Fwoosh.hpp" 14 | 15 | Fwoosh::Fwoosh() : ASpell("Fwoosh", "fwooshed") {} 16 | 17 | Fwoosh::~Fwoosh() {} 18 | 19 | Fwoosh* Fwoosh::clone() const { 20 | return (new Fwoosh(*this)); 21 | } 22 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_01/Fwoosh.hpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* Fwoosh.hpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 21:37:49 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/15 13:47:10 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #ifndef FWOOSH_HPP 14 | # define FWOOSH_HPP 15 | 16 | # include "ASpell.hpp" 17 | 18 | class Fwoosh : public ASpell 19 | { 20 | public: 21 | Fwoosh(); 22 | virtual ~Fwoosh(); 23 | 24 | virtual Fwoosh* clone() const; 25 | }; 26 | 27 | #endif 28 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_01/Warlock.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* Warlock.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 17:38:10 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/15 14:03:39 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "Warlock.hpp" 14 | 15 | Warlock::Warlock(const std::string &n, const std::string &t) : 16 | name(n), title(t) { 17 | std::cout << this->name << ": This looks like another boring day." << std::endl; 18 | } 19 | 20 | Warlock::~Warlock() { 21 | std::cout << this->name << ": My job here is done!" << std::endl; 22 | } 23 | 24 | const std::string& Warlock::getName() const { 25 | return this->name; 26 | } 27 | const std::string& Warlock::getTitle() const { 28 | return this->title; 29 | } 30 | void Warlock::setTitle(const std::string &t) { 31 | this->title = t; 32 | } 33 | 34 | void Warlock::introduce() const { 35 | std::cout << this->name << ": I am " << this->name << ", " 36 | << this->title << "!" << std::endl; 37 | } 38 | 39 | void Warlock::learnSpell(ASpell *spell) { 40 | for (size_t i = 0; i < this->spells.size(); i++) 41 | if (this->spells[i]->getName() == spell->getName()) 42 | return ; 43 | spells.push_back(spell->clone()); 44 | } 45 | 46 | void Warlock::forgetSpell(const std::string &name) { 47 | for (std::vector<ASpell *>::iterator it = spells.begin(); it != spells.end(); it++) 48 | if ((*it)->getName() == name) 49 | { 50 | delete *it; 51 | this->spells.erase(it); 52 | return ; 53 | } 54 | } 55 | 56 | void Warlock::launchSpell(const std::string &name, const ATarget &target) { 57 | for (size_t i = 0; i < this->spells.size(); i++) 58 | if (this->spells[i]->getName() == name) 59 | return this->spells[i]->launch(target); 60 | } 61 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_01/Warlock.hpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* Warlock.hpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 17:38:14 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/15 14:03:27 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #ifndef WARLOCK_HPP 14 | # define WARLOCK_HPP 15 | 16 | # include "ASpell.hpp" 17 | # include <vector> 18 | 19 | class Warlock 20 | { 21 | private: 22 | std::string name; 23 | std::string title; 24 | std::vector<ASpell *> spells; 25 | 26 | Warlock(); 27 | Warlock(const Warlock &); 28 | Warlock& operator= (const Warlock &); 29 | 30 | public: 31 | Warlock(const std::string &, const std::string &); 32 | ~Warlock(); 33 | 34 | const std::string& getName() const; 35 | const std::string& getTitle() const; 36 | void setTitle(const std::string &); 37 | void introduce() const; 38 | 39 | void learnSpell(ASpell *); 40 | void forgetSpell(const std::string &); 41 | void launchSpell(const std::string &, const ATarget &); 42 | }; 43 | 44 | #endif 45 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_01/subject.en.txt: -------------------------------------------------------------------------------- 1 | Assignment name : cpp01_02 2 | Expected files : Warlock.cpp Warlock.hpp 3 | ASpell.hpp ASpell.cpp 4 | ATarget.hpp ATarget.cpp 5 | Fwoosh.hpp Fwoosh.cpp 6 | Dummy.hpp Dummy.cpp 7 | -------------------------------------------------------------------------------- 8 | 9 | In the Warlock class, the switch statement is FORBIDDEN and its use would 10 | result in a -42. 11 | 12 | Create an abstract class called ASpell, in Coplien's form, that has the 13 | following protected attributes: 14 | 15 | * name (string) 16 | * effects (string) 17 | 18 | Both will have getters (getName and getEffects) that return strings. 19 | 20 | Also add a clone pure method that returns a pointer to ASpell. 21 | 22 | All these functions can be called on a constant object. 23 | 24 | ASpell has a constructor that takes its name and its effects, in that order. 25 | 26 | Now you will create an ATarget abstract class, in Coplien's form. It has a type 27 | attribute, which is a string, and its associated getter, getType, that return a 28 | reference to constant string. 29 | 30 | In much the same way as ASpell, it has a clone() pure method. 31 | 32 | All these functions can be called on a constant object. 33 | 34 | It has a constructor that takes its type. 35 | 36 | Now, add to your ATarget a getHitBySpell function that takes a reference to 37 | constant ASpell. 38 | 39 | It will display : 40 | 41 | <TYPE> has been <EFFECTS>! 42 | 43 | <TYPE> is the ATarget's type, and <EFFECTS> is the return of the ASpell's 44 | getEffects function. 45 | 46 | Finally, add to your ASpell class a launch function that takes a reference to 47 | constant ATarget. 48 | 49 | This one will simply call the getHitBySpell of the passed object, passing the 50 | current instance as parameter. 51 | 52 | When all this is done, create an implementation of ASpell called Fwoosh. Its 53 | default constructor will set the name to "Fwoosh" and the effects to 54 | "fwooshed". You will, of course, implement the clone() method. In the case of 55 | Fwoosh, it will return a pointer to a new Fwoosh object. 56 | 57 | In the same way, create a concrete ATarget called Dummy, the type of which 58 | is "Target Practice Dummy". You must also implement its clone() method. 59 | 60 | Add to the Warlock the following member functions: 61 | 62 | * learnSpell, takes a pointer to ASpell, that makes the Warlock learn a spell 63 | * forgetSpell, takes a string corresponding a to a spell's name, and makes the 64 | Warlock forget it. If it's not a known spell, does nothing. 65 | * launchSpell, takes a string (a spell name) and a reference to ATarget, that 66 | launches the spell on the selected target. If it's not a known spell, does 67 | nothing. 68 | 69 | You will need a new attribute to store the spells your Warlock knows. Several 70 | types fit the bill, it's up to you to choose the best one. 71 | 72 | Below is a possible test main and its expected output: 73 | 74 | int main() 75 | { 76 | Warlock richard("Richard", "the Titled"); 77 | 78 | Dummy bob; 79 | Fwoosh* fwoosh = new Fwoosh(); 80 | 81 | richard.learnSpell(fwoosh); 82 | 83 | richard.introduce(); 84 | richard.launchSpell("Fwoosh", bob); 85 | 86 | richard.forgetSpell("Fwoosh"); 87 | richard.launchSpell("Fwoosh", bob); 88 | } 89 | 90 | ~$ ./a.out | cat -e 91 | Richard: This looks like another boring day.$ 92 | Richard: I am Richard, the Titled!$ 93 | Target Practice Dummy has been fwooshed!$ 94 | Richard: My job here is done!$ 95 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_01/tester.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cc="clang++ -Wall -Wextra -Werror -W -std=c++98 -g3 -fsanitize=address" 4 | test_ok=0 5 | 6 | $cc *.cpp tests/subject_main.cpp > /dev/null 2> /dev/null 7 | ./a.out | cat -e > my_output.txt 8 | diff my_output.txt tests/subject_output.txt > /dev/null 2> /dev/null 9 | if [ $? -ne 0 ] 10 | then 11 | test_ok=1 12 | echo -e "tests/subject_main.cpp ❌" 13 | echo -e "\t\033[2m## output ##" 14 | cat my_output.txt 15 | echo -ne "\033[0m" 16 | fi 17 | rm my_output.txt 18 | 19 | $cc *.cpp tests/compile.cpp > /dev/null 2> /dev/null 20 | if [ $? -ne 0 ] 21 | then 22 | test_ok=1 23 | echo -e "tests/compile.cpp ❌" 24 | fi 25 | rm a.out 26 | 27 | not_compile_test() { 28 | $cc *.cpp $1 > /dev/null 2> /dev/null 29 | if [ $? -eq 0 ] 30 | then 31 | test_ok=1 32 | echo -e "$1 ❌" 33 | fi 34 | } 35 | 36 | not_compile_test tests/not_comp_0.cpp 37 | not_compile_test tests/not_comp_1.cpp 38 | not_compile_test tests/not_comp_2.cpp 39 | not_compile_test tests/not_comp_3.cpp 40 | 41 | if [ $test_ok -eq 0 ] 42 | then 43 | echo -e "cpp_module_01 [\033[32mOK\033[0m]" 44 | else 45 | echo -e "\ncpp_module_01 [\033[31mKO\033[0m]" 46 | fi -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_01/tests/compile.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* my_main.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/16 18:13:58 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/16 20:04:04 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "../Warlock.hpp" 14 | #include "../Fwoosh.hpp" 15 | #include "../Dummy.hpp" 16 | 17 | class test1 : public ASpell 18 | { 19 | public: 20 | test1() : ASpell("ASpell attributs", " is protected") {} 21 | void printAttributs() const { 22 | std::cout << ASpell::name + ASpell::effects << std::endl; 23 | } 24 | virtual test1 *clone() const { return new test1(); } 25 | }; 26 | 27 | class test2 : public ATarget 28 | { 29 | public: 30 | test2() : ATarget("ATarget attributs is protected") {} 31 | void printAttributs() const { 32 | std::cout << ATarget::type << std::endl; 33 | } 34 | virtual test2 *clone() const { return new test2(); } 35 | }; 36 | 37 | int main() 38 | { 39 | Warlock richard("Richard", "foo"); 40 | 41 | // test const 42 | const Fwoosh *fwoosh = new Fwoosh(); 43 | const Dummy bob; 44 | fwoosh->launch(bob); 45 | 46 | // test class attributs 47 | test1 aspell; 48 | test2 atarget; 49 | aspell.printAttributs(); 50 | atarget.printAttributs(); 51 | } 52 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_01/tests/not_comp_0.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* not_comp_0.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/16 19:38:48 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/16 20:13:40 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "../ASpell.hpp" 14 | 15 | int main(void) 16 | { 17 | ASpell spell; 18 | 19 | return 0; 20 | } 21 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_01/tests/not_comp_1.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* not_comp_1.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/16 19:38:27 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/16 20:13:36 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "../ATarget.hpp" 14 | 15 | int main(void) 16 | { 17 | ATarget target; 18 | 19 | return 0; 20 | } 21 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_01/tests/not_comp_2.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* not_comp_2.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/16 19:37:53 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/16 20:19:10 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "../Dummy.hpp" 14 | 15 | void isConst(std::string& str) { 16 | std::cout << str; 17 | } 18 | 19 | int main(void) 20 | { 21 | Dummy richard; 22 | isConst(richard.getType()); 23 | 24 | return 0; 25 | } 26 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_01/tests/not_comp_5.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* not_comp_5.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/16 19:37:53 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/16 20:19:04 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "../Fwoosh.hpp" 14 | 15 | void isConst(std::string& str) { 16 | std::cout << str; 17 | } 18 | 19 | int main(void) 20 | { 21 | Fwoosh richard; 22 | isConst(richard.getName()); 23 | 24 | return 0; 25 | } 26 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_01/tests/subject_main.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* subject_main.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/16 18:13:58 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/16 20:02:34 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "../Warlock.hpp" 14 | #include "../Fwoosh.hpp" 15 | #include "../Dummy.hpp" 16 | 17 | int main(void) 18 | { 19 | Warlock richard("Richard", "the Titled"); 20 | 21 | Dummy bob; 22 | Fwoosh* fwoosh = new Fwoosh(); 23 | 24 | richard.learnSpell(fwoosh); 25 | 26 | richard.introduce(); 27 | richard.launchSpell("Fwoosh", bob); 28 | 29 | richard.forgetSpell("Fwoosh"); 30 | richard.launchSpell("Fwoosh", bob); 31 | 32 | return 0; 33 | } 34 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_01/tests/subject_output.txt: -------------------------------------------------------------------------------- 1 | Richard: This looks like another boring day.$ 2 | Richard: I am Richard, the Titled!$ 3 | Target Practice Dummy has been fwooshed!$ 4 | Richard: My job here is done!$ 5 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_02/ASpell.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* ASpell.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 22:07:02 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/14 23:03:38 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "ASpell.hpp" 14 | 15 | ASpell::ASpell() {} 16 | 17 | ASpell::ASpell(const std::string &n, const std::string &e) : 18 | name(n), effects(e) {} 19 | 20 | ASpell::ASpell(const ASpell &x) : 21 | name(x.name), effects(x.effects) {} 22 | 23 | ASpell::~ASpell() {} 24 | 25 | ASpell& ASpell::operator=(const ASpell &x) { 26 | this->name = x.getName(); 27 | this->effects = x.getEffects(); 28 | return (*this); 29 | } 30 | 31 | const std::string& ASpell::getName() const { 32 | return (this->name); 33 | } 34 | 35 | const std::string& ASpell::getEffects() const { 36 | return (this->effects); 37 | } 38 | 39 | void ASpell::launch(const ATarget &target) const { 40 | target.getHitBySpell(*this); 41 | } 42 | 43 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_02/ASpell.hpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* ASpell.hpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 21:37:49 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/16 19:02:23 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #ifndef ASPELL_HPP 14 | # define ASPELL_HPP 15 | 16 | # include <string> 17 | # include <iostream> 18 | # include "ATarget.hpp" 19 | 20 | class ATarget; 21 | 22 | class ASpell 23 | { 24 | protected: 25 | std::string name; 26 | std::string effects; 27 | 28 | public: 29 | ASpell(); 30 | ASpell(const std::string &, const std::string &); 31 | ASpell(const ASpell &); 32 | virtual ~ASpell(); 33 | ASpell& operator=(const ASpell &); 34 | 35 | const std::string& getName() const; 36 | const std::string& getEffects() const; 37 | virtual ASpell* clone() const = 0; 38 | void launch(const ATarget &) const; 39 | }; 40 | 41 | #endif 42 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_02/ATarget.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* ATarget.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 21:57:26 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/14 23:03:44 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "ATarget.hpp" 14 | 15 | ATarget::ATarget() {} 16 | 17 | ATarget::ATarget(const std::string &t) : type(t) {} 18 | 19 | ATarget::ATarget(const ATarget &x) : type(x.type) {} 20 | 21 | ATarget::~ATarget() {} 22 | 23 | ATarget& ATarget::operator=(const ATarget &x) { 24 | this->type = x.getType(); 25 | return (*this); 26 | } 27 | 28 | const std::string& ATarget::getType() const { 29 | return (this->type); 30 | } 31 | 32 | void ATarget::getHitBySpell(const ASpell &spell) const { 33 | std::cout << this->type << " has been " 34 | << spell.getEffects() << "!" << std::endl; 35 | } 36 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_02/ATarget.hpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* ATarget.hpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 21:37:49 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/16 19:02:44 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #ifndef ATARGET_HPP 14 | # define ATARGET_HPP 15 | 16 | # include "ASpell.hpp" 17 | 18 | class ASpell; 19 | 20 | class ATarget 21 | { 22 | protected: 23 | std::string type; 24 | 25 | public: 26 | ATarget(); 27 | ATarget(const std::string &); 28 | ATarget(const ATarget &); 29 | virtual ~ATarget(); 30 | ATarget& operator=(const ATarget &); 31 | 32 | const std::string& getType() const; 33 | virtual ATarget* clone() const = 0; 34 | void getHitBySpell(const ASpell &) const; 35 | }; 36 | 37 | #endif 38 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_02/BrickWall.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* BrickWall.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 22:23:06 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/14 23:19:24 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "BrickWall.hpp" 14 | 15 | BrickWall::BrickWall() : ATarget("Inconspicuous Red-brick Wall") {} 16 | 17 | BrickWall::~BrickWall() {} 18 | 19 | BrickWall* BrickWall::clone() const { 20 | return (new BrickWall(*this)); 21 | } 22 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_02/BrickWall.hpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* BrickWall.hpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 21:37:49 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/15 13:48:20 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #ifndef BRICKWALL_HPP 14 | # define BRICKWALL_HPP 15 | 16 | # include "ATarget.hpp" 17 | 18 | class BrickWall : public ATarget 19 | { 20 | public: 21 | BrickWall(); 22 | virtual ~BrickWall(); 23 | 24 | virtual BrickWall* clone() const; 25 | }; 26 | 27 | #endif 28 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_02/Dummy.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* Dummy.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 22:23:06 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/14 22:53:40 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "Dummy.hpp" 14 | 15 | Dummy::Dummy() : ATarget("Target Practice Dummy") {} 16 | 17 | Dummy::~Dummy() {} 18 | 19 | Dummy* Dummy::clone() const { 20 | return (new Dummy(*this)); 21 | } 22 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_02/Dummy.hpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* Dummy.hpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 21:37:49 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/15 13:48:27 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #ifndef DUMMY_HPP 14 | # define DUMMY_HPP 15 | 16 | # include "ATarget.hpp" 17 | 18 | class Dummy : public ATarget 19 | { 20 | public: 21 | Dummy(); 22 | virtual ~Dummy(); 23 | 24 | virtual Dummy* clone() const; 25 | }; 26 | 27 | #endif 28 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_02/Fireball.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* Fireball.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 22:07:02 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/14 23:16:59 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "Fireball.hpp" 14 | 15 | Fireball::Fireball() : ASpell("Fireball", "burnt to a crisp") {} 16 | 17 | Fireball::~Fireball() {} 18 | 19 | Fireball* Fireball::clone() const { 20 | return (new Fireball(*this)); 21 | } 22 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_02/Fireball.hpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* Fireball.hpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 21:37:49 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/15 13:48:35 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #ifndef FIREBALL_HPP 14 | # define FIREBALL_HPP 15 | 16 | # include "ASpell.hpp" 17 | 18 | class Fireball : public ASpell 19 | { 20 | public: 21 | Fireball(); 22 | virtual ~Fireball(); 23 | 24 | virtual Fireball* clone() const; 25 | }; 26 | 27 | #endif 28 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_02/Fwoosh.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* Fwoosh.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 22:07:02 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/14 22:53:32 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "Fwoosh.hpp" 14 | 15 | Fwoosh::Fwoosh() : ASpell("Fwoosh", "fwooshed") {} 16 | 17 | Fwoosh::~Fwoosh() {} 18 | 19 | Fwoosh* Fwoosh::clone() const { 20 | return (new Fwoosh(*this)); 21 | } 22 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_02/Fwoosh.hpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* Fwoosh.hpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 21:37:49 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/15 13:48:41 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #ifndef FWOOSH_HPP 14 | # define FWOOSH_HPP 15 | 16 | # include "ASpell.hpp" 17 | 18 | class Fwoosh : public ASpell 19 | { 20 | public: 21 | Fwoosh(); 22 | virtual ~Fwoosh(); 23 | 24 | virtual Fwoosh* clone() const; 25 | }; 26 | 27 | #endif 28 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_02/Polymorph.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* Polymorph.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 22:07:02 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/14 23:50:11 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "Polymorph.hpp" 14 | 15 | Polymorph::Polymorph() : ASpell("Polymorph", "turned into a critter") {} 16 | 17 | Polymorph::~Polymorph() {} 18 | 19 | Polymorph* Polymorph::clone() const { 20 | return (new Polymorph(*this)); 21 | } 22 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_02/Polymorph.hpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* Polymorph.hpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 21:37:49 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/14 23:18:07 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #ifndef POLYMORPH_HPP 14 | # define POLYMORPH_HPP 15 | 16 | # include "ASpell.hpp" 17 | 18 | class Polymorph : public ASpell 19 | { 20 | public: 21 | Polymorph(); 22 | ~Polymorph(); 23 | 24 | virtual Polymorph* clone() const; 25 | }; 26 | 27 | #endif 28 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_02/SpellBook.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* SpellBook.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 17:38:10 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/14 23:40:42 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "SpellBook.hpp" 14 | 15 | SpellBook::SpellBook() {} 16 | 17 | SpellBook::~SpellBook() {} 18 | 19 | void SpellBook::learnSpell(ASpell *spell) { 20 | for (size_t i = 0; i < this->book.size(); i++) 21 | if (this->book[i]->getName() == spell->getName()) 22 | return ; 23 | book.push_back(spell->clone()); 24 | } 25 | 26 | void SpellBook::forgetSpell(const std::string &name) { 27 | for (std::vector<ASpell *>::iterator it = book.begin(); it != book.end(); it++) 28 | if ((*it)->getName() == name) 29 | { 30 | delete *it; 31 | this->book.erase(it); 32 | return ; 33 | } 34 | } 35 | 36 | ASpell* SpellBook::createSpell(const std::string &name) { 37 | for (size_t i = 0; i < this->book.size(); i++) 38 | if (this->book[i]->getName() == name) 39 | return this->book[i]; 40 | return (0); 41 | } 42 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_02/SpellBook.hpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* SpellBook.hpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 17:38:14 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/14 23:48:36 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #ifndef SPELLBOOK_HPP 14 | # define SPELLBOOK_HPP 15 | 16 | # include "ASpell.hpp" 17 | # include <vector> 18 | 19 | class SpellBook 20 | { 21 | private: 22 | std::vector<ASpell *> book; 23 | 24 | SpellBook(const SpellBook &); 25 | SpellBook& operator= (const SpellBook &); 26 | 27 | public: 28 | SpellBook(); 29 | ~SpellBook(); 30 | 31 | void learnSpell(ASpell *); 32 | void forgetSpell(const std::string &); 33 | ASpell* createSpell(const std::string &); 34 | }; 35 | 36 | #endif 37 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_02/TargetGenerator.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* TargetGenerator.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 17:38:10 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/14 23:48:22 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "TargetGenerator.hpp" 14 | 15 | TargetGenerator::TargetGenerator() {} 16 | 17 | TargetGenerator::~TargetGenerator() {} 18 | 19 | void TargetGenerator::learnTargetType(ATarget *target) { 20 | for (size_t i = 0; i < this->generator.size(); i++) 21 | if (this->generator[i]->getType() == target->getType()) 22 | return ; 23 | generator.push_back(target->clone()); 24 | } 25 | 26 | void TargetGenerator::forgetTargetType(const std::string &type) { 27 | for (std::vector<ATarget *>::iterator it = generator.begin(); it != generator.end(); it++) 28 | if ((*it)->getType() == type) 29 | { 30 | delete *it; 31 | this->generator.erase(it); 32 | return ; 33 | } 34 | } 35 | 36 | ATarget* TargetGenerator::createTarget(const std::string &type) { 37 | for (size_t i = 0; i < this->generator.size(); i++) 38 | if (this->generator[i]->getType() == type) 39 | return this->generator[i]; 40 | return (0); 41 | } 42 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_02/TargetGenerator.hpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* TargetGenerator.hpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 17:38:14 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/14 23:48:13 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #ifndef TARGETGENERATOR_HPP 14 | # define TARGETGENERATOR_HPP 15 | 16 | # include "ATarget.hpp" 17 | # include <vector> 18 | 19 | class TargetGenerator 20 | { 21 | private: 22 | std::vector<ATarget *> generator; 23 | 24 | TargetGenerator(const TargetGenerator &); 25 | TargetGenerator& operator= (const TargetGenerator &); 26 | 27 | public: 28 | TargetGenerator(); 29 | ~TargetGenerator(); 30 | 31 | void learnTargetType(ATarget *); 32 | void forgetTargetType(const std::string &); 33 | ATarget* createTarget(const std::string &); 34 | }; 35 | 36 | #endif 37 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_02/Warlock.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* Warlock.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 17:38:10 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/16 18:42:41 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "Warlock.hpp" 14 | 15 | Warlock::Warlock(const std::string &n, const std::string &t) : 16 | name(n), title(t) { 17 | std::cout << this->name << ": This looks like another boring day." << std::endl; 18 | } 19 | 20 | Warlock::~Warlock() { 21 | std::cout << this->name << ": My job here is done!" << std::endl; 22 | } 23 | 24 | const std::string& Warlock::getName() const { 25 | return this->name; 26 | } 27 | const std::string& Warlock::getTitle() const { 28 | return this->title; 29 | } 30 | void Warlock::setTitle(const std::string &t) { 31 | this->title = t; 32 | } 33 | 34 | void Warlock::introduce() const { 35 | std::cout << this->name << ": I am " << this->name << ", " 36 | << this->title << "!" << std::endl; 37 | } 38 | 39 | void Warlock::learnSpell(ASpell *spell){ 40 | this->book.learnSpell(spell); 41 | } 42 | 43 | void Warlock::forgetSpell(const std::string &name) { 44 | this->book.forgetSpell(name); 45 | } 46 | 47 | void Warlock::launchSpell(const std::string &name, const ATarget &target) { 48 | ASpell *spell; 49 | spell = this->book.createSpell(name); 50 | if (spell) 51 | spell->launch(target); 52 | } 53 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_02/Warlock.hpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* Warlock.hpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/14 17:38:14 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/15 13:49:57 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #ifndef WARLOCK_HPP 14 | # define WARLOCK_HPP 15 | 16 | # include "SpellBook.hpp" 17 | # include <vector> 18 | 19 | class Warlock 20 | { 21 | private: 22 | std::string name; 23 | std::string title; 24 | SpellBook book; 25 | 26 | Warlock(); 27 | Warlock(const Warlock &); 28 | Warlock& operator= (const Warlock &); 29 | 30 | public: 31 | Warlock(const std::string &, const std::string &); 32 | ~Warlock(); 33 | 34 | const std::string& getName() const; 35 | const std::string& getTitle() const; 36 | void setTitle(const std::string &); 37 | void introduce() const; 38 | 39 | void learnSpell(ASpell *); 40 | void forgetSpell(const std::string &); 41 | void launchSpell(const std::string &, const ATarget &); 42 | }; 43 | 44 | #endif 45 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_02/subject.en.txt: -------------------------------------------------------------------------------- 1 | Assignment name : cpp_module_02 2 | Expected files : Warlock.cpp Warlock.hpp 3 | ASpell.hpp ASpell.cpp 4 | ATarget.hpp ATarget.cpp 5 | Fwoosh.hpp Fwoosh.cpp 6 | Dummy.hpp Dummy.cpp 7 | Fireball.hpp Fireball.cpp 8 | Polymorph.hpp Polymorph.cpp 9 | BrickWall.hpp BrickWall.cpp 10 | SpellBook.hpp SpellBook.cpp 11 | TargetGenerator.hpp TargetGenerator.cpp 12 | -------------------------------------------------------------------------------- 13 | 14 | In the Warlock, SpellBook and TargetGenerator classes, the switch statement is 15 | FORBIDDEN and its use would result in a -42. 16 | 17 | Create the following two spells, on the same model as Fwoosh: 18 | 19 | * Fireball (Name: "Fireball", Effects: "burnt to a crisp") 20 | * Polymorph (Name: "Polymorph", Effects: "turned into a critter") 21 | 22 | In addition to this, just so he won't have only dummy to attack, let's make a 23 | new target for him, which will be the BrickWall (Type: "Inconspicuous Red-brick Wall"). 24 | 25 | Now, make a SpellBook class, in canonical form, that can't be copied or instantiated 26 | by copy. It will have the following functions: 27 | 28 | * void learnSpell(ASpell*), that COPIES a spell in the book 29 | * void forgetSpell(string const &), that deletes a spell from the book, except 30 | if it isn't there 31 | * ASpell* createSpell(string const &), that receives a string corresponding to 32 | the name of a spell, creates it, and returns it. 33 | 34 | Modify the Warlock, now, make it have a spell book that will be created with 35 | him and destroyed with him. Also make his learnSpell and forgetSpell functions 36 | call those of the spell book. 37 | 38 | The launchSpell function will have to use the SpellBook to create the spell 39 | it's attempting to launch. 40 | 41 | Make a TargetGenerator class, in canonical form, and as before, 42 | non-copyable. 43 | 44 | It will have the following functions: 45 | 46 | * void learnTargetType(ATarget*), teaches a target to the generator 47 | 48 | * void forgetTargetType(string const &), that makes the generator forget a 49 | target type if it's known 50 | 51 | * ATarget* createTarget(string const &), that creates a target of the 52 | specified type 53 | 54 | Phew, that's done. Now here's a test main. It's not very thorough, so make sure 55 | to use your own aswell. 56 | 57 | int main() 58 | { 59 | Warlock richard("Richard", "foo"); 60 | richard.setTitle("Hello, I'm Richard the Warlock!"); 61 | BrickWall model1; 62 | 63 | Polymorph* polymorph = new Polymorph(); 64 | TargetGenerator tarGen; 65 | 66 | tarGen.learnTargetType(&model1); 67 | richard.learnSpell(polymorph); 68 | 69 | Fireball* fireball = new Fireball(); 70 | 71 | richard.learnSpell(fireball); 72 | 73 | ATarget* wall = tarGen.createTarget("Inconspicuous Red-brick Wall"); 74 | 75 | richard.introduce(); 76 | richard.launchSpell("Polymorph", *wall); 77 | richard.launchSpell("Fireball", *wall); 78 | } 79 | 80 | ~$ ./a.out | cat -e 81 | Richard: This looks like another boring day.$ 82 | Richard: I am Richard, Hello, I'm Richard the Warlock!!$ 83 | Inconspicuous Red-brick Wall has been turned into a critter!$ 84 | Inconspicuous Red-brick Wall has been burnt to a crisp!$ 85 | Richard: My job here is done!$ 86 | ~$ 87 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_02/tester.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | cc="clang++ -Wall -Wextra -Werror -W -std=c++98 -g3 -fsanitize=address" 4 | test_ok=0 5 | 6 | $cc *.cpp tests/subject_main.cpp > /dev/null 2> /dev/null 7 | ./a.out | cat -e > my_output.txt 8 | diff my_output.txt tests/subject_output.txt > /dev/null 2> /dev/null 9 | if [ $? -ne 0 ] 10 | then 11 | test_ok=1 12 | echo -e "tests/subject_main.cpp ❌" 13 | echo -e "\t\033[2m## output ##" 14 | cat my_output.txt 15 | echo -ne "\033[0m" 16 | fi 17 | rm my_output.txt 18 | 19 | $cc *.cpp tests/compile.cpp > /dev/null 2> /dev/null 20 | if [ $? -ne 0 ] 21 | then 22 | test_ok=1 23 | echo -e "tests/compile.cpp ❌" 24 | fi 25 | rm a.out 26 | 27 | if [ $test_ok -eq 0 ] 28 | then 29 | echo -e "cpp_module_02 [\033[32mOK\033[0m]" 30 | else 31 | echo -e "\ncpp_module_02 [\033[31mKO\033[0m]" 32 | fi -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_02/tests/compile.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* compile.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/16 18:13:58 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/16 20:24:08 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "../Warlock.hpp" 14 | #include "../Fwoosh.hpp" 15 | #include "../Dummy.hpp" 16 | #include "../BrickWall.hpp" 17 | #include "../Polymorph.hpp" 18 | #include "../TargetGenerator.hpp" 19 | #include "../Fireball.hpp" 20 | 21 | int main() 22 | { 23 | Warlock richard("Richard", "foo"); 24 | 25 | // test copy 26 | Fireball *fire = new Fireball(); 27 | BrickWall* wall = new BrickWall(); 28 | TargetGenerator tarGen; 29 | tarGen.learnTargetType(wall); 30 | richard.learnSpell(fire); 31 | const std::string name(fire->getName()); 32 | const std::string effects(fire->getEffects()); 33 | const std::string type(wall->getType()); 34 | delete fire; 35 | delete wall; 36 | ATarget* target = tarGen.createTarget(type); 37 | richard.launchSpell(name, *target); 38 | 39 | // test double 40 | fire = new Fireball(); 41 | richard.learnSpell(fire); 42 | tarGen.learnTargetType(target); 43 | richard.forgetSpell(name); 44 | tarGen.forgetTargetType(type); 45 | std::cout << "have to be empy : "; 46 | richard.launchSpell(name, *target); 47 | if (tarGen.createTarget(type)) 48 | std::cout << "is not..."; 49 | std::cout << std::endl; 50 | } 51 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_02/tests/subject_main.cpp: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* subject_main.cpp :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/10/16 18:13:58 by adbenoit #+# #+# */ 9 | /* Updated: 2021/10/16 20:23:16 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include "../Warlock.hpp" 14 | #include "../Fwoosh.hpp" 15 | #include "../Dummy.hpp" 16 | #include "../BrickWall.hpp" 17 | #include "../Polymorph.hpp" 18 | #include "../TargetGenerator.hpp" 19 | #include "../Fireball.hpp" 20 | 21 | int main(void) 22 | { 23 | Warlock richard("Richard", "foo"); 24 | richard.setTitle("Hello, I'm Richard the Warlock!"); 25 | BrickWall model1; 26 | 27 | Polymorph* polymorph = new Polymorph(); 28 | TargetGenerator tarGen; 29 | 30 | tarGen.learnTargetType(&model1); 31 | richard.learnSpell(polymorph); 32 | 33 | Fireball* fireball = new Fireball(); 34 | 35 | richard.learnSpell(fireball); 36 | 37 | ATarget* wall = tarGen.createTarget("Inconspicuous Red-brick Wall"); 38 | 39 | richard.introduce(); 40 | richard.launchSpell("Polymorph", *wall); 41 | richard.launchSpell("Fireball", *wall); 42 | 43 | return 0; 44 | } 45 | -------------------------------------------------------------------------------- /Exam_rank_05/cpp_module_02/tests/subject_output.txt: -------------------------------------------------------------------------------- 1 | Richard: This looks like another boring day.$ 2 | Richard: I am Richard, Hello, I'm Richard the Warlock!!$ 3 | Inconspicuous Red-brick Wall has been turned into a critter!$ 4 | Inconspicuous Red-brick Wall has been burnt to a crisp!$ 5 | Richard: My job here is done!$ 6 | -------------------------------------------------------------------------------- /Exam_rank_06/mini_serv.c: -------------------------------------------------------------------------------- 1 | /* ************************************************************************** */ 2 | /* */ 3 | /* ::: :::::::: */ 4 | /* mini_serv.c :+: :+: :+: */ 5 | /* +:+ +:+ +:+ */ 6 | /* By: adbenoit <adbenoit@student.42.fr> +#+ +:+ +#+ */ 7 | /* +#+#+#+#+#+ +#+ */ 8 | /* Created: 2021/12/02 13:50:09 by adbenoit #+# #+# */ 9 | /* Updated: 2022/04/14 15:20:52 by adbenoit ### ########.fr */ 10 | /* */ 11 | /* ************************************************************************** */ 12 | 13 | #include <string.h> 14 | #include <stdio.h> 15 | #include <unistd.h> 16 | #include <sys/socket.h> 17 | #include <netinet/in.h> 18 | #include <stdlib.h> 19 | #include <sys/select.h> 20 | #include <fcntl.h> 21 | 22 | typedef struct s_client 23 | { 24 | int id; 25 | int fd; 26 | char *buffer; 27 | struct s_client *next; 28 | } t_client; 29 | 30 | fd_set fd_all; // all descriptors (server and clients) 31 | fd_set fd_rd; // descriptors ready for reading 32 | fd_set fd_wr; // descriptors ready for writing 33 | 34 | /**** begin of subject functions ****/ 35 | int extract_message(char **buf, char **msg) 36 | { 37 | char *newbuf; 38 | int i; 39 | 40 | *msg = 0; 41 | if (*buf == 0) 42 | return (0); 43 | i = 0; 44 | while ((*buf)[i]) 45 | { 46 | if ((*buf)[i] == '\n') 47 | { 48 | newbuf = calloc(1, sizeof(*newbuf) * (strlen(*buf + i + 1) + 1)); 49 | if (newbuf == 0) 50 | return (-1); 51 | strcpy(newbuf, *buf + i + 1); 52 | *msg = *buf; 53 | (*msg)[i + 1] = 0; 54 | *buf = newbuf; 55 | return (1); 56 | } 57 | i++; 58 | } 59 | return (0); 60 | } 61 | 62 | char *str_join(char *buf, char *add) 63 | { 64 | char *newbuf; 65 | int len; 66 | 67 | if (buf == 0) 68 | len = 0; 69 | else 70 | len = strlen(buf); 71 | newbuf = malloc(sizeof(*newbuf) * (len + strlen(add) + 1)); 72 | if (newbuf == 0) 73 | return (0); 74 | newbuf[0] = 0; 75 | if (buf != 0) 76 | strcat(newbuf, buf); 77 | free(buf); 78 | strcat(newbuf, add); 79 | return (newbuf); 80 | } 81 | /**** end of subject funtions ****/ 82 | 83 | /* Clear client_lst and close fds */ 84 | void exit_error(char *str, t_client *client_lst) 85 | { 86 | t_client *tmp; 87 | 88 | tmp = client_lst; 89 | while (client_lst) 90 | { 91 | tmp = tmp->next; 92 | close(client_lst->fd); 93 | free(client_lst->buffer); 94 | free(client_lst); 95 | client_lst = tmp; 96 | } 97 | write(STDERR_FILENO, str, strlen(str)); 98 | exit(1); 99 | } 100 | 101 | /* Send the message to all clients */ 102 | void send_message(char *msg, t_client *client_lst, t_client *sender) 103 | { 104 | while (client_lst) 105 | { 106 | if (client_lst != sender && FD_ISSET(client_lst->fd, &fd_wr)) 107 | send(client_lst->fd, msg, strlen(msg), 0); 108 | client_lst = client_lst->next; 109 | } 110 | } 111 | 112 | /* Adds a client to the list and informs the others of his arrival. */ 113 | t_client *add_newclient(t_client *client_lst, int fd, int id) 114 | { 115 | t_client *newcli, *last; 116 | char str[1000]; 117 | 118 | newcli = (t_client *)malloc(sizeof(t_client)); 119 | if (!newcli) 120 | exit_error("Fatal Error\n", client_lst); 121 | newcli->id = id; 122 | newcli->fd = fd; 123 | newcli->buffer = NULL; 124 | newcli->next = NULL; 125 | FD_SET(fd, &fd_all); 126 | sprintf(str, "server: client %d just arrived\n", id); 127 | send_message(str, client_lst, newcli); 128 | if (!client_lst) 129 | return (newcli); 130 | /* adds the new client at the back of the list */ 131 | last = client_lst; 132 | while (last->next) 133 | last = last->next; 134 | last->next = newcli; 135 | return (client_lst); 136 | } 137 | 138 | /* Removes a client from the list, disconnect him and informs the others. */ 139 | t_client *remove_client(t_client *client_lst, t_client *rmcli) 140 | { 141 | char str[1000]; 142 | t_client *prev; 143 | 144 | if (client_lst == rmcli) 145 | client_lst = rmcli->next; 146 | else 147 | { 148 | prev = client_lst; 149 | while (prev->next != rmcli) 150 | prev = prev->next; 151 | prev->next = rmcli->next; 152 | } 153 | sprintf(str, "server: client %d just left\n", rmcli->id); 154 | send_message(str, client_lst, rmcli); 155 | FD_CLR(rmcli->fd, &fd_all); 156 | close(rmcli->fd); 157 | free(rmcli->buffer); 158 | free(rmcli); 159 | return (client_lst); 160 | } 161 | 162 | /* Receives the entire message. Returns his size. */ 163 | ssize_t receive_message(t_client *client_lst, t_client *curr_cli) 164 | { 165 | ssize_t size, ret; 166 | char buffer[1001]; 167 | 168 | size = 0; 169 | while ((ret = recv(curr_cli->fd, buffer, 1000, 0)) > 0) 170 | { 171 | size += ret; 172 | buffer[ret] = 0; 173 | curr_cli->buffer = str_join(curr_cli->buffer, buffer); 174 | if (!curr_cli->buffer) 175 | exit_error("Fatal Error\n", client_lst); 176 | } 177 | if (size == 0 && ret == -1) 178 | return (-1); 179 | return (size); 180 | } 181 | 182 | /* Check if a client sent a message and resend it to all other clients. */ 183 | t_client *handle_clients(t_client *client_lst) 184 | { 185 | char *msg, *str; 186 | ssize_t ret; 187 | t_client *it, *curr_cli; 188 | 189 | it = client_lst; 190 | while (it) 191 | { 192 | curr_cli = it; 193 | it = curr_cli->next; 194 | /* message receives from curr_cli */ 195 | if (FD_ISSET(curr_cli->fd, &fd_rd)) 196 | { 197 | ret = receive_message(client_lst, curr_cli); 198 | /* client disconnects */ 199 | if (ret == 0) 200 | client_lst = remove_client(client_lst, curr_cli); 201 | /* resend messsage line by line */ 202 | else if (ret > 0) 203 | { 204 | while ((ret = extract_message(&curr_cli->buffer, &msg)) == 1) 205 | { 206 | if (!(str = malloc(sizeof(char) * (20 + strlen(msg))))) 207 | exit_error("Fatal Error\n", client_lst); 208 | sprintf(str, "client %d: %s", curr_cli->id, msg); 209 | send_message(str, client_lst, curr_cli); 210 | free(msg); 211 | free(str); 212 | } 213 | if (ret == -1) 214 | exit_error("Fatal Error\n", client_lst); 215 | } 216 | } 217 | } 218 | return (client_lst); 219 | } 220 | 221 | /* handle connections on the server and processes it. */ 222 | void handle_server(int sockfd) 223 | { 224 | int connfd, maxfd, client_id; 225 | t_client *client_lst; 226 | 227 | FD_ZERO(&fd_all); 228 | FD_SET(sockfd, &fd_all); 229 | client_lst = NULL; 230 | maxfd = sockfd; 231 | client_id = 0; 232 | while (1) 233 | { 234 | fd_rd = fd_all; 235 | fd_wr = fd_all; 236 | /* select ready fds */ 237 | if (select(maxfd + 1, &fd_rd, &fd_wr, NULL, NULL) < 0) 238 | continue ; 239 | /* new connection */ 240 | else if (FD_ISSET(sockfd, &fd_rd)) 241 | { 242 | connfd = accept(sockfd, NULL, NULL); 243 | if (connfd >= 0) 244 | { 245 | // fcntl(connfd, F_SETFL, O_NONBLOCK); 246 | client_lst = add_newclient(client_lst, connfd, client_id); 247 | maxfd = connfd > maxfd ? connfd : maxfd; 248 | ++client_id; 249 | } 250 | } 251 | else 252 | client_lst = handle_clients(client_lst); 253 | } 254 | } 255 | 256 | int main(int ac, char **av) 257 | { 258 | int port, sockfd; 259 | struct sockaddr_in servaddr; 260 | 261 | if (ac < 2) 262 | exit_error("Wrong number of arguments\n", NULL); 263 | port = atoi(av[1]); 264 | /* Setup server */ 265 | sockfd = socket(AF_INET, SOCK_STREAM, 0); 266 | if (sockfd == -1) 267 | exit_error("Fatal Error\n", NULL); 268 | bzero(&servaddr, sizeof(servaddr)); 269 | servaddr.sin_family = AF_INET; 270 | servaddr.sin_addr.s_addr = htonl(2130706433); // 127.0.0.1 271 | servaddr.sin_port = htons(port); 272 | if (bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr))) 273 | exit_error("Fatal Error\n", NULL); 274 | if (listen(sockfd, 10) != 0) 275 | exit_error("Fatal Error\n", NULL); 276 | handle_server(sockfd); 277 | return (0); 278 | } 279 | -------------------------------------------------------------------------------- /Exam_rank_06/subject/main.c: -------------------------------------------------------------------------------- 1 | #include <errno.h> 2 | #include <netdb.h> 3 | #include <sys/socket.h> 4 | #include <netinet/in.h> 5 | #include <string.h> 6 | #include <unistd.h> 7 | 8 | int extract_message(char **buf, char **msg) 9 | { 10 | char *newbuf; 11 | int i; 12 | 13 | *msg = 0; 14 | if (*buf == 0) 15 | return (0); 16 | i = 0; 17 | while ((*buf)[i]) 18 | { 19 | if ((*buf)[i] == '\n') 20 | { 21 | newbuf = calloc(1, sizeof(*newbuf) * (strlen(*buf + i + 1) + 1)); 22 | if (newbuf == 0) 23 | return (-1); 24 | strcpy(newbuf, *buf + i + 1); 25 | *msg = *buf; 26 | (*msg)[i + 1] = 0; 27 | *buf = newbuf; 28 | return (1); 29 | } 30 | i++; 31 | } 32 | return (0); 33 | } 34 | 35 | char *str_join(char *buf, char *add) 36 | { 37 | char *newbuf; 38 | int len; 39 | 40 | if (buf == 0) 41 | len = 0; 42 | else 43 | len = strlen(buf); 44 | newbuf = malloc(sizeof(*newbuf) * (len + strlen(add) + 1)); 45 | if (newbuf == 0) 46 | return (0); 47 | newbuf[0] = 0; 48 | if (buf != 0) 49 | strcat(newbuf, buf); 50 | free(buf); 51 | strcat(newbuf, add); 52 | return (newbuf); 53 | } 54 | 55 | 56 | int main() { 57 | int sockfd, connfd, len; 58 | struct sockaddr_in servaddr, cli; 59 | 60 | // socket create and verification 61 | sockfd = socket(AF_INET, SOCK_STREAM, 0); 62 | if (sockfd == -1) { 63 | printf("socket creation failed...\n"); 64 | exit(0); 65 | } 66 | else 67 | printf("Socket successfully created..\n"); 68 | bzero(&servaddr, sizeof(servaddr)); 69 | 70 | // assign IP, PORT 71 | servaddr.sin_family = AF_INET; 72 | servaddr.sin_addr.s_addr = htonl(2130706433); //127.0.0.1 73 | servaddr.sin_port = htons(8081); 74 | 75 | // Binding newly created socket to given IP and verification 76 | if ((bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr))) != 0) { 77 | printf("socket bind failed...\n"); 78 | exit(0); 79 | } 80 | else 81 | printf("Socket successfully binded..\n"); 82 | if (listen(sockfd, 10) != 0) { 83 | printf("cannot listen\n"); 84 | exit(0); 85 | } 86 | len = sizeof(cli); 87 | connfd = accept(sockfd, (struct sockaddr *)&cli, &len); 88 | if (connfd < 0) { 89 | printf("server acccept failed...\n"); 90 | exit(0); 91 | } 92 | else 93 | printf("server acccept the client...\n"); 94 | } 95 | -------------------------------------------------------------------------------- /Exam_rank_06/subject/subject.en.txt: -------------------------------------------------------------------------------- 1 | Assignment name : mini_serv 2 | Expected files : mini_serv.c 3 | Allowed functions: write, close, select, socket, accept, listen, send, recv, bind, strstr, malloc, 4 | realloc, free, calloc, bzero, atoi, sprintf, strlen, exit, strcpy, strcat, memset 5 | -------------------------------------------------------------------------------- 6 | 7 | Write a program that will listen for client to connect on a certain port on 127.0.0.1 and will let clients 8 | to speak with each other 9 | 10 | This program will take as first argument the port to bind to 11 | If no argument is given, it should write in stderr "Wrong number of arguments" followed by a \n and exit 12 | with status 1 13 | If a System Calls returns an error before the program start accepting connection, it should write in stderr 14 | "Fatal error" followed by a \n and exit with status 1 15 | If you cant allocate memory it should write in stderr "Fatal error" followed by a \n and exit with status 1 16 | 17 | Your program must be non-blocking but client can be lazy and if they don't read your message 18 | you must NOT disconnect them... 19 | 20 | Your program must not contains #define preproc 21 | Your program must only listen to 127.0.0.1 22 | The fd that you will receive will already be set to make 'recv' or 'send' to block if select hasn't 23 | be called before calling them, but will not block otherwise. 24 | 25 | When a client connect to the server: 26 | - the client will be given an id. the first client will receive the id 0 and each new client will 27 | received the last client id + 1 28 | - %d will be replace by this number 29 | - a message is sent to all the client that was connected to the server: "server: client %d just arrived\n" 30 | 31 | clients must be able to send messages to your program. 32 | - message will only be printable characters, no need to check 33 | - a single message always end with a \n 34 | - a single message will never be longer than 4096 characters 35 | - when the server receive a message, it must resend it to all the other client with "client %d: " 36 | before the message 37 | 38 | When a client disconnect from the server: 39 | - a message is sent to all the client that was connected to the server: "server: client %d just left\n" 40 | 41 | Memory or fd leaks are forbidden 42 | 43 | To help you, you will find the file main.c with the beginning of a server and maybe some useful functions. 44 | (Beware this file use forbidden functions or write things that must not be there in your final program) 45 | 46 | You also have a nc executable in the subject folder which only connects to localhost in order to test 47 | your server. 48 | 49 | Warning our tester is expecting that you send the messages as fast as you can. Don't do un-necessary buffer. 50 | 51 | Evaluation can be a bit longer than usual... 52 | 53 | Hint: you can use nc to test your program 54 | Hint: you should use nc to test your program 55 | Hint: To test you can use fcntl(fd, F_SETFL, O_NONBLOCK) but use select and NEVER check EAGAIN (man 2 send) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # EXAMS (@42Paris) 2 | *42 exams of the new cursus* 3 | 4 | ## ✅ Exam Rank 03 5 | 6 | ### Subject 7 | 8 | Write a program that will read an "operation file" and print the result in the terminal. 9 | 10 | *(see more in Exam_rank_03/\*/subject.en.txt)* 11 | 12 | ## ✅ Exam Rank 04 13 | 14 | ### Subject 15 | 16 | Write a program that will behave like executing a shell command. 17 | 18 | *(see more in Exam_rank_04/subject/subject.en.txt)* 19 | 20 | ## ✅ Exam Rank 05 21 | 22 | ### Subject 23 | 24 | Create some classes like the piscine CPP. 25 | 26 | *(see more in Exam_rank_05/\*/subject.en.txt)* 27 | 28 | ### Tester 29 | ``` 30 | $ cd Exam_rank_05/[cpp_module] 31 | $ ./tester.sh 32 | ``` 33 | ## ✅ Exam Rank 06 34 | 35 | ### Subject 36 | 37 | Write a program that will listen for client to connect on a certain port on 127.0.0.1 and will let clients to speak with each other. 38 | 39 | *(see more in Exam_rank_06/subject/subject.en.txt)* 40 | --------------------------------------------------------------------------------