AA 折れ線グラフクイズ 2


で die さんが書いておられる PostScript(GhostScript)版を直訳気味に(一部、意訳ありw)。

| グラフ |

グラフ := [:入力文字列 |
   | 列数 行 現在行 変換テーブル 空白行 行移動 現在列 記号 情報 |

   列数 := 入力文字列 size.
   行 := OrderedCollection new.
   現在行 := 1.

   変換テーブル := Dictionary new.
   変換テーブル at: $R put: {-1. $/. 0}.
   変換テーブル at: $F put: {0. $\. 1}.
   変換テーブル at: $C put: {0. $_. 0}.

   空白行 := String new: 列数 withAll: Character space.

   行移動 := [:差分 |
      現在行 + 差分 = 0
         ifTrue: [行 addFirst: 空白行 copy]
         ifFalse: [(現在行 := 現在行 + 差分) = (行 size + 1) ifTrue: [行 addLast: 空白行 copy]]].

   (1 to: 列数) do: [:nn |
      現在列 := nn.
      記号 := 入力文字列 at: 現在列.
      情報 := 変換テーブル at: 記号.
      行移動 value: 情報 last.
      (行 at: 現在行) at: 現在列 put: 情報 middle.
      行移動 value: 情報 first].

   行 do: [:各行 | Transcript cr; show: 各行]].

World findATranscript: nil.
グラフ value: 'RCRFCRFFCCRFFRRCRRCCFRFRFF'

同じ内容を、ほんの気持ちシンプルにした版

| series lines newLine xx move |

series := 'RCRFCRFFCCRFFRRCRRCCFRFRFF'.

newLine := String new: series size withAll: Character space.
lines := OrderedCollection new.
xx := 1.

move := [:delta |
   xx + delta = 0
      ifTrue: [lines addFirst: newLine copy]
      ifFalse: [
         xx := xx + delta.
         xx > lines size ifTrue: [lines addLast: newLine copy]]].

series doWithIndex: [:each :yy |
   each caseOf: {
      [$R] -> [move value: 0. (lines at: xx) at: yy put: $/. move value: -1].
      [$F] -> [move value: 1. (lines at: xx) at: yy put: $\. move value: 0].
      [$C] -> [move value: 0. (lines at: xx) at: yy put: $_. move value: 0]}].

World findATranscript: nil.
lines do: [:line | Transcript cr; show: line]