AA 折れ線グラフクイズ 8


http://oss.timedia.co.jp/index.fcgi/kahua-web/show/ossz/oneline/2006-03-14
http://oss.timedia.co.jp/index.fcgi/kahua-web/show/ossz/oneline/2006-03-15

オーソドックスな解答例(座標をキーにした連想配列に入れておき、あとでスキャン…)はこちら


id:sumim:20060407:p1 からの続き。hirofummy さんの Haskell 版は、やはり Y 座標をいちいち算出しないのがそのココロ…のような気がしてきたので、書き直し。 この解法は、短い割に謎めいて(?)いて動作機序の解析も楽しいのではないかと。 関数的プログラミングな実装にも応用が利きやすく、しかし、オブジェクト指向的(この文脈では、どちらかというとストラウストラップの…というよりは、ケイの…)にもオブジェクトをいじっている感も強くあり、あるいは、オブジェクトのアイデンティティを意識できているかの確認もできる…というスグレモノ。


追記1:
tociyuki さんが id:tociyuki:20060409:1144556964 にて、Ruby 版のリファクタリングを試みてくださっています。

追記2:
さらに id:tociyuki:20060409:1144565144 にて新たに Perl 版も。

SqueakSmalltalk

| series uppers lowers plot |

series := 'RCRFCRFFCCRFFRRCRRCCFRFRFF'.

uppers := OrderedCollection new.
lowers := OrderedCollection new.

plot := [:from :to :chr |
   | curr |
   from ifEmpty: [from add: OrderedCollection new].
   curr := from removeLast addFirst: chr; yourself.
   uppers, lowers do: [:line | line addFirst: Character space].
   to addLast: curr].

series reverseDo: [:code |
   code caseOf: {
      [$R] -> [plot valueWithArguments: {lowers. uppers. $/}].
      [$F] -> [plot valueWithArguments: {uppers. lowers. $\}].
      [$C] -> [plot valueWithArguments: {uppers. uppers. $_}]}].

World findATranscript: nil.
uppers, lowers reverse do: [:line | Transcript cr; show: (line as: String)]

ほぼ直訳の Ruby

#!/usr/local/bin/ruby

series = ARGV[0]

uppers = Array.new
lowers = Array.new

plot = proc do |from,to,chr|
  from << "" if from.empty?
  curr = from.pop.insert(0, chr)
  (uppers + lowers).each {|line| line.insert(0, " ")}
  to << curr
end

series.split(//).reverse.each do |code|
  case code
  when "R"; plot.call(lowers, uppers, "/")
  when "F"; plot.call(uppers, lowers, "\\")
  when "C"; plot.call(uppers, uppers, "_")
  end
end

puts uppers + lowers.reverse