• TODO:小笠原さんからのメールを貼って,ついでに解説も書いて行こう. -- けいご? 2006-06-12 (月) 21:35:54

AA折れ線グラフ †

AAで折れ線グラフを書くというお題.

入力は'R','F','C'の3種類も文字からなる長さ1以上の文字列

'R'は上昇を表し,折れ線グラフの要素としては '/' (スラッシュ)1文字に対応

'F'は下降を表し,折れ線グラフの要素としては '?' (バックスラッシュ)1文字に対応

'C'は変化なしを表し,折れ線グラフの要素としては'_'(アンダスコア)1文字に対応

たとえば,

$ ./plot RCRFCRFFCCRFFRRCRRCCFRFRFF

とすると

                  __      
                 /  ?/?/? 
 _/?_/?        _/        ?
/      ?__/?  /           
            ?/            

が出力されるようなスクリプトを書け.

--nobsun

源馬のSchemeでの回答はこちら。
http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?gemma
(源馬からの挑戦とか、超難問!とかではないです。) -- 源馬? 2006-07-01 (土) 12:00:06

解答 in Haskell †

下村です。 無駄に長い上に汚いですけど…。

output str =
    let result = graph str
        output' :: [String] -> IO ()
        output' mat =
            if any null mat then return ()
                            else do if any (' '/=) h then putStrLn h
                                                     else return ()
                                    output' t
                                        where
                                          h = map head mat
                                          t = map tail mat
    in
      output' result

graph :: String -> [String]
graph str =
    let 
        height =  (length str) * 2
        graph' [] _       = []
        graph' (x:xs) pos =
            case x of
              'R' -> oneline (pos) '/' height : graph' xs (pos-1)
              'F' -> oneline (pos+1) '??' height : graph' xs (pos+1)
              'C' -> oneline pos '_' height : graph' xs pos
    in
      graph' str (length str)

-- n番目の文字がcであるような、長さlの文字列を生成する
oneline :: Int -> Char -> Int -> String
oneline _ _ 0 = ""
oneline n c l = (if n==0 then c else ' ') : oneline (n-1) c (l-1)

で、結果は…

Main> output "RCRFCRFFCCRFFRRCRRCCFRFRFF"
                  __      
                 /  ?/?/? 
 _/?_/?        _/        ?
/      ?__/?  /           
            ?/            

Main> 

マルチスレッドなデーモン †

普通 daemon というと listen していて accept するとプロセスをフォークするアレですが、 プロセスでは無くスレッドを作って対処するなんちゃって daemon を作成しました。 OCaml の Thread,Event ライブラリを利用した concurrent programming を体験するにはちょうどいい題材です。

daemon.tar.gz

-compile.sh
-daemon.ml
-listen.ml
-main.ml

少し解説すると、daemon.ml の

   select [wrap (receive cmdCh) cmd_fsm;
	    wrap accept_evt do_action]

という部分は、

  • コマンドチャネルにコマンドが送られてくる
  • accept が起きる

という2つのイベントの内、どちらか先に起きた方だけ実行しろ、かつ、どちらかのイベントが来るまで待ってろ、という意味になります。


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS