2006/03/26

いまごろ気づいた面白いクイズ。

AA折れ線グラフ(nobsun)
http://oss.timedia.co.jp/index.fcgi/kahua-web/show/ossz/oneline/2006-03-14

あまり悩まないでさくっと書いてみることにした。各行で出力する切片たちを割り出して、上の行から順番に書いていくだけなので、Cでもいいじゃんと言われたらそれまでという悲しさ。自分としては、各行の割り出し方が数値的なところがお気に入りなんだけど。
そういえば K&R にも、垂直方向のヒストグラムを出力させる問題があった気がする。横のものを縦にするという点では近いものがある。ない?
;; aa-graf.scm

(define (aa-graf RFC)
(let ((aas (aas RFC))
(alts (altitudes RFC)))
(let draw ((alt (apply max alts)))
(graf-at alt alts aas)
(if (> alt (apply min alts))
(draw (- alt 1))))))

(define (graf-at alt alts aas)
(print (list->string
(map (lambda (x y)
(if (eq? x alt)
y
#\space))
alts aas))))

(define (aas RFC)
(map (lambda (x)
(cond ((eq? x #\R) #\/)
((eq? x #\F) #\\)
((eq? x #\C) #\_)))
(string->list RFC)))

(define (altitudes RFC)
(map (lambda (pair)
(min (car pair) (cdr pair)))
(let R
((s 0)
(ls (map (lambda (x)
(cond ((eq? x #\R) 1)
((eq? x #\F) -1)
((eq? x #\C) 0)))
(string->list RFC))))
(if (null? ls)
'()
(cons (cons s (+ s (car ls)))
(R (+ s (car ls)) (cdr ls)))))))
gosh> (aa-graf "RCRFCRFFCCRFFRRCRRCCFRFRFF")
__
/ \/\/\
_/\_/\ _/ / \__/\ /
\/

それじゃあほかの人たちのエレガントな解答を見てみよう、と思ったんだけど、いきなり shiro さんが何をやってるんだか分からない……。つーか、自分が比較的プリミティブな Scheme の機能しか知らないのがいけない。てなことを書くと、リファレンスマニュアルを調べろと怒られそうだけど、まだまだ調べるよりも作るほうが楽しいお年頃(関数年齢)。プログラミングを独習するには10年かかるからしょうがないか。

No comments :