From acf5aed90e6db5f7f04e6aa029870fab031e1dba Mon Sep 17 00:00:00 2001 From: Manzovince Date: Tue, 23 Apr 2019 15:34:21 +0200 Subject: [PATCH] gitignore, makefile, .h edited --- .gitignore | 2 + Makefile | 9 +- fillit | Bin 13644 -> 0 bytes fillit.h | 10 +- test_fillit.c | 272 ++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 282 insertions(+), 11 deletions(-) delete mode 100755 fillit create mode 100644 test_fillit.c diff --git a/.gitignore b/.gitignore index 862bf81..a5cf236 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,5 @@ a\.out *.swo *.swp + +fillit diff --git a/Makefile b/Makefile index eb91318..6a9955a 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: vmanzoni +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2019/03/01 13:24:35 by vmanzoni #+# #+# # -# Updated: 2019/04/22 15:32:49 by vmanzoni ### ########.fr # +# Updated: 2019/04/23 15:16:05 by vmanzoni ### ########.fr # # # # **************************************************************************** # @@ -19,9 +19,10 @@ SRCS = main.c \ read_file.c \ handle_errors.c \ parse_input.c \ - get_smallest_square.c \ - print_fillit.c \ - add_to_list.c + add_to_list.c \ +# get_smallest_square.c \ + print_fillit.c + OBJS = $(SRCS:.c=.o) LIB = libft/ diff --git a/fillit b/fillit deleted file mode 100755 index bd83e4664cda6bc6500306b7fc2675578ceea191..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13644 zcmeHOeQX@X6`wm_l1pm34g{LEkQ{{2grtrW0)mjxb79j>!EhG{BW>qAy6stVC6mHI(HR05)v+d{CD5WA>qOywe1N}FrtB)f2}T=7vSL|lJw zW^TQAHdX)XAJvV#GxOe?dGkJI-ptLePhI@`hl?2V)G*fTWsE6!LJJtnumEa|eG-p` zN7qA*Ur--ZzjPmA%af-ZoEIWKlW3^xyVM7El{ex21LZh5JcDcu;_!!B=z21`KS?!_ zD*5e!0>p1CDS||>PgF(jW4&%r*AvN}mV|?<UieeiM@4S7m#G$?i^?BVQzu?2dKpl?^KS-LX>0SJHrBcPirzg0A;;JR0k0)ngrP zog6Or$4inQ`J58Ll{^GRJ2FmPE;CgsaqdPoP{rYUAcdW4ROgL9EkzcHDcnde@H98f&QV z17J$`(4s;jx!k<2Lmc2ukdbZtC~u{PG6ezmqCSi=fQ~dbmJ@9gW1m9t?oEt606f_) zM0h0PPtV8k(6V&f6<}F9jQ&@aVFW;Z19-@W8+sDm8{)B+4Xp>_t$-mmcX5{*N86ODBAZhg~7S~z24 z{QD0ilF@zjpRb1;u@*E!x&aT3m)|JlT`OU-Pc>C7P_;nS0#yrCEl{;U)dE!u{Qp~^ zSu@UR=|WI5Qq!8zV~wg4q_k%CSmt&=73&tJhdqXRTA*qFb~gR^piX%G}AW*-jgSNer7gLq>p)w<_Y_mVzCIFkQX-& z_m5yeE;$X`-*igJ(K-5vXH*@h7X9j}ta|D>kCLHZA2vy4ZFpp0~icC z4cRPnX-)Hl7I~cyPVi1&P4hSq!R%&Ok84|!Y&_V%*>4}gIQGNHIMq;RP|j%S6T#ib zm6bup{b8hL;0p{u&n=@1NwyNO-B$+T_dQ7?8g8#8XjCmwLF#H|GdNtH-s0`c3bjKQ)Y$tY9%`5Q4C-7gvkBc7n@h=Cum-%N|y_Hqpa#+#NDN`+Qs~7B_L1lYAvUyZH z=z}V@lG}+Mv*X%ICMXeZ-GHVaJVG}VLcN_n(r>2^3YLpxXI0w~Nk_*D?JOlnzo$66 zNK-*h0y3Ev+2JeaWo1>%;Z?5QPf5KsLOtYsqLw^&(9imt&MO07mfFCqMM7lg$295t zA|`KvetExt49)|APhI*M>Gt4GfBIO_*y(qC7^<1I{Q0bU-Vv=*O$>id8F17TCWCsI z-F&@Oc=23TJ?HRp)GQim!RBfPK0?h}jB~b9&9fh+CI}U32A4bDtmUfK&hh5ita{cF zZ5}nJTx!noW^K7Qr?Tpl!|Nl|qy;V3bGi^1q95JH2*Rvb+K6wb7Q;um9t-i((#+J1 z#V+xvV3{FAS=Cw>qIrqhv=M@KD)1CitaWt``f8$@oI0&MAL5`93J^Dn)7FZM#p18& zYJ(fcX!IN72sMG-$J>;ZeL%C4d<{bl0Jwa78=&~Rf#h>yIR(m5^%C{5??*VQEd+MmVW*+aW`p&Y4{1$bA_=j>nCc}+*RcEe z;B1onQ(%ZLIk@%A9_W^uG1PZyzp}pPN2Ex-OX_OIG3(m^U*#G@a;ptc8>RX(eX-Zc zs4%Kp;7ig@WA7;RZuK*z@0<%G++MHr(FJR%nVbts-?ej)OO!roDH6hdZJq`h*cHLe z;=v7O5JL-|OOy=lI)pTv3h5E-t#2qtYwOY%AXm^$@j4U;Czq$_GfP=jE)3ll%?4FJ zR$@A3`IG_LrVpj8LnxG|+|twKoAfz+Q#POJyijh#QFRK<9UBQ#(k)-PhO3l}ST9n4 zd)1sK^@=pn6gSZnkGivh)0WN!&s>eJ>C{xMlDV8SNljbp35ByqnHS3S5Gz1g*^8#7 z{kEh_Nme2KpU|L$aV7%Y{*@!)G$#b$q*Sn)r)IoLMlO4--u-^-o7i)B zf#mvc7+Ql7 zM0_euG=!)D9CT)dC_8SxCk$jEDg{t=jzh{(FJ$U(IwPhCo&EB#2F`wGvg#QprvDsW zh9DI)My(rY6fDI`Q7(5{E{(tS_4NYJZ+yrD^o2kkd=Tqui5h?!l-ke zOcz3$xnP8=LH5EHl$vx-`syTxo)9zs$B+_-VdPj?<5wuTdLj0t*)(CiPRArV?*22F z-P&L_jY|y9yCcE=#}?%6F_I&f%AZu(501gU zV^-&dB2Ee?pa~br35jBL$&1Y2)XrR>aSGZr&1kocDVc?k0@FOS`?&QhECOe)Q^ncu zK$v&GdjSO3e)k+ecr;&HHoX6#LI~#A_&&z|9T!eI{gpgiqM5va;JeV*$efmL8lV&O z5JN}fn3l^;18u%SM9uiUbu%>`HC~yd#zm$KTuGjpd*hq znz4XDjoIHISoAsBw}1vnvmH6j?_%SJn}Rl`)ljWUr;4| z(qr(7J;d!T8|8?`e++UhEU^{kxOhg6gfcQGkb^4$mhc&G6G3nvod-UdeDZ zOb%#=PLO5cI8vy%`VsUfuHMh{gFJtX=U?M_FVDZu^FE$GfgJC)a@TwomB#yvtFJ*h z*iK0M9E5MD*E#lSs;#ElAE>sGYP7Q2KSwp1eC>Br?Io(w4+HxrREtvWFx3)N`xa_y zcXwy^mcX5zJ@M8+M`tq79Syez+G6o&{SqdLJ31Z-$72q*IT79)-4Y1Jqv1p}kmzaI z7fS}h6@7L^@y>T&tfP}N<^Ai~>ckR;mssLm8g0##+$A01=zTZsYV>>u@0KZ19ZLl7 z&OCTG#Z5$Lr$RtwnnGV{@DEwe$kMw~;A>@hl`I3Yyit~$Wm(C$3Rf*qwLsMZRSQ%t zP_;nS0#yrCEl{;U)dE!uR4q`o!2jL?ORrl_HymtfP^VAV!;y#dNc%(j-kxxGE8E#! zHyEUkZ23p>dJDcA$4BkG7H&Rx@(i->lCVoP{(KRanbGpK#z9ElEj*Mbo_6?B7I*w z28c#_l2LqnA0{!iwivr7+}f%qJN0-hkz|Iai#_Fuu-|z0g<~D;2`_Qi>9U4BgUdhsH~+a86v*@OpzK<>oDFnW}kXih@u zyibC?gHE^&DuFW?czivE8{FX8#14T~zJbKpgsgWnvf*0@ybalrE%*+3#bC|&qQjoU zp3ty&+%xDM^bC8C)C5UgN_XOt=i`eR+Y=D?I%EgMLsxPFzKX-3;3ow9MG5c0O&ig53Dd{n1b0Yyc$t6?NVxQW8(9fYLj-F7T?y0o*#v)I!a;oS zP4Ej6W>TJ`5}wAz7|~ysaKkkM{v%-EiNw=+8mQ>brtZY3YgyY(#r{Y0e1x+n2moQPkw>P`S +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/01 13:34:46 by vmanzoni #+# #+# */ -/* Updated: 2019/04/22 15:57:43 by vmanzoni ### ########.fr */ +/* Updated: 2019/04/23 14:25:15 by vmanzoni ### ########.fr */ /* */ /* ************************************************************************** */ @@ -16,14 +16,10 @@ #include #include // for system call write #include // for system call open -#include // for memmove and strlen -#include // for debug printf -#include // to use bool type +#include // for printf (DELETE BEFORE EVAL) #include "libft/includes/libft.h" -//# define BUFF_SIZE 1024 - /* ** STRUCTURE */ @@ -45,7 +41,7 @@ void print_error(char *s); void parse_input(char *input); int check_file_errors(char *file); int check_tetri_errors(char *tetri); -int check_tetri_errors2(char *tetri); +int check_tetri_errors_proxy(char *tetri); int add_to_list(char *square, t_fillist **list); int fill_list(char *line, t_fillist *list); diff --git a/test_fillit.c b/test_fillit.c new file mode 100644 index 0000000..3704f2e --- /dev/null +++ b/test_fillit.c @@ -0,0 +1,272 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* test_fillit.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: vmanzoni +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2019/04/22 16:05:59 by vmanzoni #+# #+# */ +/* Updated: 2019/04/23 13:57:22 by vmanzoni ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include +#include // for system call write +#include // for system call open +#include // for memmove and strlen +#include // for debug printf +#include // to use bool type + +#include "libft/includes/libft.h" + +/* +** STRUCTURE +*/ + +typedef struct s_fillist +{ + int tetribit; + int position; + struct s_fillist *next; +} t_fillist; + +/* +** Function that display error message *s on fd and exit program +*/ + +void print_error(char *s) +{ + write(2, s, strlen(s)); + exit(1); +} + +/* +** Function that read file +*/ + +char *read_file(char *file) +{ + char buf[BUFF_SIZE]; + int fd; + int rv; + int i; + char *result; + + if (((fd = open(file, O_RDONLY)) < 0) \ + || ((rv = read(fd, &buf, BUFF_SIZE)) < 0) \ + || !(result = malloc(sizeof(char) * rv))) + return (NULL); + buf[rv] = '\0'; + i = -1; + while (buf[++i]) + result[i] = buf[i]; + result[i] = '\0'; + close(fd); + return (result); +} + +/* +** Function to see if there if an error if the file +** - less than 4 lines +** - more than 104 (26 tetri) + 25 (\n) = 129 lines +** - two \n in a row +*/ + +int check_file_errors(char *file) +{ + int i; + int line_nbr; + + i = 0; + line_nbr = 0; + while (file[i]) + { + if (file[i] != '.' && file[i] != '#' && file[i] != '\n') + return (1); + if (file[i] == '\n') + line_nbr++; + if (file[i] == '\n' && file[i+1] != '\0' && \ + file[i+2] != '.' && file[i+2] != '#') + return (1); + i++; + } + if (line_nbr < 4 || line_nbr > 129) + return (1); + return (0); +} + +/* +** Function that check if tetrimino parts are linked +*/ + +int check_tetri_errors2(char *tetri) +{ + int i; + + i = 0; + while (tetri[i]) + { + if (tetri[i] == '.' || tetri[i] == '\n') + i++; + else if (tetri[i] == '#' && (tetri[i + 1] == '#' || tetri[i - 1] == '#' + || tetri[i + 5] == '#' || tetri[i - 5] == '#')) + i++; + else + return (1); + } + return (0); +} + +/* +** Function that check if tetrimino square contains: +** - 4 '#' +** - 12 '.' +*/ + +int check_tetri_errors(char *tetri) +{ + int i; + int htg; + int dot; + + i = 0; + htg = 0; + dot = 0; + while (tetri[i]) + { + if (tetri[i] == '#') + htg++; + else if (tetri[i] == '.') + dot++; + i++; + } + if (htg != 4 || dot != 12 || check_tetri_errors2(tetri)) + return (1); + return (0); +} + +/* +** Function that take char * tetri and convert to short and put it in a list +*/ + +int fill_list(char *line, t_fillist *list) +{ + short tmp; + short tet; + int i; + + i = -1; + tet = 0; + while (line[++i]) + { + tet <<= 1; + if (line[i] == '\n') + i++; + if (line[i] == '#') + tet |= 1; + } + return (0); +} + +/* +** this function create the linked list and add a new structure linked each time needed +*/ + +int add_to_list(char *line, t_fillist **list) +{ + t_fillist *tmp; + + if (!(tmp = (t_fillist*)malloc(sizeof(*tmp)))) + return (0); + if (!(*list)) + tmp->next = NULL; + else + tmp->next = *list; + *list = tmp; + fill_list(line, *list); + return (1); +} + +/* +** Function that parse a file and put each tetrimino in a linked list +*/ + +int parse_input(char *input, t_fillist list) +{ + //static t_fillist *list = NULL; + static int size; + char tetri[20]; + int i; + int j; + + i = 0; + size = 0; + while (input[i]) + { + j = 0; + while (j < 19) + tetri[j++] = input[i++]; + tetri[19] = '\0'; + if (check_tetri_errors(tetri)) + print_error("Error: Tetrimino not valid."); + add_to_list(tetri, &list); + while (input[i] == '\n') + i++; + size++; + } + printf("%i\n", size); + return (size); +} + +/* ***************************************************************************** +** Function that brute force with backtracking for smallest square with tetris +***************************************************************************** */ + +int get_smallest_square(t_fillist list, int size, unsigned int map[]) +{ + unsigned int mask; + int i; + int j; + + i = 0; + j = 0; + mask = map[size]; + while (list.next != NULL) + { + mask = (mask >> 1) | (((1 << (i % 32)) & map[j]) << (31 - (i % 32))); + if (!(list.tetribit & mask)) + return (1); + i++; + } + return (0); +} + +/* ***************************************************************************** +** MAIN +***************************************************************************** */ + +int main(int argc, char **argv) +{ + char *input; + int map; + int size; + t_fillist list; + + if (argc == 2) + { + if (!(input = read_file(argv[1]))) + print_error("Error: Could not read file.\n"); + if (check_file_errors(input)) + print_error("Error: Invalid file.\n"); + size = parse_input(input, list); + get_smallest_square(list, size, map); + /* + Backtracking for smallest square + Transform tetriminos with letters + Print result + */ + } + else + print_error("Usage: Please submit a file.\n"); + return (0); +}