susu #5454(2008/01/25 10:18 GMT) [ OCaml ] Rating0/0=0.00
お題のサンプルは一部違う動きをするのですが、 間引きが無いからでしょうか?
値をtrue,falseに限定すると生死判定の部分は少し短くできます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
(*範囲指定fold x.(pos)からlen幅 はみ出し分はループ*) let loop_fold_left_in f acc x pos len = let alen = Array.length x in let pos = if -alen<=pos && pos<0 then alen+pos else pos in let r,co = ref acc, ref 0 in for i = pos to pos+len-1 do if (i - !co)>=alen then co:=!co+alen; r := f !r (Array.get x (i - !co)); done; !r;; (*arr.(xpos).(ypos)中心の3*3マスでfがtrueとなる値の数*) let count9 f arr xpos ypos = loop_fold_left_in (fun accx y -> loop_fold_left_in (fun accy z -> if f z then accy+1 else accy ) 0 y (ypos-1) 3 + accx ) 0 arr (xpos-1) 3 ;; let mapi f arr = Array.init (Array.length arr) (fun i -> Array.init (Array.length arr.(i)) (fun j -> f i j arr.(i).(j)) );; (* t:生の値 f:死の値 arr:二次元array *) let next t f arr = mapi (fun i j b -> if j=0 then print_newline (); Printf.printf "[%c]" (if b=t then '*' else ' '); let num = count9 ((=) t) arr i j in if (b=t) then if (num=3 || num=4) then t else f else if (num=3) then t else f ) arr;; let rec preview t f arr n = let rec loop arr i = if n<i then () else ( Printf.printf "\nt=%d" i; loop (next t f arr) (i+1) ) in loop arr 0;; (*使用例 preview 1 0 [|[|0; 0; 0; 0; 0|]; [|0; 0; 1; 0; 0|]; [|0; 0; 1; 0; 0|]; [|0; 0; 1; 0; 0|]; [|0; 0; 0; 0; 0|]|] 5;; *)
Rating0/0=0.00-0+
[ reply ]
susu
#5454()
[
OCaml
]
Rating0/0=0.00
お題のサンプルは一部違う動きをするのですが、 間引きが無いからでしょうか?
値をtrue,falseに限定すると生死判定の部分は少し短くできます。
Rating0/0=0.00-0+
[ reply ]