Comment detail
アレイのuniq (Nested Flatten)
#456 は「配列状」を緩く解釈してリストを使いましたが、文字通り配列(だけ)を使うとこうなるのかなあと。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | let rec appears_between p q m a =
if p = q then false
else
if a.(p) = m then true
else appears_between (succ p) q m a
let uniq2 xs =
let ys = Array.copy xs in
let rec move x y =
if (Array.length xs) = x then
Array.sub ys 0 y
else
if appears_between 0 y xs.(x) ys then
move (succ x) y
else
(ys.(y) <- xs.(x); move (succ x) (succ y))
in
move 0 0
|
関数型ということにこだわらなければこういう手も。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | open System;;
open Array;;
let uniq xs =
let ars = create (length xs) xs.(0) in
let i = ref 1 in
for idx = 1 to (length xs)-1
do
if not (exists (fun elem -> xs.(idx) = elem) ars)
then
begin
ars.(!i) <- xs.(idx);
i := !i+1
end
else ()
done;
sub ars 0 !i;;
|





ether
#456()
[
OCaml
]
Rating0/0=0.00
Rating0/0=0.00-0+
1 reply [ reply ]