Velocity Reviews > Ruby > Generate binary sequences of length n?

# Generate binary sequences of length n?

Tom Best
Guest
Posts: n/a

 08-09-2009
I'm rather new to Ruby. I feel this should be very simple, but I'm
having trouble:

I'd like to write a script to work through all possible binary sequences
of length n.

The script would work as follows:

mylength = 4
resultz = binary_seq_generator(mylength)
puts "#{resultz}"

#resultz, not necessarily in this order:
["0000","0001","0010","0011","0100","0101","0110"," 0111","1000","1001","1010","1011","1100","1101","1 110","1111"]

Important to my use: This binary_seq_generator method must be written
in such a way so that each subsequent member of the resultz array would
be completely generated before the next member starts. This is where
I'm stuck. I have trying manipulating the graycode algorithm here:
http://yagni.com/graycode/

This graycode algorithm seems to produce an array where each member is
only finalized on the final recurse. I may be wrong...but by this
method, I can't use resultz[i] for something before the algorithm starts
to build resultz[i+1], and I need to use each member of the resultz
array before moving on to the next binary string in the sequence.

Thanks much for helping a newbie!
--
Posted via http://www.ruby-forum.com/.

David A. Black
Guest
Posts: n/a

 08-09-2009
Hi --

On Mon, 10 Aug 2009, Tom Best wrote:

> I'm rather new to Ruby. I feel this should be very simple, but I'm
> having trouble:
>
> I'd like to write a script to work through all possible binary sequences
> of length n.
>
>
>
> The script would work as follows:
>
> mylength = 4
> resultz = binary_seq_generator(mylength)
> puts "#{resultz}"
>
> #resultz, not necessarily in this order:
> ["0000","0001","0010","0011","0100","0101","0110"," 0111","1000","1001","1010","1011","1100","1101","1 110","1111"]

Try this:

def binary_seq_generator(n)
(0...(1 << n)).map {|e| "%0#{n}d" % e.to_s(2) }
end

Doesn't necessarily roll off the fingers as readily as some Ruby
idioms do But I think all or most of what you need is there, and
there are some interesting bits to it.

David

--
David A. Black / Ruby Power and Light, LLC / http://www.rubypal.com
Q: What's the best way to get a really solid knowledge of Ruby?
A: Come to our Ruby training in Edison, New Jersey, September 14-17!
Instructors: David A. Black and Erik Kastner

Robert Dober
Guest
Posts: n/a

 08-09-2009
On Sun, Aug 9, 2009 at 8:32 PM, David A. Black<(E-Mail Removed)> wrote:
> Hi --
>
> On Mon, 10 Aug 2009, Tom Best wrote:
>
>> I'm rather new to Ruby. =C2=A0I feel this should be very simple, but I'm
>> having trouble:
>>
>> I'd like to write a script to work through all possible binary sequences
>> of length n.
>>
>>
>>
>> The script would work as follows:
>>
>> mylength =3D 4
>> resultz =3D binary_seq_generator(mylength)
>> puts "#{resultz}"
>>
>> #resultz, not necessarily in this order:
>>
>> ["0000","0001","0010","0011","0100","0101","0110"," 0111","1000","1001","=

1010","1011","1100","1101","1110","1111"]
>
> Try this:
>
> def binary_seq_generator(n)
> =C2=A0(0...(1 << n)).map {|e| "%0#{n}d" % e.to_s(2) }
> end
>
> Doesn't necessarily roll off the fingers as readily as some Ruby
> idioms do But I think all or most of what you need is there, and
> there are some interesting bits to it.

Well 1.9 has to offer some elegance here

(1<<n).times.map{ | d | "%0{n}b" % d }

HTH
Robert

--=20
module Kernel
alias_method :=CE=BB, :lambda
end

Tom B.
Guest
Posts: n/a

 08-09-2009
Robert Dober wrote:
> On Sun, Aug 9, 2009 at 8:32 PM, David A. Black<(E-Mail Removed)>
> wrote:
>>>

>>
>> Try this:
>>
>> def binary_seq_generator(n)
>> Â*(0...(1 << n)).map {|e| "%0#{n}d" % e.to_s(2) }
>> end
>>
>> Doesn't necessarily roll off the fingers as readily as some Ruby
>> idioms do But I think all or most of what you need is there, and
>> there are some interesting bits to it.

> Well 1.9 has to offer some elegance here
>
> (1<<n).times.map{ | d | "%0{n}b" % d }
>
> HTH
> Robert

They worked! Thank you both very much - having a comprehensive
understanding of these operators will move my coding to the next level!
Very much appreciated, Tom
--
Posted via http://www.ruby-forum.com/.

Robert Dober
Guest
Posts: n/a

 08-09-2009
>
> (1<<n).times.map{ | d | "%0{n}b" % d }

Oh I just forgot, maybe you need the "combinatoric" method

n.times.inject( [ "" ] ){ |s,| s.map{ |e| [ e + "0", e + "1" ] }.flatten }

Brian Candler
Guest
Posts: n/a

 08-10-2009
Robert Dober wrote:
> (1<<n).times.map{ | d | "%0{n}b" % d }

Perhaps safer to avoid the interpolation in the format string, using '*'
to give the number of digits.

>> "%0*b" % [8,123]

=> "01111011"
--
Posted via http://www.ruby-forum.com/.

Robert Dober
Guest
Posts: n/a

 08-10-2009
On Mon, Aug 10, 2009 at 10:43 AM, Brian Candler<(E-Mail Removed)> wrote:
> Robert Dober wrote:
>> (1<<n).times.map{ | d | "%0{n}b" % d }

>
> Perhaps safer to avoid the interpolation in the format string, using '*'
> to give the number of digits.
>
>>> "%0*b" % [8,123]

> =3D> "01111011"

Well safer, you mean regarding to my typo, well spotted .
This is a fascinating idiom I was not aware of. I too prefer it, thx
for sharing.

Cheers
Robert
> --
> Posted via http://www.ruby-forum.com/.
>
>

--=20
module Kernel
alias_method :=EB, :lambda
end

 Posting Rules You may not post new threads You may not post replies You may not post attachments You may not edit your posts BB code is On Smilies are On [IMG] code is On HTML code is OffTrackbacks are On Pingbacks are On Refbacks are Off Forum Rules

 Similar Threads Thread Thread Starter Forum Replies Last Post Rune Allnor C++ 66 11-09-2009 10:57 PM Anthra Norell Python 4 08-28-2006 07:06 AM Girish Sahani Python 17 06-09-2006 11:01 AM Nickolay Kolev Python 2 04-26-2004 05:21 PM Mitchua Perl 5 07-17-2003 12:08 AM