スポンサーサイト

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

どう書く?org F# 文字列で+を表示する

今回の問題はこちら 
 
与えられた文字列で+のかたちを表示するプログラムをかいてください。
サンプル入力:
doukaku
 
サンプル出力:(表示がくずれるので、ブランク部分に_をいれてあります。)
_______doukakud
_______u______o
_______k______u
_______a______k
_______k______a
_______u______k
_______o______u
doukakud______doukakud
u____________________o
k____________________u
a____________________k
k____________________a
u____________________k
o____________________u
dukakuod______dukakuod
_______u______o
_______k______u
_______a______k
_______k______a
_______u______k
_______o______u
_______dukakuod
 
今回はLEGO風に書いてみました。
コードは以下の通り
 
type NextTurnDirection =
    |Right
    |Left
let cdr (dx,dy) = ((-1)*dy,dx) //cdrはchangeDirectionRightの略
let cdl (dx,dy) = (dy,(-1)*dx) //cdlはchangeDirectionLeftの略
 
let doWork (s:string) =
    let len = s.Length
    let canvasArr = Array2D.create (3*len + 1) (3*len + 1) ' ' 
    let startPos = (len,0)
    let getNextTrunDirection turnN = 
        if turnN % 3 = 1 then Left else Right //3回に1回左折
    let rec drawCanvas stepNum turnNum (x,y) (dx,dy) cbfvosp =
       // cbfvospはcanBeFirstVisitOnStartPointの略
       if (x,y) = startPos && cbfvosp = false then
            ()
       else
          canvasArr.[x,y] <- s.[stepNum] 
          match (stepNum,turnNum) with
          |(sn,tn)  when sn = len - 1 && (getNextTrunDirection tn) = Right
                ->  drawCanvas 0 (tn + 1) (x+dx,y+dy) (cdr (dx,dy)) false
          |(sn,tn)  when sn = len - 1 && (getNextTrunDirection tn) = Left
                ->  drawCanvas 0 (tn + 1) (x+dx,y+dy) (cdl (dx,dy)) false   
          |(sn,tn)
                ->  drawCanvas (stepNum+1) tn (x+dx,y+dy) (dx,dy) false
    
    drawCanvas 0 0  startPos (1,0) true  
    
    for i in 0 .. 3*len do
        printfn ""
        for j in 0 .. 3*len do
            printf "%c" canvasArr.[j,i]
 
open System
 
[<STAThread()>] 
[<EntryPoint>] 
let main(args) = 
    if (args.Length = 0 || args.[0].Length <2) then
        printf "引数が不正です。"
    else
        doWork args.[0]
    0
 
スポンサーサイト

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

コメントの投稿

非公開コメント

余計なお世話

System.Console.SetCursorPosition を使うと、コンソール画面の任意の位置にカーソルを設定できるから、
仮想キャンバスはいらないですよ
ってちがうか。

余計なお世話2

[<STAThread()>]
は、() は、いらん(なくてよい)ですよ

また
[<STAThread;EntryPoint>]
のようにまとめられます。
って既知か。

「余計なお世話」ではありません

BLUEPIXYさん、コメントありがとうございます。
いやいや、両方とも知りませんでした。
勉強になります。感謝です。
プロフィール

T GYOUTEN

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

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

この人とブロともになる

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