あみだくじ
次のような書式で与えられた「あみだくじ」があります。 (あみだくじはコード中に埋め込んでも、標準入力や 外部ファイルから読み込んでも、書きやすい方法でかまいません) 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! のところ)
なんか定期的に同じことで悩んでるような…。