Хорошо, я укушу:
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
Смотрите на repl.it: https://repl.it/@jrunning/TrainedDangerousSlope
Обновление
Первоначально я использовал регулярное выражение /(\S)(\S+)(\S)/
, которое считало «словом» любую последовательность из трех или более непробельных символов. Это, к сожалению, считается пунктуацией как символами слова, например, «Hello, world.
» может стать «Hlloe, wlodr.
» - ,
и .
были посчитаны как последние «буквы» слов, а фактические последние буквы были перемещены.
Я обновил его, чтобы использовать регулярное выражение /([\p{L}'])([\p{L}']{2,})([\p{L}'])/
. Класс символов \p{L}
соответствует Unicode-категории "Буквы", поэтому он работает с основными диакритическими знаками, и я добавил '
, чтобы соответствовать реализации 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.
Обновление 2
Если мы хотим добавить требование, чтобы буквенный порядок ни одного слова не совпадал с выводом на входе, мы можем изменить переданный процесс до gsub
, чтобы он вызывался сам до тех пор, пока порядок не изменится:
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
Мы все еще можем сделать его однострочным, но его читаемость быстро ухудшается:
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
Смотрите на repl.it: https://repl.it/@jrunning/TrainedDangerousSlope-2