九九スクリプト書いてみたよ
http://d.hatena.ne.jp/hrkt0115311/20080805/1217928310
クラスにしないものとクラスにしたものの2つを書いてみました。
独学なので他の人がどこで詰まるとか良く分かりません><。なのでうまく説明できないです><分からないところがあったらコメントしてください><
普通に書くならこんな感じかなー。
def make_list(n) (1..n).map{|x| (1..n).map{ |y| x * y}} end def output(list, padding="\t") list.each{|e| puts e.join(padding)} end # output(make_list(9)) #2つめの引数を省略すると"\t"が渡される
クラスにするなら
class Qq def initialize n @size = n end def make_list @mem = (1..@size).map{|x| (1..@size).map{ |y| x * y}} end def output @mem ||= make_list @mem.each{ |line| puts line.join("\t")} end def output2 #blockを指定できるようにしてみる @mem ||= make_list if block_given? @mem.each{|line| puts yield(line)} else @mem.each{ |line| puts line.join("\t")} end end end
呼び出し
qq = Qq.new(6) qq.output qq.output2{|line| %Q{#{line.first} | #{line[1..-1].join(", ")}}} qq.output2{|l| l.map{|e| "( #{e} )"}.join(" ")} #1.9ならrequireしなくてもいい require 'enumerator' qq.output2{|l| l.to_enum(:each_slice, 3).map{|e| %Q{( #{e.join(" ")} )}}.join(" ")}
output2はブロックを受け取るので、いろいろな形式で出力できます。
実行結果
1 2 3 4 5 6 2 4 6 8 10 12 3 6 9 12 15 18 4 8 12 16 20 24 5 10 15 20 25 30 6 12 18 24 30 36 1 | 2, 3, 4, 5, 6 2 | 4, 6, 8, 10, 12 3 | 6, 9, 12, 15, 18 4 | 8, 12, 16, 20, 24 5 | 10, 15, 20, 25, 30 6 | 12, 18, 24, 30, 36 ( 1 ) ( 2 ) ( 3 ) ( 4 ) ( 5 ) ( 6 ) ( 2 ) ( 4 ) ( 6 ) ( 8 ) ( 10 ) ( 12 ) ( 3 ) ( 6 ) ( 9 ) ( 12 ) ( 15 ) ( 18 ) ( 4 ) ( 8 ) ( 12 ) ( 16 ) ( 20 ) ( 24 ) ( 5 ) ( 10 ) ( 15 ) ( 20 ) ( 25 ) ( 30 ) ( 6 ) ( 12 ) ( 18 ) ( 24 ) ( 30 ) ( 36 ) ( 1 2 3 ) ( 4 5 6 ) ( 2 4 6 ) ( 8 10 12 ) ( 3 6 9 ) ( 12 15 18 ) ( 4 8 12 ) ( 16 20 24 ) ( 5 10 15 ) ( 20 25 30 ) ( 6 12 18 ) ( 24 30 36 )