スポンサーサイト

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

F#雑記 Hanafuda Shuffle

 OKWaveの質問をやってみました。問題はこちら。 
 
コンソールで入力して次のようになります。 
 
5 2 
3 1 
3 1 
10 3 
1 10 
10 1 
8 3 
0 0 
data = (5, 2, [(3, 1); (3, 1)]) ans = 4 
data = (10, 3, [(1, 10); (10, 1); (8, 3)]) ans = 4 
 
コードは次の通りです。 
 
//(方針)カードの位置は一番下を1、一番上をnとする 
//逆写像を次々に施して位置n(一番上)にあるものが、どの位置に戻っていくかを調べる。最初の状態で位置と 
//カードの数字は同じなので、位置を答えれば答えとなる。 
 
///問題にあるような入力をしたとき[(5, 2, [(3, 1); (3, 1)]); (10, 3, [(1, 10); (10, 1); (8, 3)])]を返す関数 
let inputData () = 
    let rec inputDataSub subNum subCountMax subCount  subLstAcc acc = 
        let oneLineIntsArr =  
            (System.Console.ReadLine()).Split([|' '|]) 
                |>Array.map(fun str -> System.Int32.Parse(str.Trim())) 
        match oneLineIntsArr with 
        |[|0;0|]     -> List.rev (List.tail ((subNum,subCountMax,subLstAcc)::acc)) //最後 
        |[|x;y|]  when subCount = 0 //グループの始まり 
                     -> inputDataSub  x  y 1 [] acc  
        |[|x;y|]  when subCount = subCountMax //グループの終わり 
                     -> inputDataSub  0 0 0 [] ((subNum,subCountMax,(List.rev ((x,y)::subLstAcc)))::acc)     
        |[|x;y|]     ->inputDataSub subNum subCountMax (subCount+1) ((x,y)::subLstAcc) acc //グループ途中 
        |_ -> failwith "input error" 
 
    inputDataSub 0 0 0 [] []  
 
// getTopNum (5, 2, [(3, 1); (3, 1)])で4を返す関数 
let getTopNum (n,shuffleCount,p_c_lst) = 
       let f_inv n (p,c)  = (fun x -> if x > n-c then x-p+1 elif x <= n-c-p then x else x + c)//逆写像  
       let applyFuncLst = List.map (f_inv n) (List.rev p_c_lst)  
       List.fold (fun pos g -> g pos) n applyFuncLst //場所nから逆写像でどんどん戻していく 
 
//「入力Dataと答えのタプル」のリスト 
let DataAndAnsLst = 
    inputData () 
        |> List.map (fun ele -> (ele,getTopNum ele)) 
 
//表示         
List.iter(fun (data,ans) ->printfn "data = %A ans = %A" data ans ) DataAndAnsLst    
 
スポンサーサイト

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

trackback


この記事にトラックバックする(FC2ブログユーザー)

Hanafuda Shuffle

【F#】Hanafuda Shuffle

コメントの投稿

非公開コメント

つづり

余計なお世話だけど、シャッフルのつづり間違ってますよ。

毎度お世話になってます。

どもです。訂正しました。
プロフィール

T GYOUTEN

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

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

この人とブロともになる

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