How to repeat string patterns in Ruby?

I have some funky Python code that I'm trying to modify but it's
formatted with spaces instead of tabs, making it impossible to change. Now,
there may be many different ways to solve this problem but the first impulse
I had was to write a small Ruby script to reformat the code.
    Now, a certain pattern came up in my solution that I have seen before.
I wanted to do something like this:

num_tabs = num_spaces / tab_width
tabs = num_tabs.collect { "\t" }.join

    ...but I discovered that there is not collect method in the integer
object. The best I could come up with was:

tabs = ''
num_tabs.times { tabs << "\t" }

    Is there a more succinct, more Ruby-esque way to do this?
    Thank you...

"\t" * num_tabs

-Mark

···

On Jun 18, 2007, at 5:55 PM, Just Another Victim of the Ambient Morality wrote:

tabs = ''
num_tabs.times { tabs << "\t" }

   Is there a more succinct, more Ruby-esque way to do this?

Just Another Victim of the Ambient Morality wrote:

    I have some funky Python code that I'm trying to modify but it's formatted with spaces instead of tabs, making it impossible to change. Now, there may be many different ways to solve this problem but the first impulse I had was to write a small Ruby script to reformat the code.
    Now, a certain pattern came up in my solution that I have seen before. I wanted to do something like this:

num_tabs = num_spaces / tab_width
tabs = num_tabs.collect { "\t" }.join

    ...but I discovered that there is not collect method in the integer object. The best I could come up with was:

tabs = ''
num_tabs.times { tabs << "\t" }

    Is there a more succinct, more Ruby-esque way to do this?
    Thank you...

Couldn't you just use something like b = a.gsub(" ", "\t") where the number of spaces is your tab size? This would avoid having count the spaces.

irb(main):001:0> puts Array.new(5, "a").join
aaaaa
=> nil
irb(main):002:0>

···

-----Original Message-----
From: Just Another Victim of the Ambient Morality
[mailto:i_hate_spam@hotmail.com]
Sent: Monday, June 18, 2007 5:55 PM
To: ruby-talk ML
Subject: How to repeat string patterns in Ruby?

    I have some funky Python code that I'm trying to modify
but it's formatted with spaces instead of tabs, making it
impossible to change. Now, there may be many different ways
to solve this problem but the first impulse I had was to
write a small Ruby script to reformat the code.
    Now, a certain pattern came up in my solution that I have
seen before.
I wanted to do something like this:

num_tabs = num_spaces / tab_width
tabs = num_tabs.collect { "\t" }.join

    ...but I discovered that there is not collect method in
the integer object. The best I could come up with was:

tabs = ''
num_tabs.times { tabs << "\t" }

    Is there a more succinct, more Ruby-esque way to do this?
    Thank you...

$ expand --help
Usage: expand [OPTION]... [FILE]...
Convert tabs in each FILE to spaces, writing to standard output.
With no FILE, or when FILE is -, read standard input.

Mandatory arguments to long options are mandatory for short options too.
   -i, --initial do not convert tabs after non blanks
   -t, --tabs=NUMBER have tabs NUMBER characters apart, not 8
   -t, --tabs=LIST use comma separated list of explicit tab positions
       --help display this help and exit
       --version output version information and exit

Report bugs to <bug-coreutils@gnu.org>.

:slight_smile:

  robert

···

On 19.06.2007 02:53, Just Another Victim of the Ambient Morality wrote:

    I have some funky Python code that I'm trying to modify but it's formatted with spaces instead of tabs, making it impossible to change. Now, there may be many different ways to solve this problem but the first impulse I had was to write a small Ruby script to reformat the code.
    Now, a certain pattern came up in my solution that I have seen before. I wanted to do something like this:

num_tabs = num_spaces / tab_width
tabs = num_tabs.collect { "\t" }.join

    ...but I discovered that there is not collect method in the integer object. The best I could come up with was:

tabs = ''
num_tabs.times { tabs << "\t" }

    Is there a more succinct, more Ruby-esque way to do this?
    Thank you...

"Mark Day" <mday@mac.com> wrote in message
news:62A0BA82-71DA-46D2-979C-A40B58B5A4CD@mac.com...

···

On Jun 18, 2007, at 5:55 PM, Just Another Victim of the Ambient Morality > wrote:

tabs = ''
num_tabs.times { tabs << "\t" }

   Is there a more succinct, more Ruby-esque way to do this?

"\t" * num_tabs

    Thank you, this is exactly what I am looking for!

"Michael W. Ryder" <_mwryder@worldnet.att.net> wrote in message
news:NXFdi.99294$Sa4.77366@bgtnsc05-news.ops.worldnet.att.net...

Just Another Victim of the Ambient Morality wrote:

    I have some funky Python code that I'm trying to modify but it's
formatted with spaces instead of tabs, making it impossible to change.
Now, there may be many different ways to solve this problem but the first
impulse I had was to write a small Ruby script to reformat the code.
    Now, a certain pattern came up in my solution that I have seen
before. I wanted to do something like this:

