自分が作ったものを自分で添削
ファイル整理をしていたら、昔作った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
添削してきづいたこと
(後で書く)