スポンサーサイト

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

F#雑記 char ピラミッド

anarchy golf の問題http://golf.shinh.org/p.rb?char+pyramidより
 
> dispPyr "BeginningF#" ;;
とすると、次のように表示する関数を作ってみました。
 
           #
          F #
         g F #
        n g F #
       i n g F #
      n i n g F #
     n n i n g F #
    i n n i n g F #
   g i n n i n g F #
  e g i n n i n g F #
 B e g i n n i n g F #
 
 
今回のテーマは「Continuation Passing Style」です。
 
まず、int型の引数topWSとlist<char>型の変数cLstを引数にして、「TopWS個の' 'から成るリスト」と
「cLst内のcharの間に' 'を挟んだリスト」を連結したものを返します。
 
> let insWS (topWS :int)(cLst : list<char>) =
    let mid =
        match cLst with
        |[] -> []
        |_  -> (List.tail(List.rev(List.fold (fun s c -> c :: ' ' :: s) [] cLst)))
 
    [for i in 1 .. topWS -> ' '] @ mid;;
 
val insWS : int -> char list -> char list
 
実行例
> insWS 5 ['a';'b';'c'];;
val it : char list = [' '; ' '; ' '; ' '; ' '; 'a'; ' '; 'b'; ' '; 'c']
 
次に上の関数に更に文字列化の機能を加えた関数を定義しておきます。
 
> let insWSToStr  (topWS :int)(cLst : list<char>) =
    new string(Array.ofList (insWS topWS cLst));;
 
val insWSToStr : int -> char list -> string
 
実行例
> insWSToStr 5 ['a';'b';'c'];;
val it : string = "     a b c" 
 
あとはこれを利用して次のように定義します。
 
> let dispPyr (str : string) =
    let cLstGre = Array.toList (str.ToCharArray())
    let len = List.length cLst
    let rec dispPyrSub (cLst : list<char>) (cont:unit -> unit) =
        match cLst with
        | [] ->
            () |> cont
        | hd :: tl ->
            let showStr = insWSToStr(len - (List.length tl)) cLst
            dispPyrSub tl (fun () -> printf "%s\n" showStr |> cont)  
    dispPyrSub cLstGre (fun()->());;
 
val dispPyr : string -> unit
 
実行例
> dispPyr "functional";;
          l
         a l
        n a l
       o n a l
      i o n a l
     t i o n a l
    c t i o n a l
   n c t i o n a l
  u n c t i o n a l
 f u n c t i o n a l
val it : unit = ()
 
**********************全コード************************
 
let insWS (topWS :int)(cLst : list<char>) =
    let mid =
        match cLst with
        |[] -> []
        |_  -> (List.tail(List.rev(List.fold (fun s c -> c :: ' ' :: s) [] cLst)))
 
    [for i in 1 .. topWS -> ' '] @ mid
 
let insWSToStr  (topWS :int)(cLst : list<char>) =
    new string(Array.ofList (insWS topWS cLst))
 
let dispPyr (str : string) =
    let cLstGre = Array.toList (str.ToCharArray())
    let len = List.length cLst
    let rec dispPyrSub (cLst : list<char>) (cont:unit -> unit) =
        match cLst with
        | [] ->
            () |> cont
        | hd :: tl ->
            let showStr = insWSToStr(len - (List.length tl)) cLst
            dispPyrSub tl (fun () -> printf "%s\n" showStr |> cont)  
    dispPyrSub cLstGre (fun()->())
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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