num_tabs = num_spaces / tab_width
tabs = num_tabs.collect { "\t" }.join

    ...but I discovered that there is not collect method in the integer
object. The best I could come up with was:

tabs = ''
num_tabs.times { tabs << "\t" }

    Is there a more succinct, more Ruby-esque way to do this?
    Thank you...

Couldn't you just use something like b = a.gsub(" ", "\t") where the
number of spaces is your tab size? This would avoid having count the
spaces.

    This is a good idea. Unfortunately for me, the actual code is more
complicated than what I posted. I simplified it to emphasize the particular
problem I wanted to solve.
    The real program deals with issues where, say, one line has four spaces
while the next line has seven instead of a reasonable eight...

Maybe this one would be better:

unexpand --help
Usage: unexpand [OPTION]... [FILE]...
Convert blanks in each FILE to tabs, writing to standard output.
With no FILE, or when FILE is -, read standard input.

Mandatory arguments to long options are mandatory for short options too.
  -a, --all convert all blanks, instead of just initial blanks
      --first-only convert only leading sequences of blanks (overrides -a)
  -t, --tabs=N have tabs N characters apart instead of 8 (enables -a)
  -t, --tabs=LIST use comma separated LIST of tab positions (enables -a)
      --help display this help and exit
      --version output version information and exit

Report bugs to <bug-coreutils@gnu.org>.

:slight_smile:

···

On 6/19/07, Robert Klemme <shortcutter@googlemail.com> wrote:

On 19.06.2007 02:53, Just Another Victim of the Ambient Morality wrote:
> I have some funky Python code that I'm trying to modify but it's
> formatted with spaces instead of tabs, making it impossible to change. Now,
> there may be many different ways to solve this problem but the first impulse
> I had was to write a small Ruby script to reformat the code.
> Now, a certain pattern came up in my solution that I have seen before.
> I wanted to do something like this:
>
> num_tabs = num_spaces / tab_width
> tabs = num_tabs.collect { "\t" }.join
>
> ...but I discovered that there is not collect method in the integer
> object. The best I could come up with was:
>
> tabs = ''
> num_tabs.times { tabs << "\t" }
>
> Is there a more succinct, more Ruby-esque way to do this?
> Thank you...

$ expand --help
Usage: expand [OPTION]... [FILE]...
Convert tabs in each FILE to spaces, writing to standard output.
With no FILE, or when FILE is -, read standard input.

Mandatory arguments to long options are mandatory for short options too.
   -i, --initial do not convert tabs after non blanks
   -t, --tabs=NUMBER have tabs NUMBER characters apart, not 8
   -t, --tabs=LIST use comma separated list of explicit tab positions
       --help display this help and exit
       --version output version information and exit

Report bugs to <bug-coreutils@gnu.org>.

:slight_smile:

"Jano Svitok" <jan.svitok@gmail.com> wrote in message
news:8d9b3d920706201328s697fbbaoe1c5e52cab21b9b1@mail.gmail.com...

···

On 6/19/07, Robert Klemme <shortcutter@googlemail.com> wrote:

On 19.06.2007 02:53, Just Another Victim of the Ambient Morality wrote:
> I have some funky Python code that I'm trying to modify but it's
> formatted with spaces instead of tabs, making it impossible to change.
> Now,
> there may be many different ways to solve this problem but the first
> impulse
> I had was to write a small Ruby script to reformat the code.
> Now, a certain pattern came up in my solution that I have seen
> before.
> I wanted to do something like this:
>
> num_tabs = num_spaces / tab_width
> tabs = num_tabs.collect { "\t" }.join
>
> ...but I discovered that there is not collect method in the integer
> object. The best I could come up with was:
>
> tabs = ''
> num_tabs.times { tabs << "\t" }
>
> Is there a more succinct, more Ruby-esque way to do this?
> Thank you...

$ expand --help
Usage: expand [OPTION]... [FILE]...
Convert tabs in each FILE to spaces, writing to standard output.
With no FILE, or when FILE is -, read standard input.

Mandatory arguments to long options are mandatory for short options too.
   -i, --initial do not convert tabs after non blanks
   -t, --tabs=NUMBER have tabs NUMBER characters apart, not 8
   -t, --tabs=LIST use comma separated list of explicit tab positions
       --help display this help and exit
       --version output version information and exit

Report bugs to <bug-coreutils@gnu.org>.

:slight_smile:

Maybe this one would be better:

unexpand --help
Usage: unexpand [OPTION]... [FILE]...
Convert blanks in each FILE to tabs, writing to standard output.
With no FILE, or when FILE is -, read standard input.

Mandatory arguments to long options are mandatory for short options too.
-a, --all convert all blanks, instead of just initial blanks
     --first-only convert only leading sequences of blanks (overrides -a)
-t, --tabs=N have tabs N characters apart instead of 8 (enables -a)
-t, --tabs=LIST use comma separated LIST of tab positions (enables -a)
     --help display this help and exit
     --version output version information and exit

Report bugs to <bug-coreutils@gnu.org>.

:slight_smile:

    All useful information, thank you...