三角暗算

脳を鍛える大人のDSトレーニングで,なにかと不得意な三角暗算難しいバージョンを,Rubyさんにやらせてみるぞ.もはや暗算ではないとかいう突っ込みはしないでね.

久しぶりに実用的なコードを書いた気がするぞ.

#! /opt/local/bin/ruby
class Array
  def to_i
    (0 ... self.size).each do |i|
      self[i] = self[i].to_i
    end
  end
  
  def sankaku
    if self.size == 1
      self[0]
    elsif self.size == 2
      self[0] + self[1]
    else
      new_arr = []
      (0 ... (self.size - 2)).each do |i|
        new_arr[i] = minisankaku(self[i],self[i+1],self[i+2])
      end
      new_arr.sankaku
    end
  end
  
  def minisankaku(a,b,c)
    return a + b + b + c
  end
end

puts "Please input numbers by separating with a space"
print ">"
l = gets.chomp
nums = l.split(/\s/)
nums.to_i

puts "result:#{nums.sankaku}"

最初,入力する数字の個数(奇数か偶数か)で処理がややこしくなるかな?とか思いながら,Integerにeven?とかいうメソッドを追加してみたりしたけど,結局要らなかった.
配列の内容を全て整数値にするために,Stringでよく使うto_iを配列用に作りました.簡単.


三角暗算の処理で,each_indexを使うのも有りですが,それだとifの条件をぶち込み,breakしてループから抜けなきゃならないので,おそらく(0 ... (self.size - 2)).eachのほうが楽.to_iのトコはeach_indexで十分ですが,これは練習ですから.
ちなみに,足し算専用です.


実行結果です.

$ ruby sankaku.rb 
Please input numbers by delimiting space
>1 2 3 4 5 6 7
result:256

たぶん正解.


あ,英語は適当です.