免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5096 | 回复: 8
打印 上一主题 下一主题

ruby低级问题,来冲下人气 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-23 17:44 |只看该作者 |倒序浏览
为解决如下问题:


有一根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 0...@Ants.size()
      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 0...@Ants.size()
      if (@Ants).getposition >= @sticklen
        @Ants.delete_at(i)
        print "ant #{i} out"
      end
      
      if @Ants.getposition <= 0
        @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





我的问题:
我使用的IDE是eclipse 在执行程序时报告如下错误:
./stick_class.rb:21:in `anymeet': undefined method `getposition' for #<Ant:0x2ba9058 @posi=25, @direct=-1, @tmintval=1, @spd=5> (NoMethodError)
        from ./stick_class.rb:18:in `each'
        from ./stick_class.rb:18:in `anymeet'
        from ./stick_class.rb:77:in `run'
        from D:/workspace/Ant/ant.rb:60
        from D:/workspace/Ant/ant.rb:22:in `each'
        from D:/workspace/Ant/ant.rb:22


很明显Ant类里面有getposition这个方法。
为什么会出现udefined method这种情况呢,而且在代码别处也有过这种错误,都是莫名其妙的消失了。
初学ruby才几天,求高人解答

论坛徽章:
0
2 [报告]
发表于 2008-07-24 15:36 |只看该作者
ruby其实还是不错的.只是我不会.帮顶一下

论坛徽章:
0
3 [报告]
发表于 2008-07-28 20:15 |只看该作者
太高级

论坛徽章:
0
4 [报告]
发表于 2008-07-29 13:09 |只看该作者

回复 #1 nnnqpnnn 的帖子

class Ant
def getpposition()
    return @posi
  end
getpposition?
getposition

论坛徽章:
52
码神
日期:2017-03-28 10:27:10综合交流区版块每日发帖之星
日期:2015-10-11 06:20:00综合交流区版块每日发帖之星
日期:2015-09-28 06:20:00综合交流区版块每日发帖之星
日期:2015-09-22 06:20:00每日论坛发贴之星
日期:2015-09-12 06:20:00综合交流区版块每日发帖之星
日期:2015-09-12 06:20:00综合交流区版块每日发帖之星
日期:2015-09-08 06:20:00综合交流区版块每日发帖之星
日期:2015-09-05 06:20:00综合交流区版块每日发帖之星
日期:2015-09-04 06:20:002015亚冠之德黑兰石油
日期:2015-09-01 10:41:53每日论坛发贴之星
日期:2015-10-11 06:20:00综合交流区版块每日发帖之星
日期:2015-10-12 06:20:00
5 [报告]
发表于 2008-07-30 21:16 |只看该作者

回复 #1 nnnqpnnn 的帖子

woxinfeixiang 该用户已被删除
6 [报告]
发表于 2008-07-31 10:44 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
7 [报告]
发表于 2008-09-04 22:13 |只看该作者
看不懂呢~~

论坛徽章:
0
8 [报告]
发表于 2008-09-06 17:33 |只看该作者
原帖由 耿耿于怀 于 2008-9-4 22:13 发表
看不懂呢~~

论坛徽章:
0
9 [报告]
发表于 2008-09-07 19:27 |只看该作者
不懂也
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP