obelisk.hatenablog.com前回作った RactorEnum を作ってみます。
迷路のスタート(S)から水を流し、お宝が水没するたびにお宝の座標と種類を(リアルタイムで)出力するというものです。
幅優先探索で、お宝に到達するたびにre.pipe
に流し込みます。
require_relative "ractor_enum" re = RactorEnum.new field = DATA.readlines Ractor.new(field, re) do |field, re| queue = [[1, 1]] while (now = queue.shift) x, y = now [[1, 0], [0, -1], [-1, 0], [0, 1]].each do |dx, dy| x1 = x + dx y1 = y + dy a = field[y1][x1] re.pipe << [a, [x1, y1]] if a != " " && a != "." && a != "#" if a != "#" && a != "." queue << [x1, y1] field[y1][x1] = "." end end end re.pipe << RactorEnum::End.new end re.each { |item, (x, y)| puts "(%2d,%2d) -> #{item}" % [x, y] } __END__ ########################### #S # = # ## # @ # # #+ ########## # ######## > # * # # # # ##### # !# # # # ### ############ # # # # # # # # $ # # ##### # # # # ############## # # # # # # # V # # & # # # # ###########################
出力。
( 1, 1) -> S ( 1, 3) -> + ( 7, 2) -> @ (10, 4) -> > (20, 1) -> = ( 3, 6) -> ! ( 8,13) -> V (19, 4) -> * (20, 9) -> $ (24,13) -> &