设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
楼主: 沙漠点灰
打印 上一主题 下一主题

[讨论] 几个有意思的问题_第二弹

[复制链接]

Lv3.寻梦者

孤独守望

梦石
0
星屑
3121
在线时间
1534 小时
注册时间
2006-10-16
帖子
4321

开拓者贵宾

11
发表于 2011-4-3 13:01:33 | 只看该作者
F12
rescue Reset
exit
搞定。

点评

什么意思...?求解...  发表于 2011-4-3 13:21
菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复 支持 反对

使用道具 举报

Lv3.寻梦者

孤独守望

梦石
0
星屑
3121
在线时间
1534 小时
注册时间
2006-10-16
帖子
4321

开拓者贵宾

12
发表于 2011-4-3 13:03:53 | 只看该作者
本帖最后由 IamI 于 2011-4-3 13:04 编辑

6是Bom,去掉前三个字符即可

Orz连贴系统悲剧了?连贴我有错......

点评

XP區一直是沒有防連貼機制,讓我很怨念……這是赤裸裸的區別歧視  发表于 2011-4-3 13:12
回复 支持 反对

使用道具 举报

Lv1.梦旅人

百合乡の蕾咪

梦石
0
星屑
55
在线时间
151 小时
注册时间
2011-1-12
帖子
198
13
发表于 2011-4-3 13:12:18 | 只看该作者
本帖最后由 蕾米莉亚·斯卡雷特 于 2011-4-3 13:13 编辑

求质数:
  1. t = Time.new

  2. number = 1000
  3. array = []
  4. number.times do |i|
  5.   array[i] = i % 2 == 0 ? false : true
  6. end
  7. pa = []

  8. max = Math.sqrt(number)

  9. 3.step(max, 2) do |n|
  10.   if array[n]
  11.     (2 * n).step(number, n) do |i|
  12.       array[i] = false
  13.     end
  14.   end
  15. end

  16. array.each_index do |timers|
  17.   pa << timers if array[timers]
  18. end

  19. p pa

  20. p Time.new - t
复制代码
咱的渣电脑运行起来这个渣算法, 1.14秒
= = 很长~~

点评

d对于 Ruby 一窍不通的咱来说, 压力很大. 以上是借口, 无视即可~~~  发表于 2011-4-3 13:26
太长了  发表于 2011-4-3 13:19
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
323 小时
注册时间
2010-8-21
帖子
666
14
 楼主| 发表于 2011-4-3 13:17:14 | 只看该作者
本帖最后由 沙漠点灰 于 2011-4-3 13:27 编辑

回复 DeathKing 的帖子

既然有人了,公布答案吧!
1.
$g ? exit: $g=0
2.
rray.send(:define_method,:max){self.sort[-1]}
3.
$abc = 0
alias $bcd $abc
$abc += 1
p $bcd == $abc  => true

4.DK对了!(....)

5.因为不支持浮点坐标,不管怎么都有误差
减少误差方法:
一:精灵类追加2个浮点变量记录"真坐标",误差大大减小
二:用数组保存移动路径,每移动1帧调用shift

6.这是IO的编码不兼容(晕,不大可能兼容吧,Ruby是UTF-8),不多说

7.
(array.inject{|a,i|a.width*a.height>i.width*i.height ? a:i}).dispose

8.伪代码如下:
("1000".."9999").inject([]){|a,i|a<<i if 判断}
判断有点长,就不写了(比如包含"2","3",不包括"23","32",与[6,7,8,9]无交集等等),不过可以1行搞定

9.压轴..?还是可以1行搞定:

(3..1000).inject([2]){|a,i|a.all?{|b|i%b!=0}?a<<i:a}

共计迭代15620次

把步长设为2(偶数Pass掉), i大于根号b时直接返回true(为什么...?自己想)等方法可以把迭代次数降到12000次左右,

(3..1000).inject([2]){|a,i|a.all?{|b|i%b!=0}?a<<i:a}
呵呵,Ruby果然很强

