Ruby 老赵同学的一道编程题

fsword · 2012年11月06日 · 最后由 zw963 回复于 2012年11月11日 · 3948 次阅读

老赵发的原题在这里: http://blog.zhaojie.me/2012/11/how-to-generate-typoglycemia-text.html

@hooopo 的答案是这个——

doc.gsub(/([\w']+)/){|world| world.sub(/(\w)(\w*)(\w)/){$1 + $2.reverse + $3}}

不过感觉这段代码不太符合要求,只是简单的 reverse,没有引入随机性(虽然题目不要求绝对随机,但是这个也太简陋了吧),大家有没有改进版?

我也抛个砖

doc.gsub(/([\w']+)/){|world| world.sub(/(\w)(\w*)(\w)/){$1 + $2.chars.to_a.sample($2.size).join + $3}}

易读版

doc.gsub(/([\w']+)/) {|word| word.size > 2 ? word[0] + word[1..-2].split('').shuffle.join + word[-1] : word}

#2 楼 @knwang 可以简化的

doc.gsub(/([\w']+)/) {|word| word[0] + word[1..-2].split('').shuffle.join + word[-1]}

补充:发现不行,对于一个字母的单词会出错

#3 楼 @fsword 这样对一个字母的不行

#5 楼 @fsword notification 很好用。。

#6 楼 @knwang 不错,论坛有点 im 的意思

#7 楼 @fsword 你早上吃得什么啊?

#8 楼 @knwang 包子,真变 im 了...... 这个题目好像很难再简化了

doc.gsub(/(?<=\b\w)\w{2,}(?=\w\b)/) {|s| s.chars.to_a.shuffle.join }

p.s. 需要 Ruby 2.0 Onigmo

老赵的名声确实大啊,这里也有他的踪迹。

#10 楼 @luikore Ruby2.0?1.9 和 1.8 上都报错........

#12 楼 @hooopo 是的... 1.9 上面 look ahead 还是有点限制

看了他博客上其他几个答案,真心觉得 Ruby 废话少,懂程序员心思!

#13 楼 @luikore 刚才用 Heroku 上的 Ruby2.0 跑了一下。。结果上面的应用运行不起来了~ http://blog.heroku.com/archives/2012/11/5/ruby-2-preview-on-heroku/

#10 楼 @luikore ruby 2.0 验证通过,吕戈同学总是能超出期望啊 #11 楼 @woaigithub 老赵不在这里吧,你也可以说是我见识广......

@hooopo @fsword 其实 1.9 区别也不大..

doc.gsub(/(\b\w)(\w{2,})(\w\b)/) { $1 + $2.chars.to_a.shuffle.join + $3 }

gsub 里可以用 $1, $2, ...

#17 楼 @luikore

之前有段时间我并不知道 $1, $2... 这种用法,后来在 Emacs 中,有一个 replace-regexp-in-string 函数,可以实现将一个字符串的匹配部分替换为另一个子串,觉得很有用,然后查询 ruby API, 才发现这个用法的。果然 Ruby 还是比 Lisp 强大多了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号