- 追加された行はこの色です。
- 削除された行はこの色です。
- ''TODO:''小笠原さんからのメールを貼って,ついでに解説も書いて行こう. -- [[けいご]] &new{2006-06-12 (月) 21:35:54};
#contents
*[[AA折れ線グラフ:http://oss.timedia.co.jp/index.fcgi/kahua-web/show/column/%ba%a3%c6%fc%a4%ce%b0%ec%b9%d4/%a3%b2%a3%b0%a3%b0%a3%b6%c7%af%a3%b3%b7%ee#H-1bpntk8]] [#j83662b2]
がしがし書いてください
>AAで折れ線グラフを書くというお題.
#ls(ネタ記録庫)
>入力は'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 ~
(源馬からの挑戦とか、超難問!とかではないです。) -- [[源馬]] &new{2006-07-01 (土) 12:00:06};
**解答 in Haskell [#nd70223e]
下村です。
無駄に長い上に汚いですけど…。
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>
#comment