スポンサーサイト

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

F#雑記 Zigzag

anarchy golfに次のような問題があったのでやってみました。
 

> allDisp '*' 3;;
 
*___*___*__
_*_*_*_*_*_
__*___*___*
 
> allDisp '&' 5;;
 
&_______&_______&_______&_______&____
_&_____&_&_____&_&_____&_&_____&_&___
__&___&___&___&___&___&___&___&___&__
___&_&_____&_&_____&_&_____&_&_____&_
____&_______&_______&_______&_______&
 
(もとの問題では_ではなくて空白なのですが、表示が崩れるので_にしてあります。(最初の投稿では、0だったのですが、BLUEPIXYさんの記事を参考にして_にしました。)
 
考え方を説明します。(5の場合)
一行目に対しては[|true;false;false;false;false|]要素数5の配列を準備して、「trueなら指定された文字を打ち、falseなら_を打つ」という操作を、左端からスタートして、右に一個づつ進みながら行います。右端に行ったら、折り返して左に進みます。左端までくればまた折り返し....と続けます。
こうすると&_______&_______&_______&_______&____という形で表示されます。
 
 
二行目に対しては[|false;true;false;false;false|]要素数5の配列を準備して、「trueなら指定された文字を打ち、falseなら_を打つ」という操作を、左端からスタートして、右に一個づつ進みながら行います。あとは上と同様です。
こうすると_&_____&_&_____&_&_____&_&_____&_&___という形で表示されます。
 
以下三行目以降も同様です。
これをコード化すると例えば次のようになります。
 
let geneArr (n:int) (pos:int) =
    [| for i in 0 .. (n - 1) do
        if i <> pos then  yield false
        else   yield true |]
 
let disp (ch:char) (arr : bool[]) (pos:int) (v:int) (c:int) =
    let arrLen = arr.Length
    let limit = ( 2 * arrLen - 1) * (arrLen - 1) + 1
    let rec dispSub (pos:int) (v:int) (c:int) =
        if c = limit then 
            printfn ""
        else
            if arr.[pos] = true then 
                printf "%c" ch
            else
                printf "_"
            match pos with
            | _ when pos = 0  
                -> dispSub (pos + 1) 1 (c+1) 
            | _ when pos = arr.Length - 1
                -> dispSub (pos - 1) (-1) (c+1) 
            |_  
                ->dispSub (pos + v) v (c + 1) 
    dispSub pos v c
 
let allDisp ch n =
   for i in 0 .. (n - 1) do
    disp ch (geneArr n i) 0 1 0
 
いかにも、もっと良い方法がありそうですが、とりあえずこんなもので。
スポンサーサイト

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

コメントの投稿

非公開コメント

プロフィール

T GYOUTEN

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

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

この人とブロともになる

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