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
下村です。 無駄に長い上に汚いですけど…。
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>