Comment detail

アレイのuniq (Nested Flatten)

This comment is reply for 456 ether: # uniq [3; 1; 4; 1; ...(アレイのuniq). Go to thread root.

#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;;

Index

Feed

Other

Link

Pathtraq

loading...