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

Project1

 找回密码
 注册会员
搜索
查看: 3447|回复: 6
打印 上一主题 下一主题

[讨论] 几个有意思的问题

[复制链接]

Lv1.梦旅人

梦石
0
星屑
55
在线时间
323 小时
注册时间
2010-8-21
帖子
666
跳转到指定楼层
1
发表于 2011-3-17 17:25:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 沙漠点灰 于 2011-3-17 17:27 编辑

            ——66RPG 2011年RGSS1二级考试——

额,上面的请大家无视掉....
如题,考考大家几个有意思的问题:
(不要看别人的答案....)

1.往text.txt文件里面写入下面信息:
"66RPG" == '66RPG' ? print "Yes" : print 'No'

  要求:在不用分号等有换行性质的符号情况下一行代码搞定.

2.考完写,再考考读:

  现有text.txt文件中有下面信息:
546 456 545 66 48 68 86 8687


  现使array = [546, 456, 545, 66, 48, 68, 86, 8687]
  注意,每个单元为数,不是字符串
  要求:在不用分号等有换行性质的符号情况下一行代码搞定.

3.读写都考了,可惜,还有——

  根目录下有一名字为
#{01}66'RPG'.png


  的图片,请显示它
  要求:在不用分号等有换行性质的符号情况下一行代码搞定.

4.呵呵,被上面的"1行流"搞混了....?那么来个简单的....

  Bitmap类有个draw_text方法,既可以
   
draw_text(x, y, width, height, str[, align])



  也可以
draw_text(rect, str[, align])


  二者参数的数量不同,请分析一下可能性

5.什么...?上面那个太简单了?那么再来个更简单的!(怎么越来越简单了....?)
  1. print"#{变量}+1=#{变量+1}"
复制代码
要求显示  1+1=3



6.什么...?上面那个更简单了,没有挑战性...?好,来个高难度的...

请尝试重新定义Array类的sort方法,不考虑 块

要求:在不用分号等有换行性质的符号情况下(一行代码搞定,开玩笑,还有end)看谁的代码行少,随便用什么算法



7.无语了...?来个简单的....

print a a a a a a a a a a a a a a a

  是什么意思...?

8.恭喜您开启成就——"1行流"....

至于答案嘛....有时间下次发上来

>>猛戳>>MetalSagaR游戏主页<<这里<<
欢迎提供您的意见

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
2
发表于 2011-3-17 22:12:50 | 只看该作者
本帖最后由 苏小脉 于 2011-3-18 02:32 编辑

楼主莫非也玩 CodeGolf?试图压缩代码确实对熟悉语言接口有帮助~

1、
open('text.txt','w'){|f|f<<%q^"66RPG" == '66RPG' ? print "Yes" : print 'No'^}

2、
array=open('text.txt'){|f|f.gets.scan(/\d+/).map{|e|e.to_i}}

3、
Sprite.new.bitmap=Bitmap.new"\#{01}66'RPG'.png"

4、
Ruby 是动态类型语言,它可以通过反射机制获取运行时类型来模拟多重分派。同时,它也支持可变长度的参数列表,故而参数的个数也可是方法行为的决定因素。
在某些语言中有所谓方法重载的概念,而这个概念只是针对静态类型语言而言的。对于静态类型语言来说,方法的参数类型是方法正式签名的一部分,在编译链接时,编译器能很轻易地进行方法名的绑定,不带来任何运行时的开销。然而像 Ruby 这样的动态类型语言,实际参数的类型是不能在编译时决定的,他只能进行迟绑定,在运行时通过查找分派函数找到对应的方法,这种情况下,如果允许方法行为依动态参数类型而变化,那么就是针对动态类型语言而言的多重分派机制。理论上 Ruby 也可以像 Common Lisp 一样在语言层支持多重分派,但那样将会进一步降低方法调用时的执行效率(分派表将会更加庞大),同时这也使得语言的实现更加复杂。Ruby 灵活的参数处理能力完全能替代多重分派,所以 Ruby 迄今为止并没有在语言层支持多重分派(或是模拟的方法重载)。

5、
(变量=1).class.send(:define_method,:+){|i|3}
print"#{变量}+1=#{变量+1}"

6、
Array.send(:define_method,:sort){(D=dup).dup.inject([]){|a,e|a<<D.slice!(D.index(D.min))}}

评分

参与人数 3星屑 +416 收起 理由
IamI + 200 老板威武 = =b
fux2 + 200 DK君的老板威武!
DeathKing + 16 老板威武

查看全部评分

