スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

F#雑記 ある要素がn個以上の条件を満たすか (part2)

「いくつかの条件と一つの要素が与えられたとき、その要素がそれらの条件のうち少なくともm個を満たしたらtrue、そうでないときはfalseを返す関数を条件の適用をなるだけ少なくする方針で書く」 という問題について記事を書きましたら、BlUEPIXYさんから、Computation Expressionを使った例をトラックバックして頂きました。ここで、別のやり方を思いつたので、ちょっと書き留めておきます。(邪道コードのような気もしますが。)では、コードです。
 
> //predsが条件配列、targetTureNumが個数、eleが要素(targetTrueNumは正で配列の個数以下)
let moreThanNmeetCondition (preds : array<'a -> bool>) (targetTureNum:int) (ele:'a) =
    let allCondNum = Array.length preds
    let targetFalseNum = allCondNum - targetTureNum + 1
    let overArrayIndex = Array.length preds
    let unUsedVal = -1 //使われない値、別に-1でなくてもよい
    let sq =
        Seq.unfold(fun (index,tn,fn) -> if index = overArrayIndex then
                                                        None
                                        else  
                                            let seqVal,newState =
                                                if   preds.[index] ele = true  &&  tn + 1 = targetTureNum then
                                                    true,(overArrayIndex ,unUsedVal,unUsedVal)
                                                elif preds.[index] ele = false && fn + 1 = targetFalseNum then
                                                    false,(overArrayIndex,unUsedVal,unUsedVal)
                                                elif preds.[index] ele = true then
                                                    true,(index+1,tn+1,fn)
                                                else false,(index+1,tn,fn+1)
                                            Some(seqVal,newState))
                    (0,0,0)
    Seq.iter  (fun x -> printfn "%A" x ) sq //seq内容確認用 (本来は消去)
    sq 
    |> List.ofSeq
    |> List.rev
    |> List.head;;
 
val moreThanNmeetCondition : ('a -> bool) array -> int -> 'a -> bool 
 
では使用してみます。
 
> let conds = [|(fun x -> x % 2 = 0);(fun x -> x % 3 = 0);(fun x -> x % 4 = 0);(fun x -> x % 5 = 0);
                (fun x -> x >= 2);(fun x -> x >= 1);(fun x -> x <= 10);(fun x -> x <= 3)|]   ;;
 
val conds : (int -> bool) [] =
  [|<fun:conds@41-24>; <fun:conds@41-25>; <fun:conds@41-26>; <fun:conds@41-27>;
    <fun:conds@42-28>; <fun:conds@42-29>; <fun:conds@42-30>; <fun:conds@42-31>|]
    
 > (moreThanNmeetCondition conds 8 10) ;;
true
false
val it : bool = false
 
> (moreThanNmeetCondition conds 7 10) ;;
true
false
false
val it : bool = false
 
> (moreThanNmeetCondition conds 6 10) ;;
true
false
false
true
true
true
true
false
val it : bool = false
 
> (moreThanNmeetCondition conds 5 10) ;;
true
false
false
true
true
true
true
val it : bool = true
 
> (moreThanNmeetCondition conds 4 10) ;;
true
false
false
true
true
true
val it : bool = true
 
> (moreThanNmeetCondition conds 3 10) ;;
true
false
false
true
true
val it : bool = true
 
> (moreThanNmeetCondition conds 2 10) ;;
true
false
false
true
val it : bool = true
 
> (moreThanNmeetCondition conds 1 10) ;;
true
val it : bool = true
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

Author:T GYOUTEN
F#と英単語とフリーソフトと読書に興味があります。
ホームページでフリーソフトも公開しています。どぞ御贔屓に。

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
フリーエリア
フリーエリア
blogram投票ボタン
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。