老赵发的原题在这里: 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}
doc.gsub(/([\w']+)/) {|word| word[0] + word[1..-2].split('').shuffle.join + word[-1]}
补充:发现不行,对于一个字母的单词会出错
doc.gsub(/(?<=\b\w)\w{2,}(?=\w\b)/) {|s| s.chars.to_a.shuffle.join }
p.s. 需要 Ruby 2.0 Onigmo
#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 老赵不在这里吧,你也可以说是我见识广......
之前有段时间我并不知道 $1, $2... 这种用法,后来在 Emacs 中,有一个 replace-regexp-in-string
函数,可以实现将一个字符串的匹配部分替换为另一个子串,觉得很有用,然后查询 ruby API, 才发现这个用法的。果然 Ruby 还是比 Lisp 强大多了。