自分が作ったものを自分で添削

ファイル整理をしていたら、昔作ったrubyのコードがあった。*1
中を読んでみたら、何が書いてあるのか分かりませんでした><
「d{d=数値}t{t=時間(e.g. 週間、ヵ月)}後の自分は他人」*2という話は本当なんだなーと思いました><

添削方法

同じような振舞いをすればいい。
(classとかどんどん作っちゃてok)

添削前のコード

n=1
n=ARGV.shift.to_i  unless ARGV.empty?
def make_word(n)
  tmp=[]
  n.times do
    yield(tmp)
  end
  tmp
end

def game_exit(h,t)
  puts ("#{Time.new-t}s")
  p h
  puts ("miss=#{h["total"]-h["score"]}")
  exit
end

#~ n=3	#仮
a=%w{c d e f g a b}
b=%w{ド レ ミ ファ ソ ラ シ}
length=a.size
#対応のおしらせ
length.times {| i | puts "#{a[i]}---#{b[i]}"}
count={"score"=>0, "total"=>0}
start_time=Time.new

def answer?(a,k,length)
  length.times do |i|
    #~ puts "#{a[i]}---#{i}"
    k.gsub!(/#{a[i]}/){"#{i}"}
  end
  k
end

while 1
  answer=[]
  word=make_word(n) {|e| i = rand(length); e << b[i]; answer << i }
  answer = answer.to_s
  puts"#{word}? (if type 0 then exit)"
  k = gets.chomp
	if k=="0"
          game_exit(count, start_time)
	else
          #~ p answer?(a,k,length)
		#~ p answer
          if answer==answer?(a,k,length)
            puts "		good" 
            count["score"] += 1
          end
	end
  count["total"] += 1
end

添削後のコード

class Onpu
  def initialize length=1
    @each_length = length.to_i #1問の内に何個の音符を出すか
    @doremi = %w{ド レ ミ ファ ソ ラ シ}
    word_list = (%w{c d e f g a b}.zip(@doremi)).flatten!
    @hash = Hash[*word_list]
    @total = 0 #回答した回数
    @correct_answer = 0 #正解した回数
    @start_time = Time.now
  end
  
  def play
    explain 
    loop do
      question
      correct_answer if correct? get_answer
      #get_answerの中で終了するかしないかの判定をしている。
    end
  end

  private #ここから下はprivate_method

  def explain #ドレミとcdeの対応の説明 (あと、終了させるにはどうすれば良いか)
    @hash.each{ |k,v| puts "#{k} == #{v}"}
    puts 'if you type "q" & enter then exit'
    #"q"をふくめた文字列を入力すれば終了。
  end
  
  def question #問題を出題
    @total+=1
    @question_list = (1..@each_length).map{ @doremi[rand(@doremi.size)]}
    puts "[#{@question_list.join(", ")}]?"
  end
  
  def get_answer 
    answer = $stdin.gets.gsub(/\s/,"")[0..@each_length-1].split(//)
    gameend if answer.find{ |e| e=~ /q/}
    answer
  end

  def correct? answer_list
    @question_list == answer_list.map{|e| @hash[e]}
  end

  def correct_answer #正解だった時に呼ばれる
    puts "     good"
    @correct_answer += 1
  end

  def gameend
    @total -= 1 #questionが呼び出されるたびに1つ増えるけど、終了前の問題は回数に含めないので
    puts "play-time is #{Time.now-@start_time}[s]"
    percent = @correct_answer / @total.to_f * 100
    printf("%d%%  (total=%d, correct_answer=%d)\n", percent, @total, @correct_answer)
    puts "good bye"
    exit
  end  
end

n = ARGV[0] || 1
Onpu.new(n).play

添削してきづいたこと

(後で書く)

*1:このブログをはじめたころに作ったものだったような気がする

*2:詳しい数字は忘れました