From 0a7a37b79bcceca09788330549bc4797e1797ebd Mon Sep 17 00:00:00 2001 From: Alexandre Date: Wed, 13 Nov 2024 22:33:31 +0100 Subject: [PATCH] . --- again | Bin 0 -> 228706 bytes again.cmi | Bin 0 -> 8811 bytes again.cmo | Bin 0 -> 28920 bytes again.ml | 670 +++++++++++++++++++++++++++ compilZ.sh | 1 + entrees.txt | 44 +- execZ.sh | 2 + iachallenge2024_bomberman_tkinter.py | 24 +- main | Bin 237145 -> 237873 bytes main.cmi | Bin 10051 -> 10279 bytes main.cmo | Bin 40256 -> 41074 bytes main.ml | 66 ++- sortie.txt | 1 - 13 files changed, 752 insertions(+), 56 deletions(-) create mode 100755 again create mode 100644 again.cmi create mode 100644 again.cmo create mode 100644 again.ml create mode 100644 compilZ.sh create mode 100644 execZ.sh diff --git a/again b/again new file mode 100755 index 0000000000000000000000000000000000000000..4aedcf8dc2d973e68cee13d2420e85bb4e096c95 GIT binary patch literal 228706 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⪙ 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

|A$uRwV$qivP!oImyeC<`B! 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 WdQg7y2uK!C!j83T*Y1t1i2Of8(Re8U literal 0 HcmV?d00001 diff --git a/again.cmi b/again.cmi new file mode 100644 index 0000000000000000000000000000000000000000..5855c1d85d45b498af456dfe40399f2b8cdad24b GIT binary patch literal 8811 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 literal 0 HcmV?d00001 diff --git a/again.ml b/again.ml new file mode 100644 index 0000000..7a17582 --- /dev/null +++ b/again.ml @@ -0,0 +1,670 @@ +(* +TODO : +- deal with double bombing (DONE) +- well shit ==> dash (DONE (needs dash to be fixed tho)) +- deeper analysis on pathfinfing +*) +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) + +let debug_all = false ;; + +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) + +type pt = { + x : int ; + y : int ; +} + +type bomb = { + xy : pt ; + size : int ; + det_time : float ; +} + +type player = { + id : int ; + xy : pt ; + nspeed : int ; + nbomb_atonce : int ; + bomb_radius : int ; + ndash : int ; + ntraps : int ; +} + +type boost = { + xy : pt ; + spec : int ; +} + +let default_point = { + x = 0 ; + y = 0 ; +} + +let default_bomb = { + xy = default_point ; + size = 0 ; + det_time = 0. ; +} + +and default_player = { + id = 0 ; + xy = default_point ; + nspeed = 0 ; + nbomb_atonce = 0 ; + bomb_radius = 0 ; + ndash = 0 ; + ntraps = 0 ; +} + +and default_boost = { + xy = default_point ; + spec = 0 ; +} + +and useless = ref 0 ;; + +type game_data = { + mutable dt : float ; + mutable player_id : int ; + mutable laby : int array array ; + mutable nbombs : int ; + mutable bombs : bomb array ; + mutable nplayers : int ; + mutable players : player array ; + mutable nboosts : int ; + mutable boosts : boost array ; +} + +type danger_map = { + explosionTimes : (float list) array array ; + bonusMap : bool array array ; + playersMap : (int * int * int) array ; + explodedCrates : bool array array ; +} + +type moveType = EscapeDeath | BlowUpCrates | KillPlayers | ClaimLand ;; + +exception ReturnInt of int ;; +exception ReturnBool of bool ;; + +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) +let order = [|(1, 0); (-1, 0); (0, 1); (0, -1)|] ;; + +let current_status = ref BlowUpCrates ;; +let action = ref 0 ;; + +let dash_left = ref 0 ;; + +let equal_pt (p1 : pt) (p2 : pt) = + p1.x = p2.x && p1.y = p2.y ;; + +let swap arr i j = + let temp = arr.(i) in + arr.(i) <- arr.(j) ; + arr.(j) <- temp ;; + +let is_valid i j len hei = + i >= 0 && j >= 0 && i < len && j < hei ;; + +let print_direction = function + | 0 -> Printf.fprintf stderr "NORTH " + | 1 -> Printf.fprintf stderr "EAST " + | 2 -> Printf.fprintf stderr "SOUTH " + | 3 -> Printf.fprintf stderr "WEST " + | 4 -> Printf.fprintf stderr "STILL " + | _-> failwith "ERROR : invalid direction" ;; + +let delta i j = + if i = j then 1 else 0 ;; + +let overwrite_file (filename : string) = + let ptr = open_out filename in + close_out ptr ;; + +let rec pop_list elt = function + | [] -> [] + | h::t when h = elt -> t + | h::t -> h::(pop_list elt t) ;; + +let is_empty_lst = function + | [] -> true + | _ -> false ;; + +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) + +let print_game_data (gd : game_data) = + Printf.fprintf stderr "--------------------------------| Board data |--------------------------------\n" ; + Printf.fprintf stderr "Time : %f\n" gd.dt ; + Printf.fprintf stderr "ID : %d\n" gd.player_id ; + Printf.fprintf stderr "Laby [of size %d %d]:\n" (Array.length gd.laby) (Array.length gd.laby.(0)); + for l = 0 to Array.length gd.laby -1 do + Printf.fprintf stderr " " ; + for c = 0 to Array.length gd.laby.(l) -1 do + Printf.fprintf stderr "%d " gd.laby.(l).(c) ; + done; + Printf.fprintf stderr "\n" + done ; + Printf.fprintf stderr "Bombs (%d) : \n" gd.nbombs ; + for b = 0 to gd.nbombs -1 do + Printf.fprintf stderr " [Bomb] (at %d %d) (of size %d) (blowing up at %f)\n" gd.bombs.(b).xy.x gd.bombs.(b).xy.y gd.bombs.(b).size gd.bombs.(b).det_time ; + done; + Printf.fprintf stderr "Players (%d) : \n" gd.nplayers ; + for b = 0 to gd.nplayers -1 do + Printf.fprintf stderr " [Player %d] (at %d %d) (holding %d %d %d %d %d)\n" gd.players.(b).id gd.players.(b).xy.x gd.players.(b).xy.y gd.players.(b).nspeed gd.players.(b).nbomb_atonce gd.players.(b).bomb_radius gd.players.(b).ndash gd.players.(b).ntraps ; + done; + Printf.fprintf stderr "Boosts (%d) : \n" gd.nboosts ; + for b = 0 to gd.nboosts -1 do + Printf.fprintf stderr " [Boost] (at %d %d) (of type %d)\n" gd.boosts.(b).xy.x gd.boosts.(b).xy.y gd.boosts.(b).spec ; + done;; + +let print_dangers (dgs : danger_map) = + for w = 0 to Array.length dgs.explosionTimes -1 do + for h = 0 to Array.length dgs.explosionTimes.(0) -1 do + Printf.fprintf stderr "%d " (List.length dgs.explosionTimes.(w).(h)) ; + done ; + Printf.fprintf stderr "\n" ; + done ;; + +let print_gain_map (map : int array array) = + Printf.fprintf stderr "--------------------------------| Gain levels |--------------------------------\n" ; + for l = 0 to (Array.length map -1) do + for c = 0 to (Array.length map.(l) -1) do + Printf.fprintf stderr "%d " map.(l).(c) ; + done; + Printf.fprintf stderr "\n" + done ;; + +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) + +let rec ln_b b = function + | k when k < 0 -> failwith "are you sure about that ?" + | k when k < b -> 0 + | k -> 1 + ln_b b (k/b) ;; + +let get_meta_info (pid : int) = + let ptr = open_in ("main_"^(string_of_int pid)^".sav") in + let fct0 () = match (int_of_string (input_line ptr)) with + | 0 -> current_status := EscapeDeath + | 1 -> current_status := BlowUpCrates + | 2 -> current_status := ClaimLand + | 3 -> current_status := KillPlayers + | _ -> current_status := EscapeDeath + in + fct0 () ; + try + let resu = int_of_string (input_line ptr) in + dash_left := resu -1; + close_in ptr + with + | End_of_file -> close_in ptr ;; + +let set_meta_info (pid : int) = + let ptr = open_out ("main_"^(string_of_int pid)^".sav") in + let fct0 () = match !current_status with + | EscapeDeath -> Printf.fprintf ptr "0" + | BlowUpCrates -> Printf.fprintf ptr "1" + | ClaimLand -> Printf.fprintf ptr "2" + | KillPlayers -> Printf.fprintf ptr "3" + in + fct0 () ; + if !dash_left > 0 then + Printf.fprintf ptr "\n%d" !dash_left ; + close_out ptr ;; + +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) + +let int_of_string (str : string) = + String.fold_right (fun ch acc -> let cd = Char.code ch in if cd >= 48 || cd <= 57 then 10*acc + cd - 48 else failwith "not an integer\n") str 0 ;; + +let string_of_int (k0 : int) = + String.make (1) (Char.chr (k0 + 48)) ;; + +let int_n_of_string (str : string) (n : int) (nlast : int ref) = + let res = Array.make n 0 in + let rec aux idres idstr = match idstr with + | k when k = String.length str || idres >= n -> + nlast := k + | k -> + if str.[k] = ' ' then + aux (idres+1) (k+1) + else begin + let cd = Char.code str.[k] in + if cd >= 48 && cd <= 57 then begin + res.(idres) <- 10 * res.(idres) + cd - 48 ; + aux (idres) (k+1) + end + else + failwith "not an integer (n/n)\n" + end + in + aux 0 0 ; + res ;; + +let parse_input (str : string) = + let ptr = open_in str in + let (res : game_data) = {dt = 0. ; player_id = 0 ; laby = [||] ; nbombs = 0 ; bombs = [||] ; nplayers = 0 ; players = [||] ; nboosts = 0 ; boosts = [||] ;} in + try + (* time *) + if debug_all then Printf.fprintf stderr "Time\n" ; + res.dt <- Float.of_string (input_line ptr) ; + + (* player_id *) + if debug_all then Printf.fprintf stderr "PID\n" ; + res.player_id <- int_of_string (input_line ptr) ; + + (* maze *) + if debug_all then Printf.fprintf stderr "Maze\n" ; + let msize = int_n_of_string (input_line ptr) 2 useless in + + res.laby <- Array.make msize.(0) [||] ; + for lane = 0 to msize.(0) -1 do + let psd = input_line ptr in + res.laby.(lane) <- int_n_of_string psd msize.(1) useless ; + done; + + (* bombs *) + if debug_all then Printf.fprintf stderr "Boom\n" ; + res.nbombs <- int_of_string (input_line ptr) ; + + res.bombs <- Array.make res.nbombs default_bomb ; + for b = 0 to res.nbombs -1 do + let psd = input_line ptr + and last = ref 0 in + let dat = int_n_of_string psd 3 last in + let dtime = Float.of_string (String.init (String.length psd - !last) (fun i -> psd.[i + !last])) in + res.bombs.(b) <- {xy = {x = dat.(0) ; y = dat.(1) ;} ; size = dat.(2) ; det_time = dtime ; + } + done; + + (* players *) + if debug_all then Printf.fprintf stderr "Players\n" ; + res.nplayers <- int_of_string (input_line ptr) ; + + res.players <- Array.make res.nplayers default_player ; + for p = 0 to res.nplayers -1 do + let dat = int_n_of_string (input_line ptr) 8 useless in + res.players.(p) <- {id = dat.(2) ; xy = {x = dat.(0) ; y = dat.(1) ;} ; nspeed = dat.(3) ; nbomb_atonce = dat.(4) ; bomb_radius = dat.(5) ; ndash = dat.(6) ; ntraps = dat.(7) ;} + done; + + (* boosts *) + if debug_all then Printf.fprintf stderr "Boosts\n" ; + res.nboosts <- int_of_string (input_line ptr) ; + + res.boosts <- Array.make res.nboosts default_boost ; + for p = 0 to res.nboosts -1 do + let dat = int_n_of_string (input_line ptr) 3 useless in + res.boosts.(p) <- {xy = {x = dat.(0) ; y = dat.(1) ;} ; spec = dat.(2)} + done; + + if debug_all then Printf.fprintf stderr "Done!\n" ; + close_in ptr ; + res + with + | End_of_file -> + close_in ptr ; + failwith "cannot happen unless something is wrong" ;; + +let build_danger_map (gd : game_data) = + let lines = Array.length gd.laby + and cols = Array.length gd.laby.(0) in + let (res : danger_map) = { + explosionTimes = Array.make lines [||] ; + bonusMap = Array.make lines [||] ; + playersMap = Array.make (gd.nplayers) (0, 0, 0) ; + explodedCrates = Array.make lines [||] ; + } in + for l = 0 to lines -1 do + res.explosionTimes.(l) <- Array.make cols [] ; + res.explodedCrates.(l) <- Array.make cols false ; + res.bonusMap.(l) <- Array.make cols false ; + done; + + Array.sort + ( + fun b1 b2 -> int_of_float (100. *. (b1.det_time -. b2.det_time)) + ) + gd.bombs ; + + (* add bombs *) + let halt = ref false in + for b = 0 to gd.nbombs -1 do + let bx = gd.bombs.(b).xy.x + and by = gd.bombs.(b).xy.y in + let bsize = gd.bombs.(b).size + and dtime = min (gd.bombs.(b).det_time) (List.fold_left min (gd.dt +. 1000.) res.explosionTimes.(bx).(by)) in + for dir = 0 to 3 do + for w = 0 to bsize do + if (not !halt) && (w > 0 || dir = 0) then begin + let nx = bx + w * (fst order.(dir)) + and ny = by + w * (snd order.(dir)) in + if is_valid nx ny lines cols then begin + if (gd.laby.(nx).(ny) = 0 || gd.laby.(nx).(ny) >= 3) || (gd.laby.(nx).(ny) = 2 && res.explodedCrates.(nx).(ny)) then + res.explosionTimes.(nx).(ny) <- (dtime)::(res.explosionTimes.(nx).(ny)) + else if gd.laby.(nx).(ny) = 1 then + halt := true + else if gd.laby.(nx).(ny) = 2 then begin + halt := true ; + res.explodedCrates.(nx).(ny) <- true ; + end + end + end + done; + halt := false ; + done + done; + + (* add players *) + for p = 0 to gd.nplayers -1 do + if p <> gd.player_id then begin + let bx = gd.players.(p).xy.x + and by = gd.players.(p).xy.y in + let bsize = gd.players.(p).bomb_radius + (*and dtime = min (gd.dt +. 5.5) (List.fold_left min (gd.dt +. 1000.) res.explosionTimes.(bx).(by)) in*) + and dtime = (gd.dt +. 5.5) in + for dir = 0 to 3 do + for w = 0 to bsize do + if (not !halt) && (w > 0 || dir = 0) then begin + let nx = bx + w * (fst order.(dir)) + and ny = by + w * (snd order.(dir)) in + if is_valid nx ny lines cols then begin + if (gd.laby.(nx).(ny) = 0 || gd.laby.(nx).(ny) >= 3) || (gd.laby.(nx).(ny) = 2 && res.explodedCrates.(nx).(ny)) then + res.explosionTimes.(nx).(ny) <- (dtime)::(res.explosionTimes.(nx).(ny)) + else if gd.laby.(nx).(ny) = 1 then + halt := true + else if gd.laby.(nx).(ny) = 2 then begin + halt := true ; + res.explodedCrates.(nx).(ny) <- true ; + end + end + end + done; + halt := false ; + done + (*res.playersMap.(p) <- (gd.players.(p).xy.x, gd.players.(p).xy.y, gd.players.(p).bomb_radius) ;*) + end + done; + + (* add bonuses *) + for b = 0 to gd.nboosts -1 do + res.bonusMap.(gd.boosts.(b).xy.x).(gd.boosts.(b).xy.y) <- true ; + done; + res ;; + +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) + +let simulate_bomb (dgs : danger_map) (b : bomb) = + let saved_data = Hashtbl.create 30 in + let bx = b.xy.x + and by = b.xy.y in + let bsize = b.size + and dtime = min (b.det_time) (List.fold_left min (32760.) dgs.explosionTimes.(bx).(by)) in + let lines = Array.length dgs.explosionTimes + and cols = Array.length dgs.explosionTimes.(0) in + for dir = 0 to 3 do + for w = 0 to bsize do + if (w > 0 || dir = 0) then begin + let nx = bx + w * (fst order.(dir)) + and ny = by + w * (snd order.(dir)) in + if is_valid nx ny lines cols then begin + Hashtbl.add saved_data (nx, ny) dtime ; + dgs.explosionTimes.(nx).(ny) <- (dtime)::(dgs.explosionTimes.(nx).(ny)) + end + end + done; + done; + saved_data ;; + +let simulate_bomb_deconstruct (dgs : danger_map) (bx : int) (by : int) (bsize : int) (dtime0 : float) = + let saved_data = Hashtbl.create 30 in + let dtime = min dtime0 (List.fold_left min (32760.) dgs.explosionTimes.(bx).(by)) in + let lines = Array.length dgs.explosionTimes + and cols = Array.length dgs.explosionTimes.(0) in + for dir = 0 to 3 do + for w = 0 to bsize do + if (w > 0 || dir = 0) then begin + let nx = bx + w * (fst order.(dir)) + and ny = by + w * (snd order.(dir)) in + if is_valid nx ny lines cols then begin + Hashtbl.add saved_data (nx, ny) dtime ; + dgs.explosionTimes.(nx).(ny) <- (dtime)::(dgs.explosionTimes.(nx).(ny)) + end + end + done; + done; + saved_data ;; + +let reverse_simulate_bomb (dgs : danger_map) (save : (int * int, float) Hashtbl.t) = + Hashtbl.iter + (fun (x, y) dt -> + dgs.explosionTimes.(x).(y) <- pop_list dt (dgs.explosionTimes.(x).(y)) + ) + save ;; + +let is_dead (dgs : danger_map) (x : int) (y : int) (t : float) (dt : float) = + List.fold_left + (fun acc curtime -> + acc || (t > curtime && t < curtime +. dt) + ) + false + dgs.explosionTimes.(x).(y) ;; + +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) + +let contains_crate (gd : game_data) = + Array.fold_left + (fun b1 lst -> b1 || (Array.fold_left (fun b2 tile -> b2 || (tile = 2)) false lst)) false gd.laby ;; + +let is_a_crate_nearby (gd : game_data) (dgs : danger_map) = + let pid = gd.player_id + and lines = Array.length gd.laby + and cols = Array.length gd.laby.(0) in + try + let halt = ref false in + let res = ref false in + for dir = 0 to 3 do + for o = 1 to gd.players.(pid).bomb_radius do + if not !halt then begin + let nx = gd.players.(pid).xy.x + o * (fst order.(dir)) + and ny = gd.players.(pid).xy.y + o * (snd order.(dir)) in + if is_valid nx ny lines cols then begin + if gd.laby.(nx).(ny) = 2 then + res := true + else if gd.laby.(nx).(ny) = 1 then + halt := true + else if dgs.bonusMap.(nx).(ny) then + raise (ReturnBool false) + end + end + done; + halt := false ; + done; + !res + with + | ReturnBool b -> b ;; + +let sees_a_crate (gd : game_data) (dgs : danger_map) (x : int) (y : int) = + let pid = gd.player_id + and lines = Array.length gd.laby + and cols = Array.length gd.laby.(0) in + try + let halt = ref false in + let res = ref false in + for dir = 0 to 3 do + for o = 1 to gd.players.(pid).bomb_radius do + if not !halt then begin + let nx = x + o * (fst order.(dir)) + and ny = y + o * (snd order.(dir)) in + if is_valid nx ny lines cols then begin + if gd.laby.(nx).(ny) = 2 then + res := true + else if gd.laby.(nx).(ny) = 1 then + halt := true + else if dgs.bonusMap.(nx).(ny) then + raise (ReturnBool false) + end + end + done; + halt := false ; + done; + !res + with + | ReturnBool b -> b ;; + +let bfs_for_crate (gd : game_data) (dgs : danger_map) (x0 : int) (y0 : int) (stime : float) = + let lines = Array.length gd.laby + and cols = Array.length gd.laby.(0) in + + let visited = Hashtbl.create 100 in + let q = Queue.create () in + let interval = Float.pow (0.9) (float_of_int gd.players.(gd.player_id).nspeed) in + + Hashtbl.add visited (x0, y0) 1 ; + + Queue.add (x0+1, y0, stime +. interval, 2) q ; + Queue.add (x0-1, y0, stime +. interval, 0) q ; + Queue.add (x0, y0+1, stime +. interval, 1) q ; + Queue.add (x0, y0-1, stime +. interval, 3) q ; + + try + while not (Queue.is_empty q) do + let (x, y, ct, direction) = Queue.pop q in + if is_valid x y lines cols && gd.laby.(x).(y) <> 1 && gd.laby.(x).(y) <> 2 then begin (* within the map *) + if Hashtbl.find_opt visited (x, y) = None then begin (* has not been visited yet *) + Hashtbl.add visited (x, y) 1 ; + if not (is_dead dgs x y ct interval) then begin (* is not lethal *) + if (is_empty_lst dgs.explosionTimes.(x).(y)) && (sees_a_crate gd dgs x y && not dgs.explodedCrates.(x).(y)) then begin (* is a safe and valid tile *) + raise (ReturnInt direction) + end; + (*Printf.fprintf stderr "+4 (%b %b)\n" (is_empty_lst dgs.explosionTimes.(x).(y)) (sees_a_crate gd dgs x y) ;*) + for dir = 0 to 3 do + Queue.add (x + (fst order.(dir)), y + (snd order.(dir)), ct +. interval, direction) q ; + done + end + end + end + done; + 4 ; + with + | ReturnInt k -> k ;; + +let bfs_gtfo (gd : game_data) (dgs : danger_map) (x0 : int) (y0 : int) (stime : float) = + let lines = Array.length gd.laby + and cols = Array.length gd.laby.(0) in + + let visited = Hashtbl.create 100 in + let q = Queue.create () in + let interval = Float.pow (0.9) (float_of_int gd.players.(gd.player_id).nspeed) in + + Hashtbl.add visited (x0, y0) 1 ; + + Queue.add (x0+1, y0, stime +. interval, 2) q ; + Queue.add (x0-1, y0, stime +. interval, 0) q ; + Queue.add (x0, y0+1, stime +. interval, 1) q ; + Queue.add (x0, y0-1, stime +. interval, 3) q ; + + try + while not (Queue.is_empty q) do + let (x, y, ct, direction) = Queue.pop q in + if is_valid x y lines cols && gd.laby.(x).(y) <> 1 && gd.laby.(x).(y) <> 2 then begin (* within the map *) + if Hashtbl.find_opt visited (x, y) = None then begin (* has not been visited yet *) + Hashtbl.add visited (x, y) 1 ; + if not (is_dead dgs x y ct interval) then begin (* is not lethal *) + if (is_empty_lst dgs.explosionTimes.(x).(y)) then begin (* is a safe and valid tile *) + raise (ReturnInt direction) + end; + for dir = 0 to 3 do + Queue.add (x + (fst order.(dir)), y + (snd order.(dir)), ct +. interval, direction) q ; + done + end + end + end + done; + 4 ; + with + | ReturnInt k -> k ;; + +let bfs_bonus (gd : game_data) (dgs : danger_map) (x0 : int) (y0 : int) (stime : float) = + let lines = Array.length gd.laby + and cols = Array.length gd.laby.(0) in + + let visited = Hashtbl.create 100 in + let q = Queue.create () in + let interval = Float.pow (0.9) (float_of_int gd.players.(gd.player_id).nspeed) in + + Hashtbl.add visited (x0, y0) 1 ; + + Queue.add (x0+1, y0, stime +. interval, 2) q ; + Queue.add (x0-1, y0, stime +. interval, 0) q ; + Queue.add (x0, y0+1, stime +. interval, 1) q ; + Queue.add (x0, y0-1, stime +. interval, 3) q ; + + try + while not (Queue.is_empty q) do + let (x, y, ct, direction) = Queue.pop q in + if is_valid x y lines cols && gd.laby.(x).(y) <> 1 && gd.laby.(x).(y) <> 2 then begin (* within the map *) + if Hashtbl.find_opt visited (x, y) = None then begin (* has not been visited yet *) + Hashtbl.add visited (x, y) 1 ; + if not (is_dead dgs x y ct interval) && ct < stime +. 7. *. interval then begin (* is not lethal *) + if dgs.bonusMap.(x).(y) then begin (* is a safe and valid tile *) + raise (ReturnInt direction) + end; + for dir = 0 to 3 do + Queue.add (x + (fst order.(dir)), y + (snd order.(dir)), ct +. interval, direction) q ; + done + end + end + end + done; + 4 ; + with + | ReturnInt k -> k ;; + +let move_crate (gd : game_data) (dgs : danger_map) = + let pid = gd.player_id in + let cxi = gd.players.(pid).xy.x + and cyi = gd.players.(pid).xy.y in + try + let bonusres = bfs_bonus gd dgs cxi cyi gd.dt in + if bonusres <> 4 then raise (ReturnInt bonusres) ; + if (is_a_crate_nearby gd dgs) && (is_empty_lst dgs.explosionTimes.(cxi).(cyi)) then begin + Printf.fprintf stderr "trying...\n" ; + let saved = simulate_bomb_deconstruct dgs cxi cyi gd.players.(pid).bomb_radius (gd.dt +. 5.5) in + let result = bfs_gtfo gd dgs cxi cyi gd.dt in + if result <> 4 && gd.players.(pid).nbomb_atonce > 0 then begin + action := 1 ; + raise (ReturnInt result) ; + end + else + raise (ReturnInt 4) + end; + bfs_for_crate gd dgs cxi cyi gd.dt + with + | ReturnInt k -> k ;; + +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) + +let game_map = parse_input "entrees.txt" ;; +if debug_all then print_game_data game_map ;; +let danger_data = build_danger_map game_map ;; + +get_meta_info game_map.player_id ;; +(*Printf.fprintf stderr "\n" ;; +print_dangers danger_data ;;*) + +let direction = move_crate game_map danger_data ;; + +Printf.printf "%d %d" direction !action ; +Printf.fprintf stderr "[player %d] %d %d (at time %f)\n" game_map.player_id direction !action game_map.dt; + +set_meta_info game_map.player_id ;; + diff --git a/compilZ.sh b/compilZ.sh new file mode 100644 index 0000000..1913351 --- /dev/null +++ b/compilZ.sh @@ -0,0 +1 @@ +ocamlc again.ml -o again \ No newline at end of file diff --git a/entrees.txt b/entrees.txt index 54a418b..65ba8d9 100644 --- a/entrees.txt +++ b/entrees.txt @@ -1,29 +1,27 @@ -107.60000000000014 +135.09900000000007 3 13 21 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 3 3 3 3 3 3 0 2 0 2 2 2 2 2 2 5 5 5 5 1 -1 3 1 3 1 3 1 2 1 2 1 0 1 2 1 2 1 5 1 5 1 -1 3 3 3 3 3 3 3 0 2 2 2 2 2 0 5 5 5 5 5 1 -1 3 1 3 1 3 1 2 1 2 1 2 1 0 1 5 1 5 1 5 1 -1 3 3 3 3 3 0 2 2 2 2 2 2 0 5 5 5 5 5 5 1 -1 0 1 3 1 3 1 2 1 2 1 0 1 2 1 5 1 4 1 5 1 -1 6 6 6 6 6 0 2 2 2 2 2 2 0 2 0 0 4 4 4 1 -1 6 1 3 1 6 1 0 1 2 1 2 1 2 1 0 1 4 1 5 1 -1 6 6 3 6 6 0 2 2 2 2 2 0 0 0 4 4 4 4 4 1 -1 6 1 6 1 6 1 0 1 2 1 2 1 2 1 4 1 4 1 4 1 -1 6 6 6 6 6 6 0 2 2 2 2 2 2 0 4 4 4 4 4 1 +1 3 3 3 3 0 2 2 2 2 2 2 2 0 5 5 5 5 5 5 1 +1 3 1 3 1 0 1 2 1 0 1 2 1 2 1 5 1 5 1 5 1 +1 3 3 3 3 3 3 0 2 0 2 2 0 0 5 5 5 5 5 5 1 +1 3 1 3 1 0 1 2 1 2 1 2 1 0 1 5 1 5 1 5 1 +1 0 0 3 0 0 2 2 2 2 2 2 0 4 4 5 5 5 5 5 1 +1 0 1 3 1 3 1 6 1 0 1 2 1 4 1 4 1 5 1 0 1 +1 3 6 3 3 3 3 6 2 6 2 0 0 4 4 4 4 5 4 4 1 +1 6 1 3 1 3 1 6 1 6 1 2 1 5 1 4 1 4 1 4 1 +1 6 6 6 6 6 3 6 3 3 0 2 0 5 5 5 4 4 4 4 1 +1 6 1 6 1 0 1 6 1 6 1 2 1 5 1 5 1 4 1 4 1 +1 6 6 6 6 6 6 6 6 6 6 0 2 5 5 5 5 5 4 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -5 -7 17 3 108.35799999999998 -11 15 2 109.5 -11 6 2 109.50000000000011 -3 6 3 109.64919999999982 -10 7 2 112.20000000000013 4 -1 7 0 4 3 3 0 0 -8 15 1 0 2 2 3 1 -9 17 2 3 3 3 0 2 -10 7 3 1 2 2 3 0 +9 5 5 137.68300000000002 +5 12 2 138.5 +3 12 1 139.70000000000022 +4 13 2 140.5 +3 +3 13 1 1 2 1 2 2 +3 13 2 0 4 2 0 2 +7 3 3 3 3 5 0 2 1 -5 13 1 +11 11 0 diff --git a/execZ.sh b/execZ.sh new file mode 100644 index 0000000..b663028 --- /dev/null +++ b/execZ.sh @@ -0,0 +1,2 @@ +ocamlc again.ml -o again +./again \ No newline at end of file diff --git a/iachallenge2024_bomberman_tkinter.py b/iachallenge2024_bomberman_tkinter.py index 155b976..851deb8 100644 --- a/iachallenge2024_bomberman_tkinter.py +++ b/iachallenge2024_bomberman_tkinter.py @@ -60,7 +60,7 @@ PU_NATURE = 2 from random import randrange from copy import deepcopy from tkinter import * -from os import system +import os def attente(vitesse): return TEMPS_BASE * 0.9**vitesse @@ -209,10 +209,10 @@ def execute_evenement(evenements, evenement, plateau, plateauCouleur, bombes, jo bombes.append([i,j,joueur[J_LONGUEURFLAMMES],indiceJoueur,evenement[0]+TEMPS_EXPLOSION]) ajoute_evenement(evenements, [evenement[0]+TEMPS_EXPLOSION, EVENEMENT_EXPLOSION_BOMBE, len(bombes)-1]) elif joueurs[indiceJoueur][J_DASHSRESTANTS]>0 and action == A_DASH: - joueurs[J_DASHSRESTANTS]-=1 - joueurs[J_TOURSDASH]+=3 + joueur[J_DASHSRESTANTS]-=1 + joueur[J_TOURSDASH]+=3 elif joueurs[indiceJoueur][J_PIEGESRESTANTS]>0 and action == A_PIEGE: - joueurs[J_PIEGESRESTANTS]-=1 + joueur[J_PIEGESRESTANTS]-=1 pieges.append([i,j,indiceJoueur]) ip,jp = prochain(i,j,direction) if plateau[ip][jp]==PLATEAU_VIDE and trouve_objet(ip, jp, bombes)==None: @@ -289,7 +289,7 @@ def execute_evenement(evenements, evenement, plateau, plateauCouleur, bombes, jo longueurFlammes = 0 # Si on est pas au bout de la flamme, on propage - if longueurFlammes>0: + elif longueurFlammes>0: ip, jp = prochain(i,j,direction) ajoute_evenement(evenements, [evenement[0]+TEMPS_PROPAGATION, EVENEMENT_PROPAGATION, ip, jp, direction, longueurFlammes-1, indJoueur]) @@ -322,9 +322,10 @@ def decision(programme, indiceJoueur, plateau, plateauCouleur, bombes, joueurs, print(len(powerups), file=entrees) for pu in powerups: print(pu[PU_LIGNE], pu[PU_COLONNE], pu[PU_NATURE], file=entrees) - - system("cat entrees.txt | "+programme+" > sortie.txt") - + if os.name == "posix": + os.system("cat entrees.txt | "+programme+" > sortie.txt") + elif os.name =="nt": + os.system('type entrees.txt | python '+programme[2:]+ ' >sortie.txt') with open("sortie.txt", "r") as sortie: direction, b = sortie.readline().split() action = int(b) @@ -332,7 +333,7 @@ def decision(programme, indiceJoueur, plateau, plateauCouleur, bombes, joueurs, def simulation(strategies): def pas_de_jeu(): - if len(joueurs) - joueurs.count(None) > 1: + if len(joueurs) - joueurs.count(None) > 0: evenement = evenements.pop(0) if evenement[0]>TEMPS_PARTIE: return @@ -366,7 +367,7 @@ def simulation(strategies): joueurs = [] for i in range(len(strategies)): - joueur = [positionsInitiales[i][0], positionsInitiales[i][1], strategies[i], 0, 1, 1, 1, 0, 0, 0] + joueur = [positionsInitiales[i][0], positionsInitiales[i][1], strategies[i], 0, 1, 1, 1, 0, 0, 0, 0] joueurs.append(joueur) ajoute_evenement(evenements, [0., EVENEMENT_TOUR_JOUEUR, i]) @@ -378,5 +379,4 @@ def simulation(strategies): fenetre.mainloop() return -from importlib import import_module -simulation(["./main", "./main", "./main", "./main"]) +simulation(["./again", "./again", "./again", "./again"]) diff --git a/main b/main index d1bb265b488b5c3a01627824ccb756176e0a6de3..80304eea7444b446696c9d3d38e2b24af49c71a6 100755 GIT binary patch delta 2909 zcmZWqdu-EH6z;uekGAa5!e)mZbXy1Q*2yFjh7v#=U;te)AQ(U~j_^)x3-?#N9V>J1C?m73|^SbAr z-}gsL4xT94y3HK6e_b}mvR#+$GMOFq`Ft(FHoyRRKpT(*1h@lm`{YON`?3%IX`781 zpUqscH%wqRbYeh_W;`3yU0wFQ;-|sW=2Bo~w&|)}ET&#xyJ6Ggf)I@d@&UTp3{b5E z@M+f#8xJ!osuTkAfidkHx5Ra3x4qjO&Tj0sO`NJvMGkK!5%Z^bIZSwX4Db*r@?F0d&``pY+ydtVFVTzrHjz(vt2HuU)22>e z@@ztP4cI4*KYMe)ih;7{+4f0H^jUz3@>&?+dSC-k1aNOP@Z2EUe=HrJopjwMjRy0i z!F-|3dD3jBTHSiZwrX#SRO#7X`(!aoNsI=0mT5*=3W?}dzR?T!0qlK9z4%BqP{yv%J5y7yld+4$8zH4g1(or z;6|fG%{W9yk;u`^h&iBO?TLc zZn=g|3TVbk^tRK-2Q7z}K>H%Vm%-Dc+Gp*I7H`37rIYHVn2D9I$%&Y}yT~!x6_khu z<5FZ=byZlRW{$qah7ak19-GLpio6tN?gz>Mdf^3>0<5UJ*ea~q!%UI-{J9ENVEqKZ z+i;Xk>54`@UiwWm10bkb0blXMyF9 zf!_zXV29K4oSe2fEx6}ouEQvEV1h%JpbPwR_q||!EIZG$D6A%Rc(2vKV*rc57Gc%7 z$HL6l4!tE~Q)sD^ z)a?qN)yaqDrNi$J*4ls)jkQR;`co{~yo`Gez|>u%@WWu#>&D|aUXQK~>$!U5alQ~E zb)a7S5MUTZhsJJ9=cOP&bj6nGhLj|kVoG8GHZ_*{4pVCQsZ%5PME|Y(@Alow&&cr&@W_YH--Ta2 zk6prS*fDHhMrDChcte!2mW|-+NAO|Yyigj;C&C8p@A zE!U0sa!jF%DuCMzYZJCzD5RY0r2KwSM}Q^TwNR$dX5Vv*6Nr?LkSc8KO@9wf56U^2 zNcpgxiIv@+SEPF$l1L_z+vXP4ssLx^^=qEz`oIl5Hy1|gvq$r<-ddmTF3;m|bm5V5 zh`KNeyS%474hvS*~WGAzpaw4Zp4xq(CUR>JZ~K+OYJ-*b!}Q=0dBLxOEr_mC#P0B(-B>PM?&9a$EHvlt%X#jux98Jrfdql2I)2TaTzh2)iqxGBZ(w6;UhrAjNZKzo8 eZ#yyn%$_;Z%PQg>{rcSdvd=F0SjT=K_x}$Iv+suh delta 2550 zcmcImZERCz6z=<;wrjVpU7@3eJM79}UxgMejKzfw1W}^f7#JY|Gb4l%5t;rlfFDys zn14i*2}dLm1j7tO<_F1*f{X?3U%jlN=D=mWoK&IN{kxu{lwqE@qOU8pi$5LECsc>oHK>=7 zs^W9kb?d~t91e#|us~2RNC-*806z;Z|SYd!|@PB`K*T`X5ugHQ>u^~hINH{i`$2Fd$16`1)Bwr3T|=#uuiF; zK`OY>M;=b3^<_Rz)XCd!>k@8sQW<}8TOTPc5PLh`xbSX43qOBHa}0r&3yK9k!8k!! z05c^Ba%x0ZmE!dp0lYW`iv_E>eMGkwPX{X~gPQwBbhq-Fb1Y3td3Q8W4=3Wvv*Rp9 zCcw#4g1y_6qf;pGjHBnLz+L8+KXgQKWdYSM#uf`7sp1bE=|UI85Zk3k&G1ThUkkU$F%BPzRA zkSV25#Cwb_H$`0?!a6y+Tt&I|imp~)@J3B@R2j>Rwz`me5nFHTC|3^ZlKFOR;1JHx zO%!0RWm)L3-Dyyyigy?;1o6JW!@C#BFxpeKqBtN*0E>fcHB#7nT*d=p38&NA$jqJc zanea~AuFAzR*E-`@}BDTO93}YMr=%Q#4 zGla~x2oUisPPu7y&=3|LGR+sdnAuGge7=y%dEYpS@KraJa9t6Vd)LToY#KAy7g2|y zT;{n-3g}FgecX3L8!p7LsHbU{;T;lgl|XT_h71?x&&MYgitCmd@~9wp4ePKMCC94( z4^)wnxgHQB(n3JED!{Mf{umj2vW6nc&lhT>hi(oeD9njk3JKpng_^uUu|(qIIa(~% z2WlnowU&oc3Wz7BjRh;7gWxml% zP24zDE~mn&G>hMvPP0n=GCZj7c!3sx5Aep>R1xbF79~Ps7YfikyF2d+uQ-s_VQ#sh zee7Q(t!VsJdsHAhNT+gxCo>P>MCl?R9kqm1pY{va#~@mJ9StY z99^KoH8XRjl|m6Q`h56Gwov#hfDVQFhSRMSoq?;$_6%B)lkLp#VX)nN#!XAe=y~FW zNOLM@hQ#gHM=xb}DbMM!%O=r{p0tiUdAZ1S+`oj9a(h`zDCL?ct77~>8>MF7BP?!J zR1wD<@l6)Q1aJ-+-xSDrARFA*My)aY10gPal3%-MS?h!r31A9c6-SrKXQgE+)lWvs z(4%>%5Jqc(0PfS} qC}sY(otlFsk2f_`zqg{`qwmV*J^gk1+K2q$Uh36t-}1G+H1BU@oyt=H diff --git a/main.cmi b/main.cmi index da3dca38353d27ceaf59e5c3bac12971374cc392..f2882886293d882a67b558dad026bb8db0a1342a 100644 GIT binary patch literal 10279 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 Db=p-? literal 10051 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 Fatal b.det_time ; | _ -> Danger b.det_time ;; @@ -367,7 +370,6 @@ let evaluate_dangers (gd : game_data) = done; (* add bomb tiles *) - let exploded = Hashtbl.create 12 in for b = 0 to gd.nbombs -1 do let bx = gd.bombs.(b).xy.x and by = gd.bombs.(b).xy.y in @@ -606,20 +608,33 @@ let move_explore (gd: game_data) (dgs : danger array array) = try let (cxi, cyi) = (gd.players.(pid).xy.x, gd.players.(pid).xy.y) in - let move_with_caution (exit : bool) = + let move_with_caution () = let res = has_a_safe_path_origin_2 cxi cyi lines cols gd.dt interval gd dgs [|Bonus|] [||] [|Blocked|] [||] 7 in if res <> 4 then begin if debug_all then Printf.fprintf stderr "[crates] success 1/2!\n" ; res end else begin - let res2 = has_a_safe_path_origin_2 cxi cyi lines cols gd.dt interval gd dgs [||] [|2|] [|Blocked|] [||] 80 in + for w = 0 to lines -1 do + for h = 0 to cols -1 do + if gd.laby.(w).(h) = 2 then begin + for dir = 0 to 3 do + let nx = w + fst order.(dir) + and ny = h + snd order.(dir) in + if is_valid nx ny lines cols && dgs.(nx).(ny) <> Blocked then + gd.laby.(nx).(ny) <- (-5) ; + done + end + done + done; + (* you dont want to stop INSIDE a crate, but rather right next to it *) + let res2 = has_a_safe_path_origin_2 cxi cyi lines cols gd.dt interval gd dgs [||] [|-5|] [|Blocked|] [||] 80 in if res2 <> 4 then begin if debug_all then Printf.fprintf stderr "[crates] success 2/2!\n" ; res2 end else begin - if exit then (* TODONE *) + if not (contains_crate gd) then (* TODONE *) current_status := ClaimLand ; Printf.fprintf stderr "Exited.\n" ; 4 @@ -645,25 +660,26 @@ let move_explore (gd: game_data) (dgs : danger array array) = end ) bomb_hash ; - let result = move_with_caution false in + let result = has_a_safe_path_origin_2 cxi cyi lines cols gd.dt interval gd dgs [|Bonus; Safe|] [||] [|Blocked|] [||] 10 in Hashtbl.iter (fun (k1, k2) v -> dgs.(k1).(k2) <- v) saved_dgs ; result in (* check if there's a crate next to the player, and if upon placing a bomb it won't softlock the player, and if you can place a bomb *) - if is_a_crate_nearby gd dgs && (safe_path_with_bomb cxi cyi gd.players.(pid).bomb_radius <> 4) then begin (* Crate at South *) + let spwb = safe_path_with_bomb cxi cyi gd.players.(pid).bomb_radius in + if is_a_crate_nearby gd dgs && (spwb <> 4) then begin (* Crate at South *) if dgs.(cxi).(cyi) = Safe && gd.players.(pid).nbomb_atonce > 0 then begin - current_status := EscapeDeath ; + (*current_status := EscapeDeath ;*) action := 1; if debug_all then Printf.fprintf stderr "Fire in the hole!\n" ; - raise (ReturnInt 4) ; + raise (ReturnInt spwb) ; end; end; if debug_all then Printf.fprintf stderr "[crates] Cannot bomb now, searching for a crate...\n"; (* go to one without stepping into a dangerous tile *) - raise (ReturnInt (move_with_caution true)) ; + raise (ReturnInt (move_with_caution ())) ; with | ReturnInt k -> k ;; @@ -671,7 +687,7 @@ let move_explore (gd: game_data) (dgs : danger array array) = (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) let cell_profit (d_from_p : int) (gain : int) = - (100000 * gain * (1 + ln_b 7 gain)) / d_from_p ;; + (100 * gain * (1 + ln_b 7 gain)) (*/ d_from_p *);; let move_claim (gd : game_data) (dgs : danger array array) (gns : int array array) = let lines = Array.length gd.laby @@ -718,7 +734,14 @@ let move_claim (gd : game_data) (dgs : danger array array) (gns : int array arra (fun i lst -> Array.iteri ( fun j elt -> - if (distances.(i).(j) <> -1) then begin maxi_gain := max (!maxi_gain) (cell_profit distances.(i).(j) gns.(i).(j)); maxi_i := i ; maxi_j := j end + if (distances.(i).(j) <> -1) then begin + let cpft = cell_profit distances.(i).(j) gns.(i).(j) in + if !maxi_gain < cpft then begin + maxi_gain := cpft ; + maxi_i := i ; + maxi_j := j ; + end + end ) lst ) @@ -752,14 +775,14 @@ let move_claim (gd : game_data) (dgs : danger array array) (gns : int array arra if result0 <> 4 then begin action := 1 ; - current_status := EscapeDeath ; + (*current_status := EscapeDeath ;*) raise (ReturnInt result0) end end; raise (ReturnInt 4) end else if !maxi_i = (-1) then begin - current_status := EscapeDeath ; + (*current_status := EscapeDeath ;*) raise (ReturnInt (has_a_safe_path_origin_2 cxi cyi lines cols gd.dt interval gd dgs [|Bonus; Safe|] [||] [|Blocked|] [||] 80)) end else begin @@ -811,7 +834,7 @@ let move_safe (gd : game_data) (dgs : danger array array) (gns : int array array result2 else begin (* you're probably dead if the code reaches here, unless... *) - if (!dash_left > 0) || gd.players.(pid).ndash > 0 then begin + if false && ((!dash_left > 0) || gd.players.(pid).ndash > 0) then begin Printf.fprintf stderr "*teleports*\n" ; if (!dash_left = 0) then action := 2 ; @@ -831,6 +854,8 @@ let move_safe (gd : game_data) (dgs : danger array array) (gns : int array array (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) let update_strat (gd : game_data) (dgs : danger array array) = match dgs.(gd.players.(gd.player_id).xy.x).(gd.players.(gd.player_id).xy.y) with + | _ when !current_status = BlowUpCrates -> () + | _ when !current_status = ClaimLand -> () | Safe -> () | Danger k when k < 3.0 -> current_status := EscapeDeath | Danger k -> () @@ -850,7 +875,7 @@ let debug_game_data (gd : game_data) = (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) -Printf.fprintf stderr "XXXXXXXX\n" ;; +if logg then Printf.fprintf stderr "XXXXXXXX\n" ;; let game_d = parse_input "entrees.txt" ;; let dangers = evaluate_dangers game_d ;; @@ -858,7 +883,7 @@ let gains = cell_values game_d ;; get_meta_info game_d.player_id ;; -Printf.fprintf stderr "[player %d started its turn]\n" game_d.player_id ;; +if logg then Printf.fprintf stderr "[player %d started its turn]\n" game_d.player_id ;; if debug_data then begin print_game_data game_d ; @@ -894,9 +919,10 @@ main_actions () ; Printf.printf "%d" !action ; (*debug_game_data game_d ;;*) - -Printf.fprintf stderr "[player %d went at direction " game_d.player_id ;; -print_direction !chosen ;; -Printf.fprintf stderr "with action %d] time at end : %f\n" !action game_d.dt ;; +if logg then begin + Printf.fprintf stderr "[player %d went at direction " game_d.player_id ; + print_direction !chosen ; + Printf.fprintf stderr "with action %d] time at end : %f\n" !action game_d.dt ; +end ;; set_meta_info game_d.player_id ;; \ No newline at end of file diff --git a/sortie.txt b/sortie.txt index 6ad1e30..e69de29 100644 --- a/sortie.txt +++ b/sortie.txt @@ -1 +0,0 @@ -2 2 \ No newline at end of file