第23回Ruby勉強会@関西の初級者レッスン演習問題の解答例たち
投稿者 okkez
- 第23回 Ruby/Rails勉強会@関西に参加してきた (Kanasansoft Web Lab.)
- ころころ毬藻転がし(RC) 第23回 Ruby/Rails勉強会@関西に関するメモ
- RubyKansai23 - Ruby/Rails勉強会@関西に行ってきた - 風産み日記
- Ruby関西勉強会#23参加 - らいとなひび
- ruby勉強会の演習問題を解いてみた - いつの間にか27歳日記
- Ruby/Rails勉強会@関西 - チナミニ
- 2008-02-17 - ekurodaの日記
- wwwaku » 2008 » 2月 » 17
- Nov's daily? report - DeveloperNews #4 , 第23回 Ruby/Rails勉強会@関西 , 最近の Amazon , tail
ざっとこんなもんかな。時間ある時に勝手に添削する。
# 添削希望のものだけね。
Kanasan の 100 マス計算
趣味も大分入るけど以下のような感じで添削しました。
- 題意を勘違いしてる?
- 演算子もランダムにして欲しかったけどこれはこれでアリなので活かすことにする
- 使える演算子は決まっているので、定数化する
- 入力値のチェックに正規表現を使っていたがこの程度なら文字列比較で十分
- 一度初期化したら変わらない変数は定数にする
- メソッド定義のカッコは省略しない
- るりまのフォーマットに従う方向で。
- exit 1 にしとく
- コマンドの失敗時の戻り値は 1 であることが多いため
- 一文字変数はスコープが短い所で使用する
- 配列の変数名は配列であることが予想できるような名前にする
kanasan's 100マス計算添削後#! /usr/bin/ruby OPERATORS = %w[+ - * / %] DIGIT = 2 SEPARATOR = " " VERTICAL_LINE = "|" HORIZONTAL_LINE = "-" CROSS_LINE = "+" operator = ARGV[0].to_s unless OPERATORS.include?(operator) puts "wrong parameter: operator is only +-*/%" exit 1 end def display100Math(xs, ys, operator, display_answer) print SEPARATOR * (DIGIT - operator.size) print operator print SEPARATOR print VERTICAL_LINE xs.to_a.each do |x| print SEPARATOR print SEPARATOR * (DIGIT - x.to_s.size) print x end puts "" print HORIZONTAL_LINE * DIGIT print HORIZONTAL_LINE print CROSS_LINE xs.size.times do print HORIZONTAL_LINE print HORIZONTAL_LINE * DIGIT end puts "" ys.each do |y| print SEPARATOR * (DIGIT - y.to_s.size) print y print SEPARATOR print VERTICAL_LINE if display_answer xs.each do |x| answer = y.send(operator, x) print SEPARATOR print SEPARATOR * (DIGIT - answer.to_s.size) print answer end end puts "" end end xs = (1..9).sort_by{rand} ys = (1..9).sort_by{rand} display100Math(xs, ys, operator, false) puts "" display100Math(xs, ys, operator, true)
やらなかったこと * 100マス化 * 今のは 81 マスしかない * 短く簡潔にすること * やっちゃうと大改造になるため(元が残らない)
sixeight さんの 100 マス計算
同じく趣味が入るけどこんな感じ。
- いくつかの変数名/メソッド名を変更した
- 多分、わかりやすくなった?
- initialize に仕事積めすぎなので @header を make_question に移動
- そうするとインスタンス変数である必要がなくなるのでローカル変数にした
- make_matrix は表作成専用にした
適切に仕事を分割することでよりよくなったはず。
sixeight's 100 マス計算添削後class Hyakumasu def initialize @op = [:+, :-, :*, :/][rand(4)] @row = (0..9).sort_by{ rand } @col = (0..9).sort_by{ rand } end def make_matrix header = "#{@op} | " + @col.join(' ') + "\n--|" + "---" * @col.length @row.inject(header){|r, v| r + "\n#{v} |" + (block_given? ? yield(v) : '') } end def display puts make_matrix puts puts make_matrix{|v| @row.map {|i| "%3d" %((@op == :/ && i.zero?) ? 0 : v.send(@op, i)) }.join } end end Hyakumasu.new.display


