diff --git a/recherche_de_carre/board.js b/recherche_de_carre/board.js new file mode 100644 index 0000000..bc73853 --- /dev/null +++ b/recherche_de_carre/board.js @@ -0,0 +1,279 @@ +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// fonctions utilitaires +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + + +function min(a,b) { + return a<b ? a : b; +} + +function col_to_str(col,the_board) { + var col_str=""; + for(var i_lines=0;i_lines<the_board.rows.length;i_lines++) { + col_str+=the_board.rows[i_lines][col]; + } + return col_str; +} + +function set_char_at(index,chr,str) { + if(index > str.length-1) return str; + return str.substring(0,index) + chr + str.substring(index+1); +} + +function get_random_char(str) { + return str[Math.floor(Math.random() * str.length)]; +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// fonctions métier +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// génération d'un board aléttoire +function generate_board(rows,cols) { + var occurences = "...............o."; + var board={rows:[]}; + for(i=0;i<cols;i++) { + str = ""; + for(j=0;j<rows;j++) { + str += get_random_char(occurences); + } + board.rows[i]=str; + } + return board; +} + + +// chercher la plus grande distance possible avant un o ou la fin de la chaine / la valeur d'arrêt +function get_distance_to_blocking_o(start,stop,str) { + //console.log("get_distance_to_blocking_o",start,stop,str); + //start+stop-1, -1 parce que le char est compté dans la la dimension du stop + var last_char_to_check = (stop < 0 ? str.length : min(start+stop-1,str.length)); + //var tmp_str=set_char_at(start,"|",str); + //var tmp_str2=set_char_at(last_char_to_check-1,"|",tmp_str); + //console.log("get_distance_to_blocking_o",start,last_char_to_check,tmp_str2); + + for(var i_char=start;i_char<last_char_to_check;i_char++) { + if(str[i_char]=="o") { + return(i_char-start); + } + } + return(last_char_to_check-start); +} + +// chercher le plus grand carré possible depuis un point (vers le bas / la droite) +function get_biggest_square_on_board_at(row,col,the_board,current_max_width=-1) { + // console.log("starting at ",row,col,current_max_width); + // si il n'y a pas de ligne row, ou pas de colonne col, on renvoie 0 + if(row >= the_board.rows.length || col >= the_board.rows[0].length) { + // console.log("out of bounds"); + return 0; + } + // si on est sur un o on renvoie 0 + if(the_board.rows[row][col] == "o") { + // console.log("got an o"); + return 0; + } + // on commence en se disant qu'on peut faire tout le reste du board en partant de notre position + // on cherche à la position actuelle jusqu'ou on peut aller en longeur et en largeur + // la longeur max est jusqu'au premier o qu'on trouve + var max_width = get_distance_to_blocking_o(col,current_max_width,the_board.rows[row]); + // console.log("max w",max_width); + // la hauter maximum est jusqu'au premier o qu'on trouve, pas besoin de chercher plus loin que la largeur max + // console.log("col : ",col," => ",col_to_str(col,the_board)); + var max_height = get_distance_to_blocking_o(row,current_max_width,col_to_str(col,the_board)); + // console.log("max h",max_height); + // la dimension max est le min des deux. + current_max_width = min(max_width,max_height); + // console.log(max_width,",",max_height, "=>",current_max_width); + // si c'est plus de 1, c'est à dire le plus petit carré possible, alors + // la dimension max est donc 1 + la dimension max de ce quon peut faire en descendant en diagonale dans le sous carré + if(current_max_width > 1) { + return 1 + get_biggest_square_on_board_at(row+1,col+1,the_board,current_max_width); + } + // sinon on est est soit à la fin de ce qu'on peut chercher (dimensions du tableau ou on est tombé sur un o) + return current_max_width; +} + +// chercher le plus grand carré possible pour une ligne +function get_biggest_square_for_row(row,the_board) { + var biggest_for_row = {width:0}; + var current_width = 0; + for(var i_col=0;i_col<the_board.rows[row].length;i_col++) { + current_width = get_biggest_square_on_board_at(row,i_col,the_board); + // console.log("at row ",row,", col ",i_col," => ",current_width); + if(current_width > biggest_for_row.width) { + biggest_for_row.row = row; + biggest_for_row.col = i_col; + biggest_for_row.width = current_width; + } + } + return biggest_for_row; +} + +//chercher le plus grand carré pour un tableau +function get_biggest_square_for_board(the_board) { + var biggest_in_board_for_now = {width:0}; + //console.log("biggest : ",biggest); + for(var i_row=0; i_row<the_board.rows.length; i_row++) { + current_square = get_biggest_square_for_row(i_row,the_board); + if(current_square.width > biggest_in_board_for_now.width) { + biggest_in_board_for_now = current_square; + } + } + return(biggest_in_board_for_now); +} + + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// déclarations de tableaux +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +board1 = { + rows: [ + ".....o..........", + ".....o.....o....", + "................", + "....o...........", + "..........o.....", + "................", + "....o...o.......", + "................", + ".............o.." + ] +} + +board2 = { + rows: [ + "o....o..........", + "...........o....", + "................", + "....o...........", + "..........o.....", + "................", + "....o...o.......", + "................", + ".............o.." + ] +} + + +board3 = { + rows: [ + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................", + "................" + ] +} + +board4 = { + rows: [ + "oooooooooooooooo", + "oooooooooooooooo", + "oooooooooooooooo", + "oooooooooooooooo", + "oooooooooooooooo", + "oooooooooooooooo", + "oooooooooooooooo", + "oooooooooooooooo", + "oooooooooooooooo" + ] +} + +board5 = { + rows: [ + "................", + "................", + "................", + ] +} + +board6 = { + rows: [ + "oooooooooooooooo", + "oooooooooooooooo", + "oooooooooooooooo", + "oooooooooooooooo", + ] +} + +board7 = { + rows: [ + "o....o..........", + "...........o....", + "................", + "....o...........", + "..........o.....", + "................", + "....o...o.......", + "................", + "................", + "................", + "................", + ".............o.." + ] +} + +board8 = { + rows: [ + "o....o.........................", + "..........................o....", + "..............o................", + "....o........ooo...............", + "..............o..........o.....", + "...............o...............", + "....o..................o.......", + "o..............................", + "...............................", + ".....................o.........", + ".....................o.........", + ".....................o.........", + ".........ooo...................", + "................o..............", + "..................o............", + "....................o..........", + "...............................", + "............................o.." + ] +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// TESTS +//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// console.log('board1 0,0 ',get_biggest_square_on_board_at(0,0,board1)); +// console.log('board2 0,0 ',get_biggest_square_on_board_at(0,0,board2)); +// console.log('board3 0,0 ',get_biggest_square_on_board_at(0,0,board3)); +// console.log('board4 0,0 ',get_biggest_square_on_board_at(0,0,board4)); +// console.log('board5 0,0 ',get_biggest_square_on_board_at(0,0,board5)); +// console.log('board6 0,0 ',get_biggest_square_on_board_at(0,0,board6)); +// console.log('board1 5,0 ',get_biggest_square_on_board_at(5,0,board1)); +// console.log('board1 0,5 ',get_biggest_square_on_board_at(0,5,board1)); +// console.log('board1 6,0 ',get_biggest_square_on_board_at(6,0,board1)); +// console.log('board1 0,6 ',get_biggest_square_on_board_at(0,6,board1)); +//console.log('board1 1,12 ',get_biggest_square_on_board_at(1,12,board1)); +//console.log(get_distance_to_blocking_o(12,-1,"...........o....")); +//console.log('board1 1,6 ',get_biggest_square_on_board_at(1,6,board1)); +//console.log('board1 1,12 ',get_biggest_square_on_board_at(1,12,board1)); +//console.log('board1 1,5 ',get_biggest_square_on_board_at(1,5,board1)); +//console.log('board1 0 ',get_biggest_square_for_row(0,board1)); +//console.log('board2 0 ',get_biggest_square_for_row(0,board2)); +//console.log('board3 0 ',get_biggest_square_for_row(0,board3)); +//console.log('board4 0 ',get_biggest_square_for_row(0,board4)); +//console.log('board5 0 ',get_biggest_square_for_row(0,board5)); +//console.log('board6 0 ',get_biggest_square_for_row(0,board6)); +//console.log('board1 1 ',get_biggest_square_for_row(1,board1)); +//console.log('board1 1 ',get_biggest_square_for_row(2,board1)); +//console.log('board2 0 ',get_biggest_square_for_row(0,board2)); + +for(i_board=1;i_board<9;i_board++) { + console.log('board'+i_board+' ',eval("board"+i_board),get_biggest_square_for_board(eval("board"+i_board))); +} + +var new_board = generate_board(100,100); +console.log("generated_board ",new_board,get_biggest_square_for_board(new_board)); \ No newline at end of file