[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv1.梦旅人

路人党员

梦石
0
星屑
51
在线时间
2276 小时
注册时间
2010-12-30
帖子
3225
3
发表于 2011-3-18 08:55:43 | 只看该作者
我不是来看lz的问题的
我是来看沙发的答案的
本人擅长XP,如果有脚本或者Ruby方面的问题欢迎发电邮到[email protected]咨询,本人很少检查电邮所以不一定会及时回复,本人不会直接出手解决问题只会提供一个方向,所以谢绝伸手党
回复 支持 反对

使用道具 举报

Lv1.梦旅人

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

额,这是2级考试,不是4级考试....
1.这道题主要是开怎么输出"
这是当初想输出"时被困扰了一下,试了几下,发现
(/"/).to_s[7..7] 可以代表"
当然,和沙发的答案是天壤之别....我就不多说了

2.嘿嘿,这个,我的比沙发的短了那么一点....
array=eval "["+open('text.txt').read.gsub!(/ /){","}+"]"
不解释...

3.
Sprite.new.bitmap=Bitmap.new "*.png"
(某人被PIA飞,不解释)

4.我强调了"可能"....比如:
  1. class Bitmap
  2.   def draw_text(x=0, y=nil, width=0, height=nil, str=nil, align=0)
  3.     if x.is_a(Rect)
  4.       s1 = x.x
  5.       s2 = x.y
  6.       s3 = x.width
  7.       s4 = y.height
  8.       draw_text(s1,s2,s3,s4,y,width)
  9.       return
  10.     end
  11.     XXXXXXXXXXXXXXXXXX
  12.   end
  13. end
复制代码
5.我对沙发的答案无语了,直接拿类开刀(你懂不懂,这叫技术....某人再次被PIA飞)
这个可以定义个叫变量的方法
让其第一次返回1,第二次返回2:
def 变量
  $无语 == nil ? $无语 = 1 : 2
end

6.沙发的答案是好,但有个BUG,这个方法具有破坏性.....
Array.send(:define_method,:sort){self.dup.sort!}
(再次被PIA,不解释)

7.print a a a a a a a a a a a a a a
完整代码应为
print a(a(a(a(a(a(a(a(a(a)))))))))
不解释....
>>猛戳>>MetalSagaR游戏主页<<这里<<
欢迎提供您的意见
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
5
发表于 2011-3-19 15:21:18 | 只看该作者
本帖最后由 苏小脉 于 2011-3-19 15:23 编辑

回复 沙漠点灰 的帖子

这是当初想输出"时被困扰了一下

呵呵,其实 Ruby 在字面值的处理上是很灵活的,如果双引号和单引号都需要包含在字符串中的同时又不想转义字符,就可以使用 %、%q、%Q 这三种常规定界输入字符串的语法。不过这种语法可读性很低,有时还不如直接做如下的转义:

str = "\"66RPG\" == '66RPG' ? print \"Yes\" : print 'No'"

或是:

str = '"66RPG" == \'66RPG\' ? print "Yes" : print \'No\''

如果使用 here document 的话末尾会多一个换行,自然是不如上面的方法惬意了。

另外我上面写的还有一个多余的字符,那个小写的 `q' 可以不要。

然后又发现如果利用 Shell 命令的话其实更短……

`echo "66RPG" == '66RPG' ? print "Yes" : print 'No'>text.txt`

当然这个有平台依赖性。MS-DOS 的 echo 很神奇,双引号和单引号居然没有被 Shell 当作分隔符处理,而是原封不动地被当作字面值,相比 Unix 的语法反而节省了不少字符 o_o

嘿嘿,这个,我的比沙发的短了那么一点


哈哈,厉害~虽然你这个解没有手动释放输入流的资源,但作为 code golfer 来说确实足够了,反正流最后也会被 GC 关闭……

又在你的基础上改了改,更短了:

array=eval"[#{IO.read('text.txt').gsub(/ /,',')}]"

Sprite.new.bitmap=Bitmap.new "*.png"
(某人被PIA飞,不解释)


ovO 呃,原来是在玩谓词逻辑——“根目录下有一名字为...”且“请显示它”并不逻辑涵蕴“不能显示其它图片”,所以通配符通吃了?

另外,双引号前的空格可以省略,因为对于 RUby 词法分析器来说双引号和标识符可以被轻易定界。

class Bitmap
  def draw_text(x=0, y=nil, width=0, height=nil, str=nil, align=0)
    if x.is_a(Rect)
      s1 = x.x
      s2 = x.y
      s3 = x.width
      s4 = y.height
      draw_text(s1,s2,s3,s4,y,width)
      return
    end
    XXXXXXXXXXXXXXXXXX
  end
end


嗯,Objecg#is_a? 就是反射的其中一个 API 咯~方法参数也可以直接用可变参数列表。

这个可以定义个叫变量的方法
让其第一次返回1,第二次返回2:
def 变量
  $无语 == nil ? $无语 = 1 : 2
end


也是,这么写的话,无换行,也比我那个短一点:

Object.send(:define_method,:变量){$g?2:$g=1}

沙发的答案是好,但有个BUG,这个方法具有破坏性.....
Array.send(:define_method,:sort){self.dup.sort!}


我那个没破坏性啊~就因为这牺牲了一个 dup 的空间……我也想过直接调用 sort!,但觉得太对不起观众就没敢放上来 = =

点评

O_O 我没试出来,能否提供测试代码?  发表于 2011-3-19 15:32
我试了一下,你的那个真的有破坏性.....  发表于 2011-3-19 15:26
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

Lv3.寻梦者

孤独守望

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

开拓者贵宾

6
发表于 2011-3-19 19:56:28 | 只看该作者
我只是来吐槽这群触手排序的时候直接插排完全无视快排的本质= =b
菩提本非树,明镜本非台。回头自望路漫漫。不求姻缘,但求再见。
本来无一物,何处惹尘埃。风打浪吹雨不来。荒庭遍野,扶摇难接。
不知道多久更新一次的博客
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
953 小时
注册时间
2007-4-25
帖子
805
7
发表于 2011-3-20 02:40:28 | 只看该作者
IamI 发表于 2011-3-19 19:56
我只是来吐槽这群触手排序的时候直接插排完全无视快排的本质= =b

Golfer 不關心效率,只要 stroke 少就好啦 = ='' 我那個也不是插入排序,是最最最 naive 的 badsort
[email protected]:~> repeat 1 fortune
Matz is nice, so we are nice.
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-27 08:00

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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