Search code examples
rubyalgorithmparagraphs

Change every word in a paragraph with Ruby


So I'm coding in Ruby and I've got a few sentences:

The sky above the port was the color of television, tuned to a dead channel. "It's not like I'm using," Case heard someone say, as he shouldered his way through the crowd around the door of the Chat. "It's like my body's developed this massive drug deficiency." It was a Sprawl voice and a Sprawl joke. The Chatsubo was a bar for professional expatriates; you could drink there for a week and never hear two words in Japanese.

And I need to modify every word in the paragraph without changing the structure. My original idea was to just split on whitespace and then rejoin it, but the issue with that is you get the punctuation as well. If you split so that you just get the word, it's hard to rejoin because you don't know the proper punctuation.

Are there better ways to do this than the traditional split, map, join combo? Or maybe just a good split regex so it's easy to rejoin?


Solution

  • Use gsub with a block:

    str = %q(The sky above the port was the color of television, tuned to a dead channel.
    "It's not like I'm using," Case heard someone say, as he shouldered his way through the crowd
    around the door of the Chat. "It's like my body's developed this massive drug deficiency."
    It was a Sprawl voice and a Sprawl joke. The Chatsubo was a bar for professional expatriates;
    you could drink there for a week and never hear two words in Japanese.)
    
    puts str.gsub(/\w+/){|word| word.tr('aeiou','uoaei') }
    

    result:

    Tho sky ubevo tho pert wus tho celer ef tolovasaen, tinod te u doud chunnol.
    "It's net lako I'm isang," Cuso hourd semoeno suy, us ho sheildorod has wuy threigh tho crewd
    ureind tho deer ef tho Chut. "It's lako my bedy's dovolepod thas mussavo drig dofacaoncy."
    It wus u Spruwl veaco und u Spruwl jeko. Tho Chutsibe wus u bur fer prefossaenul oxputrautos;
    yei ceild drank thoro fer u wook und novor hour twe werds an Jupunoso.
    

    Well, this #tr method would work without the regex, but you get the idea.