2006/03/14
入力は'R','F','C'の3種類の文字からなる長さ1以上の文字列
- 'R'は上昇を表し,折れ線グラフの要素としては '/' (スラッシュ)1文字に対応
- 'F'は下降を表し,折れ線グラフの要素としては '\' (バックスラッシュ)1文字に対応
- 'C'は変化なしを表し,折れ線グラフの要素としては'_'(アンダスコア)1文字に対応
わしの答え。
(use gauche.sequence) (define (graph input) (define (input->plist input) (fold2 (lambda (cmd r y) (case cmd ((#\R) (values (acons y #\/ r) (+ y 1))) ((#\F) (values (acons (- y 1) #\\ r) (- y 1))) ((#\C) (values (acons y #\_ r) y)))) () 0 input)) (define (draw-row plist y) (fold (lambda (p r) (cond ((= (car p) y) (display (cdr p)) #t) (else (display #\space) r))) #f plist)) (let ((plist (reverse (values-ref (input->plist input) 0)))) (let loop ((y (apply max -1/0 (map car plist)))) (and (draw-row plist y) (display #\newline) (loop (- y 1))))))
最後に空行が入るのは気にしないっと。
yの最大値はinput->plistの段階で計算するって手もある。
gosh> (graph "RCRFCRFFCCRFFRRCRRCCFRFRFF") __ / \/\/\ _/\_/\ _/ \ / \__/\ / \/ #f
Tags: Programming, Gauche
cut-sea (2006/03/14 22:57:39):
shiro :