スポンサーサイト

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

どう書く?org F# あみだくじ

「どう書く?org」http://ja.doukaku.org/に挑戦7問目です。
さて今回の問題は次のような内容。
 
(問題) http://ja.doukaku.org/103/
次のような書式で与えられた「あみだくじ」があります。
(あみだくじはコード中に埋め込んでも、標準入力や
外部ファイルから読み込んでも、書きやすい方法でかまいません)

A B C D E
| | |-| |
|-| | |-|
| |-| |-|
|-| |-| |
|-| | | |

このあみだくじをたどって
A B C D E
| | |-| |
|-| | |-|
| |-| |-|
|-| |-| |
|-| | | |
B D C A E
のように結果を表示させるプログラムを作ってください。

 

先頭の行-を ['A';'B';'C';'D';'E']の形へ、2行目以降の行を [[' ';' ';'-';' '];[' ' .......]...]の形へ直してから、リストで処理しました。
 
以下コード
 
let amida =
    ["A B C D E";
    "| | |-| |";
    "|-| | |-|";
    "| |-| |-|";
    "|-| |-| |";
    "|-| | | |"]
let amidaData = List.map (fun (s:string ) -> s.ToCharArray()) amida
 
// 先頭の行-> ['A';'B';'C';'D';'E']の形へ
let topData = amidaData
              |> List.hd 
              |> List.of_array
              |> List.filter (fun c -> c <> ' ') 
 
// 2行目以降-> [[' ';' ';'- ';' '];[' ' .......]...]の形へ
let otherData = amidaData
                |> List.tl
                |> List.map List.of_array
                |> List.map  (List.filter (fun c -> c <> '|'))
 
let f lst1In lst2In  =
    let rec fSub l1 l2 res =
        match l1,l2 with
        |h11::h12::t1 , h21::t2 when h21 = '-'  -> fSub (h11::t1) t2 (h12 ::res)
        |h11::t1  , h21::t2                     -> fSub t1 t2 (h11 :: res)
        |h11 ::t1 , _                           -> (h11 :: res)
        |_                                      -> failwith "data Error"
    List.rev (fSub lst1In lst2In [])  
 
let res = List.fold f topData otherData 
//res = ['B';'D';'C';'A';'E'] これを答えの形へ
let resStrLst = List.map (fun c -> c.ToString()) res
let resStr1 = List.fold (fun s ele -> s + " " + ele) "" resStrLst 
let resStr2 = resStr1.Trim()
let answer = amida @ [resStr2]
List.iter (printfn "%A") answer
 
(出力)

"A B C D E"
"| | |-| |"
"|-| | |-|"
"| |-| |-|"
"|-| |-| |"
"|-| | | |"
"B D C A E"

スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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