ror的基础是ruby,我不求对ruby有多精通但是做ror的应用至少也得熟悉ruby的基本东东吧。最近看了一段时间的ruby官网的文档,写得相当好,不过E文的啃的相当慢。光看资料也没法深入理解。于是找了个问题练练手。
为解决如下问题:
有一根300厘米的细木杆,在第30厘米、80厘米、110厘米、160厘米、250厘米这五个位置上各有一只蚂蚁。木杆很细,不能同时通过
两只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同
调头朝相反方向走。假设蚂蚁们每秒钟可以走5厘米的距离.
编程计算所以蚂蚁离开细杆用的最小时间和最大时间。
我的ruby代码如下,穷举开始时蚂蚁方向的各种组合。然后一一计算出来离开时间。
ruby-1.8.6 i386-mswin32
文件一 ant_class.rb:
文件二 stick_class.rb:
文件三 ant.rb
为解决如下问题:
有一根300厘米的细木杆,在第30厘米、80厘米、110厘米、160厘米、250厘米这五个位置上各有一只蚂蚁。木杆很细,不能同时通过
两只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头时,两只蚂蚁会同
调头朝相反方向走。假设蚂蚁们每秒钟可以走5厘米的距离.
编程计算所以蚂蚁离开细杆用的最小时间和最大时间。
我的ruby代码如下,穷举开始时蚂蚁方向的各种组合。然后一一计算出来离开时间。
ruby-1.8.6 i386-mswin32
文件一 ant_class.rb:
class Ant attr_reader:posi def initialize(direction,position,speed) ##direction must be 1 or -1 @direct = direction @posi = position @spd = speed @tmintval = 1 end def getpposition() return @posi end def getdirect() if @direct == -1 return " else return "->" end end def move() @posi += @spd*@tmintval*@direct end def turnback() @direct *= -1 end end |
文件二 stick_class.rb:
require"ant_class" class Stick def initialize(length) @sticklen = length @Ants = Array.new() end def putants(directs,posits) for i in 0...posits.size() @Ants = Ant.new(directs,posits,5) end end ##因为蚂蚁的移动速度是5,所以相对和相背移动两种情况中, ##任何两个蚂蚁之间的相对速度都是10,又任何两只蚂蚁的开始距离间隔是10的倍数。 ##所以蚂蚁之间的距离只能是10的倍数。我们判断碰撞的方法就简单了 ##只需要判断坐标相同就是了。 def anymeet() for i in [email protected]() if (i+1) == @Ants.size() break elsif (@Ants).getposition == @Ants[i+1].getposition @Ants.turnback() @Ants[i+1].turnback() puts "ant"+i+"meet"+"ant"+(i+1)+"at"+ @Ants.getposition else print "." end end end def anyout() for i in [email protected]() if (@Ants).getposition >= @sticklen @Ants.delete_at(i) print "ant #{i} out" end if @Ants.getposition @Ants.delete_at(i) print "ant #{i} out" end end end def isallout() if @Ants.size() == 0 return true else return false end end def showdirects() puts "directions:" @Ants.each do |ant| print ant.getdirect()+" " end puts "" end def showpositions() puts "positions:" @Ants.each do |ant| print ant.posi.to_s + " " end end def run() @time = 0 self.showdirects() self.showpositions() while !self.isallout @time += 1 puts @time @Ants.each {|ant| ant.move()} self.anymeet() self.anyout() end puts "========" puts "time = #{@time}" end end |
文件三 ant.rb
##### ##### require "stick_class" ###begin if __FILE__ == $0 directs = [-1,-1,-1,-1,-1] positions = [30,80,110,160,250] time = 0 st = Stick.new(300) #I hate this for i in 0...(2**5) if 0x10 & i == 0 directs[0]= -1 else directs[0] = 1 end if 0x08 & i == 0 directs[1]= -1 else directs[1]= 1 end if 0x04 & i == 0 directs[2] = -1 else directs[2] = 1 end if 0x02 & i == 0 directs[3] = -1 else directs[3] = 1 end if 0x01 & i == 0 directs[4] = -1 else directs[4] = 1 end puts "case #{i}" st.putants(directs,positions) st.run() end end |