p.s 主要是复习了一下Ruby参考手册(学的时候看不懂,现在终于懂了),发现 inject太强了

点评

3 那个起别名的方法只能用于全局变量呢,你给的例子是局部变量……  发表于 2011-4-3 19:38
>>猛戳>>MetalSagaR游戏主页<<这里<<
欢迎提供您的意见
回复 支持 反对

使用道具 举报

Lv1.梦旅人

百合乡の蕾咪

梦石
0
星屑
55
在线时间
151 小时
注册时间
2011-1-12
帖子
198
15
发表于 2011-4-3 14:17:04 | 只看该作者
求解 inject 的用法~~

点评

Ruby的基本知识...  发表于 2011-4-3 14:21
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
323 小时
注册时间
2010-8-21
帖子
666
16
 楼主| 发表于 2011-4-3 14:27:29 | 只看该作者
回复 蕾米莉亚·斯卡雷特 的帖子

格式   范围.inject(默认值){|a,b|......}
若有默认值,把默认值赋给a,把范围的第一个值赋给b
......是指代码块,每迭代一次会有个返回值(Ruby的特殊之处,方法都有返回值),把这个
返回值赋给a,把范围的第二个值赋给b........一次类推,最后返回a

若没有默认值,把范围的第一个值赋给a,把范围的第二个值赋给b.执行代码块,返回值
赋给a.把范围的第三个值赋给b........一次类推,最后返回a

点评

了解了. 咱连基础都没有. 哭............ 理解 inject 的意思后, 就明白原理了.  发表于 2011-4-3 14:43
还有reject,就不说了  发表于 2011-4-3 14:28
>>猛戳>>MetalSagaR游戏主页<<这里<<
欢迎提供您的意见
回复 支持 反对

使用道具 举报

Lv3.寻梦者

孤独守望

梦石
0
星屑
3121
在线时间
1534 小时
注册时间
2006-10-16
帖子
4321

开拓者贵宾

17
发表于 2011-4-3 15:02:36 | 只看该作者
第一题另解XD,RM在按下F12时会在主轴上创建Reset类型并抛出,抓住并重置即可
  1. rescue Errno::ENOENT
  2.   # 补充 Errno::ENOENT 以外错误
  3.   # 无法打开文件的情况下、显示信息后结束
  4.   filename = $!.message.sub("No such file or directory - ", "")
  5.   print("找不到文件 #{filename}。 ")
  6. rescue Reset
  7.   exit
  8. end
复制代码
第六题代码示例
  1. s = File.open("1.txt").read
  2. s[0,3] = "" if s[0] == 239
  3. eval(s)
复制代码
BOM是UTF-8的标志,长度为3个字符,将之删去代码即可运行。

点评

Reset 异常类是动态生成的,所以需要做一个判断,否则直接退出反而会抛出别的异常。  发表于 2011-4-3 19:31
菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
18
发表于 2011-4-3 19:25:09 | 只看该作者
1、
在所有脚本之前加一句:
  1. $!&&exit
复制代码
这是图省事了,正途还是应该去捕获 `Reset' 异常。

2、
  1. class Array
  2.   def max
  3.     inject(self[0]) { |max, elem| elem > max ? elem : max }
  4.   end
  5. end
复制代码
3、
你举的两个例子性质不一样——前者的 `actor.hp -= damage' 是 `actor.hp = actor.hp -

damage' 的语法糖,其中有调用 `actor' 这个对象的 `hp=' 实例方法和 actor.hp 的 `-' 实

例方法的过程,但 `actor' 这个引用的值没有变。后者的 `b -= a' 是 `b = b - a',直接改

变了 `b' 这个引用的值,而并不是调用了 `xxx=' 这样的 setter。和第二个例子中的运算对称

的应该是 `actor -= damage',而这种调用方式同样会改变 `actor' 这个引用本身,除非 `-'

方法返回 self。不太清楚你是纯粹想模拟后者的指针反引用机制还是前者的成员变异机制。

