diff --git a/.gitignore b/.gitignore index e318427..29bf5b9 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,7 @@ # Vim temp *.swp + +CMakeLists.txt +.idea/ +**/cmake-build-debug/* diff --git a/Makefile b/Makefile index 54405ef..8605c7b 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: gtertysh +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2016/12/14 16:54:48 by gtertysh #+# #+# # -# Updated: 2016/12/14 18:41:33 by gtertysh ### ########.fr # +# Updated: 2016/12/15 22:08:42 by ykolomie ### ########.fr # # # # **************************************************************************** # @@ -43,12 +43,14 @@ LIBFOLDER = ./libft/ FLAGS = -Werror -Wextra -Wall +STACK = -Wl,-stack_size -Wl,0x10000000000 + CC = clang all: $(NAME) $(NAME): $(OBJ) $(LIBFOLDER)$(LIB) - $(CC) $(FLAGS) $(OBJ) $(LIBFLAGS) -o $(NAME) + $(CC) $(FLAGS) $(STACK) $(OBJ) $(LIBFLAGS) -o $(NAME) $(OBJDIR)%.o : $(SRCDIR)%.c $(CC) $(FLAGS) $(INC) -c $< -o $@ diff --git a/src/fillit.c b/src/fillit.c index ca680c3..01a3ca2 100644 --- a/src/fillit.c +++ b/src/fillit.c @@ -1,4 +1,4 @@ -#include "fillit.h" +#include "../inc/fillit.h" unsigned int ft_sqrt_ceil(unsigned int num) { @@ -26,7 +26,7 @@ void convert_tetramino(char *s, t_map *map, int index) int y; int sharp_count; - map->figure[index]->offset_y = 0; + map->figure[index].offset_y = 0; sharp_count = 0; i = 0; y = 1; @@ -41,10 +41,10 @@ void convert_tetramino(char *s, t_map *map, int index) } temp = temp << 12; - map->figure[index]->line[y - 1] = temp; + map->figure[index].line[y - 1] = temp; y++; } - map->figure[index]->height = y - 1; + map->figure[index].height = y - 1; } void map_initialization(char **tetramino_table, t_map *map) @@ -58,6 +58,7 @@ void map_initialization(char **tetramino_table, t_map *map) map->size = ft_sqrt_ceil(i * 4); map->mask = 1; map->mask <<= 16 - map->size; + map->ok = 0; clear_map(map); } @@ -111,32 +112,60 @@ int can_insert(t_map *map, int index) } return (1); } + int shift_tetramino(t_map *map, int index) { - int left_shift; - int i; - int k; + int right_shift; + unsigned int i; + unsigned int k; t_tetrominoes *temp; temp = &map->figure[index]; i = temp->offset_y; k = i + temp->height; - left_shift = 1; + right_shift = 1; while (i < k) if (temp->line[i++] & map->mask) - left_shift = 0; + right_shift = 0; i = temp->offset_y; - if (left_shift) + if (right_shift && ++(temp->offset_x)) while (i < k) temp->line[i++] >>= 1; - else if (k < map->size) - while(k-- > i) - { - while (!(temp->line[k] & 0x8000)) - temp->line[k] <<= 1; - temp->line[k + 1] = temp->line[k]; - } + else if (k < map->size && ++(temp->offset_y)) { + while (k-- > i) { + temp->line[k] <<= temp->offset_x; + temp->line[k + 1] = temp->line[k]; + } + temp->offset_x = 0; + } else return (0); return (1); -} +} + + +t_map algorithm(t_map map, unsigned int index) +{ + int ins = 0; + t_map copy; + + if (index == map.figure_amount) { + map.ok = 1; + return map; + } + while (!(ins = can_insert(&map, index))) + if (!shift_tetramino(&map, index)) + break; + if (ins) + { + copy = map; + insert_tetramino(&map, index); + map = algorithm(map, index + 1); + if (!map.ok) + { + shift_tetramino(©, index); + map = algorithm(copy, index); + } + } + return map; +} \ No newline at end of file diff --git a/src/glue_figure.c b/src/glue_figure.c index f3719ad..2cf8bdc 100644 --- a/src/glue_figure.c +++ b/src/glue_figure.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "fillit.h" +#include "../inc/fillit.h" // This function creates string table in which one line represent one figure // by "glueing" evry 4 strings from table diff --git a/src/main.c b/src/main.c index e9610f4..7f21301 100644 --- a/src/main.c +++ b/src/main.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "fillit.h" +#include "../inc/fillit.h" // bad global variable t_tetrominoes_templates templates[19] = @@ -113,42 +113,40 @@ t_tetrominoes_templates templates[19] = int main(int argc, char **argv) { - char *string; - char **table; - char **ttr; - int i; - + char *string; + char **table; + char **ttr; + int i; + t_map map; + t_map copy; + unsigned int size_map; + i = 0; if (argc != 2) { ft_putstr("error\n"); return (1); } - string = read_file(argv[1]); if (!(string = read_file(argv[1]))) { ft_putstr("error\n"); return (1); } - printf("string:\n\n\n%s\n", string); table = to_table(&string); - printf("print_table:\n\n\n"); - print_table(table); - ttr = glue_figure(table); - printf("glued figures:\n\n\n"); - print_one_string(ttr); - move_up_left(ttr); - printf("move to up left:\n\n\n"); - print_one_string(ttr); - - printf("test check:\n\n"); - test_check(ttr, templates); - - to_letters(ttr); - printf("to latters:\n\n"); print_one_string(ttr); + + map_initialization(ttr, &map); + size_map = map.size; + copy = map; + while (!map.ok) + { + map = copy; + map.size = size_map++; + map = algorithm(map, 0); + } + return (0); } diff --git a/src/move_up_left.c b/src/move_up_left.c index 3fa1129..7f6b5e3 100644 --- a/src/move_up_left.c +++ b/src/move_up_left.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "fillit.h" +#include "../inc/fillit.h" // Moves figures to top left corner. // table contains strings each represent one figure diff --git a/src/read_file.c b/src/read_file.c index 6dfb512..baacc41 100644 --- a/src/read_file.c +++ b/src/read_file.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "fillit.h" +#include "../inc/fillit.h" // read from file. Returns string. char *read_file(char *path) @@ -32,7 +32,7 @@ char *read_file(char *path) string = ft_memalloc(sizeof(char) * BUF_S); while ((readed = read(fd, buf, BUF_S))) { - buf[BUF_S] = '\0'; + buf[readed] = '\0'; old_size = ft_strlen(string); string = ft_realloc(string, old_size + readed, old_size); ft_strcat(string, buf); diff --git a/src/string_to_table.c b/src/string_to_table.c index 0ec55df..3cbc19f 100644 --- a/src/string_to_table.c +++ b/src/string_to_table.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "fillit.h" +#include "../inc/fillit.h" // Split string to table by newline character. // Each string contain one line of the file diff --git a/src/test!_check.c b/src/test!_check.c index 373200e..c339854 100644 --- a/src/test!_check.c +++ b/src/test!_check.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "fillit.h" +#include "../inc/fillit.h" // Test func. Compare figures from file // with templates diff --git a/src/test!_print_one_string.c b/src/test!_print_one_string.c index d7baab5..9ec7c9f 100644 --- a/src/test!_print_one_string.c +++ b/src/test!_print_one_string.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "fillit.h" +#include "../inc/fillit.h" // Test func. Print table but one string contain whole figure. void print_one_string(char **glued) diff --git a/src/test!_print_table.c b/src/test!_print_table.c index 624c77d..475b8e2 100644 --- a/src/test!_print_table.c +++ b/src/test!_print_table.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "fillit.h" +#include "../inc/fillit.h" // Test func. Print string table, // each line - line of tetromino figure. diff --git a/src/to_letters.c b/src/to_letters.c index 0789572..76a187d 100644 --- a/src/to_letters.c +++ b/src/to_letters.c @@ -10,7 +10,7 @@ /* */ /* ************************************************************************** */ -#include "fillit.h" +#include "../inc/fillit.h" // convert "#" symbols to letters // rewrite for new method with structures diff --git a/tests/sample.fillit b/tests/sample.fillit index ffe4faf..84e79f4 100644 --- a/tests/sample.fillit +++ b/tests/sample.fillit @@ -18,27 +18,4 @@ .##. .... -.... -..#. -.##. -.#.. -.... -.... -.##. -##.. - -.... -.... -..## -.##. - -.... -...# -...# -..## - -.... -.... -...# -.### \ No newline at end of file diff --git a/tests/sample1.fillit b/tests/sample1.fillit new file mode 100644 index 0000000..5b65dda --- /dev/null +++ b/tests/sample1.fillit @@ -0,0 +1,19 @@ +#### +.... +.... +.... + +.... +##.. +.#.. +.#.. + +..#. +###. +.... +.... + +.... +##.. +##.. +....