あみだくじ

次のような書式で与えられた「あみだくじ」があります。
(あみだくじはコード中に埋め込んでも、標準入力や
外部ファイルから読み込んでも、書きやすい方法でかまいません)
A B C D E
| | |-| |
|-| | |-|
| |-| |-|
|-| |-| |
|-| | | |


このあみだくじをたどって
A B C D E
| | |-| |
|-| | |-|
| |-| |-|
|-| |-| |
|-| | | |
B D C A E
のように結果を表示させるプログラムを作ってください。
エロと風俗情報満載 どう抜く?


気になるところもあるけどとりあえずできた。

class Amida
  def initialize(strs, row_num)
    @strs    = strs
    @row_num = row_num
    init
  end

  def init
    @bar_table = Array.new(@row_num) { Array.new(@strs.size - 1) { false } }
  end

  def set_bar(x, y)
    @bar_table[y][x] = true
  end

  def set_bar_random
    @bar_table.each do |row|
      before_bar = false
      row.map! do |item|
        if before_bar
          item = false
          before_bar = false
          next
        end
        item = rand(2) > 0 ? true : false
        before_bar = true if item
        item
      end
    end
  end

  def disp
    puts @strs.join(' ')
    @bar_table.each do |row|
      disp_row = row.map {|item| item ? '-' : ' ' }.join('|')
      puts '|' + disp_row + '|'
    end
  end

  def start
    disp
    @bar_table.each do |row|
      row.each_with_index do |item, idx|
        @strs[idx], @strs[idx+1] = @strs[idx+1], @strs[idx] if item
      end
    end
    puts @strs.join(' ')
    puts
  end
end

amida = Amida.new(%w( A B C D E ), 5)
# [[2, 0], [0, 1], [3, 1], [1, 2], [3, 2], [0, 3], [2, 3], [0, 4]].each do |x, y|
#   amida.set_bar(x, y)
# end
# amida.start

amida.init
amida.set_bar_random
amida.start

each に渡す引数は要素のコピーだから
コピーである引数に値を代入してもコンテナの要素は変わらない。
というのを失念していてちょっとハマった。(set_bar_random の map! のところ)
なんか定期的に同じことで悩んでるような…。