如何将字符串中每个单词的中间字母混洗?

Ami*_*ani 6 ruby string

试图重新创造"只有聪明的人才能读到这个"的模因.这是一个示例:

Hrad to blveiee taht youlu cluod aulaclty uesdnatnrd waht yor'ue rdanieg.在hmuan bairn的phaonmneal pweor,aoccdrnig在Cmabrigde Uinervtisy一个rscheearch,sowhs taht它deosn't mttaer在啥子oredr在wrod的ltteers是,在olny iprmoatnt tihng是taht弗里斯特和LSAT ltteer是在rghit pclae.

rset可以是一个taotl mses,你可以坐下来讨论它的问题.

Tihs是bcuseae huamn biarn deos不是由istlef竞选ervey lteter,而是作为一个wlohe ptatren.Amzanig吧?Yaeh,你呀tghuhot slpeling是ipmorantt!

如何创建一个Ruby方法,在我传递的句子中,为每个大于3个字母的单词混淆中间单词.

澄清:我已经发布了这个问题并同时回答了这两个问题.问题中没有代码,因为我在答案中发布了它.

Jor*_*ing 7

好的,我会咬人:

def srlabmce(str)
  str.gsub(/([\p{L}'])([\p{L}']{2,})([\p{L}'])/) { "#$1#{$2.chars.shuffle.join}#$3" }
end

puts srlabmce("Hard to believe that you could actually understand what you're reading")
# => Hrad to beviele taht you cuold atlculay unantdresd what yoru'e raeindg
Run Code Online (Sandbox Code Playgroud)

请在repl.it上查看:https://repl.it/@jrunning/TrainedDangerousSlope

更新

我最初使用Regexp /(\S)(\S+)(\S)/,它将三个或更多非空白字符的任何序列视为"单词".遗憾的是,它将标点符号视为单词字符,因此例如" Hello, world."可能变为" Hlloe, wlodr." - ,并且.被计为单词的最后"字母",并且实际的最后字母被移动.

我已经更新它以使用Regexp /([\p{L}'])([\p{L}']{2,})([\p{L}'])/.字符类\p{L}对应于Unicode类别"Letters",因此它与基本的变音符号一起使用,我投入'以匹配amingilani的实现.

puts srlabmce("Quem ïd feugiat iaculisé éu mié tùrpus ïn interdùm grâvida, malesuada vivamus nam nullä urna justo conubia torétoré lorem.")
# => Qeum ïd fgieuat iliacusé éu mié tpùurs ïn iedùtnrm girâdva, madueasla vimavus nam nullä unra jutso cnboiua ttoréroé lerom.
Run Code Online (Sandbox Code Playgroud)

更新2

如果我们想要添加输出中输出中没有单词的字母顺序可能相同的要求,我们可以修改传递给gsub它的proc以再次调用自身,直到顺序发生变化:

def srlabmce(str)
  replacer = ->*{
    if $2.chars.uniq.size < 2 then $&
    else
      o = $2.chars.shuffle.join
      o == $2 ? replacer[] : "#$1#{o}#$3"
    end
  }
  str.gsub(/([\p{L}'])([\p{L}']{2,})([\p{L}'])/, &replacer)
end
Run Code Online (Sandbox Code Playgroud)

我们仍然可以将它作为单行,但它的可读性很快就会恶化:

def srlabmce(str)
  str.gsub(/([\p{L}'])([\p{L}']{2,})([\p{L}'])/, &(r = ->*{ $2.chars.uniq.size < 2 ? $& : (o = $2.chars.shuffle.join) == $& ? r[] : "#$1#{o}#$3" }))
end
Run Code Online (Sandbox Code Playgroud)

看到它在repl.it:https://repl.it/@jrunning/TrainedDangerousSlope-2

  • @amingilani真的吗?也许剑桥应该提到上下文对于阅读一个单词"srlabmce"[d]很重要? (4认同)
  • `srlabmce"feet"#=> SystemStackError:堆栈级别太深了. (4认同)
  • 它花了我更长的时间来承认找出'争夺' (3认同)

Ami*_*ani 6

编辑:此代码现在保证单词不会被意外地加扰到原始文本.例如,read现在将永远被扰乱raed.

编辑2:如果单词不能被加扰,它将返回原始单词,例如jumble 'feet' # => 'feet'

jumble单个单词创建一个方法,并通过mess_up句子中的每个单词调用它

def mess_up(sentence)
  sentence = sentence.downcase.split(' ').map { |e| jumble(e) }.join(' ')
  sentence[0] = sentence[0].upcase
  sentence
end

def jumble(word)
  return word if word.size <= 3
  str = word.split('')
  f = str.shift
  l = str.pop
  return word if str.uniq.size == 1
  str = [f, str.shuffle, l].join('')
  return jumble(str) if word == str
  str
end

mess_up "Hard to believe that you could actually understand what you're reading"
# => "Hrad to bleevie taht you cuold aactlluy unrdnestad waht y'ruoe rendaig"
Run Code Online (Sandbox Code Playgroud)

动机

当我看到帖子时,我做了一个有趣的实验.是要在Gist中推动它,但意识到有人可能会在某个时候搜索它,所以SO是最好的地方.

  • `jumble"feet"#=> SystemStackError:堆栈级别太深了. (2认同)