4、
前者在当前 Binding 下名为 Foo 的常量已定义时返回 "constant",否则返回 nil;后者在

当前 Binding 下名为 Foo 的方法已定义时返回 "method",否则返回 nil。

5、
想继续用浮点运算的话可以通过 Float#round 四舍五入。熊猫那种是强制类型转换,在大部分语言中是直接抛弃小数部分的。

6、
  1. eval "nil.send '66'"
复制代码
如果是 RMXP 的环境,顶层 self 默认已经是 nil。

7、
  1. class Bitmap
  2.   def area
  3.     width * height
  4.   end
  5. end

  6. arr = [Bitmap.new(1,1), Bitmap.new(2,1), Bitmap.new(3,4),Bitmap.new(5,2)]


  7. p arr

  8. arr.max { |u, v| u.area <=> v.area }.dispose

  9. # 位图释放分布
  10. p arr.collect { |u| u.disposed? }
复制代码
8、
有泛用的排列算法,不过鉴于这里排列长度仅仅为 4,还是套四个循环简单:
  1. arr = []

  2. def get_next_possible_digits(*digits)
  3.   result, absence = [ ], [ true ] * 6
  4.   digits.each { |digit| absence[digit] = false }
  5.   free = 2 * ((absence[2] ? 0 : 1) + (absence[3] ? 0 : 1)) >= digits.size
  6.   [0, 1, 4, 5].each { |e| result << e if absence[e] } if free
  7.   result << 2 if absence[2] and digits[-1] != 3
  8.   result << 3 if absence[3] and digits[-1] != 2
  9.   result
  10. end

  11. for i in 1..5
  12.   for j in get_next_possible_digits(i)
  13.     for k in get_next_possible_digits(i, j)
  14.       for l in get_next_possible_digits(i, j, k)
  15.         arr << i * 1000 + j * 100 + k * 10 + l
  16.       end
  17.     end
  18.   end
  19. end

  20. p arr
复制代码
统计学方法:
2??3 => 共 P(4,2) 种排列
2?3? => 共 P(4,2) 种排列
?2?3 => 共 3^2 排列

互换 2 和 3 的位置排列方式翻倍,于是最后是 2*(2*P(4,2)+3^2)=66

9、
Golfer 的版本:
  1. 2.upto(1e3){|i|(2..i).one?{|j|i%j==0}&&p(i)}
复制代码
不过 one? 只有 Ruby 1.9 才有。在 RM 里的话只能:
  1. 2.upto(1e3){|i|(2...i).all?{|j|i%j!=0}&&p(i)}
复制代码
追求执行效率的参见这贴:
http://rpg.blue/forum.php?mod=viewthread&tid=140141
我(用主号)在33楼发过 Eratosthenes 筛法,而 Atkin 筛法是它的一个优化版,是目前公认最快的质数筛法。
http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

点评

当时急着回老家,严谨性神马的都没考虑,现在还在想为神马给漏掉了。  发表于 2011-4-5 22:34
汗掉,发的时候没看到,原来答案都发了 -v-  发表于 2011-4-3 19:33
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
462 小时
注册时间
2007-7-30
帖子
643
19
发表于 2011-4-3 21:31:08 | 只看该作者
1.
利用F12的特性...
"重载脚本"

  1. exit if $runOnce
  2. $runOnce = true
复制代码
RGE这万年大坑 啥时填起来@@

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
323 小时
注册时间
2010-8-21
帖子
666
20
 楼主| 发表于 2011-4-4 12:45:27 | 只看该作者
回复 苏小脉 的帖子

回3: 两个个数类变量(类型不限)的值
已经说明 类型不限 了.....
回9:
果然Golfer不追求效率
2.upto(1e3){|i|(2...i).all?{|j|i%j!=0}&&p(i)}
共计迭代78022次,比我
(3..1000).inject([2]){|a,i|a.all?{|b|i%b!=0}?a<<i:a}
的15620大多了
>>猛戳>>MetalSagaR游戏主页<<这里<<
欢迎提供您的意见
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-4-20 10:04

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表