第23回Ruby勉強会@関西の初級者レッスン演習問題の解答例たち

Posted by okkez Fri, 22 Feb 2008 15:04:00 GMT

ざっとこんなもんかな。時間ある時に勝手に添削する。

# 添削希望のものだけね。

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

Posted in , | コメントはありません | タグ | atom

Trackbacks

Use the following link to trackback from your own site:
http://typo.okkez.net/trackbacks?article_id=KansaiWorkshop23ext&day=23&month=02&year=2008

Comments

Leave a response

Leave a comment