# Different Ways To Loop

**URL:** <https://www.ruby-forum.com/t/different-ways-to-loop/136592>\
**Category:** Ruby\
**Created:** [May 4, 2008, 4:10am UTC](https://www.ruby-forum.com/t/different-ways-to-loop/136592 "2008-05-04T04:10:28Z")\
**Posts on this page:** 18\
**Page:** 1

<div class="post-metadata">

**Author:** ![Wyatt\_G](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/53a042/32.png) [@Wyatt\_G](https://www.ruby-forum.com/u/Wyatt_G)\
**Post date:** [May 4, 2008, 4:10am UTC](https://www.ruby-forum.com/t/different-ways-to-loop/136592/1 "2008-05-04T04:10:28Z")

</div>

I love the flexibility of Ruby. It gives you several ways to do  
something, leaving you to pick the most appropriate one. In the  
spirit of showing off the flexibility of Ruby, I’d like to see how  
many different ways there are to write a loop that prints the numbers  
1 to 100, one on each line. I’ll start off:

1.upto(100) { |x| puts x }

I know there’s at least a dozen more ways to do this…

---

<div class="post-metadata">

**Author:** ![Wyatt\_G](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/53a042/32.png) [@Wyatt\_G](https://www.ruby-forum.com/u/Wyatt_G)\
**Post date:** [May 4, 2008, 4:20am UTC](https://www.ruby-forum.com/t/different-ways-to-loop/136592/2 "2008-05-04T04:20:24Z")

</div>

From: “Wyatt G.” [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

> 1.upto(100) { |x| puts x }

Ruby can even do the looping on our behalf. 🙂

puts (1…100).to\_a

Regards,

Bill

---

<div class="post-metadata">

**Author:** ![Wyatt\_G](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/53a042/32.png) [@Wyatt\_G](https://www.ruby-forum.com/u/Wyatt_G)\
**Post date:** [May 4, 2008, 4:24am UTC](https://www.ruby-forum.com/t/different-ways-to-loop/136592/3 "2008-05-04T04:24:22Z")

</div>

Wyatt G. wrote:

> I love the flexibility of Ruby. It gives you several ways to do  
> something, leaving you to pick the most appropriate one. In the  
> spirit of showing off the flexibility of Ruby, I’d like to see how  
> many different ways there are to write a loop that prints the numbers  
> 1 to 100, one on each line. I’ll start off:
> 
> 1.upto(100) { |x| puts x }
> 
> I know there’s at least a dozen more ways to do this…

100.times {|x| puts x + 1}  
(1…100).to\_a.each {|x| puts x}

---

<div class="post-metadata">

**Author:** ![Wyatt\_G](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/53a042/32.png) [@Wyatt\_G](https://www.ruby-forum.com/u/Wyatt_G)\
**Post date:** [May 4, 2008, 4:28am UTC](https://www.ruby-forum.com/t/different-ways-to-loop/136592/4 "2008-05-04T04:28:35Z")

</div>

Quoting Linux D. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> ## 100.times {|x| puts x + 1} (1…100).to\_a.each {|x| puts x}
> 
> Posted via [http://www.ruby-forum.com/](http://www.ruby-forum.com/).

You don’t even need the to\_a part

(1…100).each { |x| p x }

---

<div class="post-metadata">

**Author:** ![Wyatt\_G](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/53a042/32.png) [@Wyatt\_G](https://www.ruby-forum.com/u/Wyatt_G)\
**Post date:** [May 4, 2008, 4:30am UTC](https://www.ruby-forum.com/t/different-ways-to-loop/136592/5 "2008-05-04T04:30:55Z")

</div>

On May 3, 10:24 pm, Linux D. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> ## 100.times {|x| puts x + 1} (1…100).to\_a.each {|x| puts x}
> 
> Posted viahttp://www.ruby-forum.com/.

p \*1…100

---

<div class="post-metadata">

**Author:** ![Wyatt\_G](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/53a042/32.png) [@Wyatt\_G](https://www.ruby-forum.com/u/Wyatt_G)\
**Post date:** [May 4, 2008, 4:36am UTC](https://www.ruby-forum.com/t/different-ways-to-loop/136592/6 "2008-05-04T04:36:16Z")

</div>

On May 3, 10:27 pm, removed\_email\_address@domain.invalid wrote:

> (1…100).each { |x| p x }

count = 1; loop { puts count; count += 1; break if count \> 100; }

---

<div class="post-metadata">

**Author:** ![Wyatt\_G](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/53a042/32.png) [@Wyatt\_G](https://www.ruby-forum.com/u/Wyatt_G)\
**Post date:** [May 4, 2008, 5:07am UTC](https://www.ruby-forum.com/t/different-ways-to-loop/136592/7 "2008-05-04T05:07:49Z")

</div>

On May 3, 2008, at 8:10 PM, Wyatt G. wrote:

> 1.upto(100) { |x| puts x }

here are a few

# 1

puts Array.new(100){|i| i + 1}

# 2

i = 0 and loop do  
puts i+=1  
break if i \>= 100  
end

# 3

puts \<\<-chars.strip.split(%r//).map{|c| c[0]}  
\001\002\003\004\005\006\a\b\t\n\v\f\r  
\016\017\020\021\022\023\024\025\026\027\030\031\032\e\034\035\036\037!  
"#$%&'()\*+,-./0123456789:;\<=\>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^\_`abcd  
chars

# 4

100.times{|i| puts i + 1}

a @ [http://codeforpeople.com/](http://codeforpeople.com/)

---

<div class="post-metadata">

**Author:** ![Wyatt\_G](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/53a042/32.png) [@Wyatt\_G](https://www.ruby-forum.com/u/Wyatt_G)\
**Post date:** [May 4, 2008, 5:49am UTC](https://www.ruby-forum.com/t/different-ways-to-loop/136592/8 "2008-05-04T05:49:18Z")

</div>

Don’t forget the “traditional” style loop:

for x in 1…100 do  
puts x+1  
end

---

<div class="post-metadata">

**Author:** ![Wyatt\_G](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/53a042/32.png) [@Wyatt\_G](https://www.ruby-forum.com/u/Wyatt_G)\
**Post date:** [May 4, 2008, 7:55am UTC](https://www.ruby-forum.com/t/different-ways-to-loop/136592/9 "2008-05-04T07:55:37Z")

</div>

of course there’s…

i=0 and while(i\<100) do  
puts i+=1  
end

i=0 and until(i==100) do  
puts i+=1  
end

On Sat, May 3, 2008 at 11:48 PM, Dan Z. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > On May 3, 2008, at 8:10 PM, Wyatt G. wrote:
> > 
> > # 2

–  
Aloha!

Mike McKinney  
removed\_email\_address@domain.invalid  
([http://blog.huikau.com](http://blog.huikau.com))

---

<div class="post-metadata">

**Author:** ![Wyatt\_G](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/53a042/32.png) [@Wyatt\_G](https://www.ruby-forum.com/u/Wyatt_G)\
**Post date:** [May 4, 2008, 3:16pm UTC](https://www.ruby-forum.com/t/different-ways-to-loop/136592/10 "2008-05-04T15:16:24Z")

</div>

On Sun, May 4, 2008 at 8:55 AM, Wyatt G. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> > puts i+=1
> 
> def count  
> Based on a response from Eric when I first asked for alternative ways to  
> do this:

MAX = 100  
def print\_from\_to(start, stop)  
start.upto(stop) do |number|  
puts number  
end  
end  
loop do  
number = 1  
print\_from\_to(number, MAX)  
break  
end

---

<div class="post-metadata">

**Author:** ![Wyatt\_G](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/53a042/32.png) [@Wyatt\_G](https://www.ruby-forum.com/u/Wyatt_G)\
**Post date:** [May 4, 2008, 2:55pm UTC](https://www.ruby-forum.com/t/different-ways-to-loop/136592/11 "2008-05-04T14:55:45Z")

</div>

On May 4, 1:54 am, Mike McKinney [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> end
> 
> > ara.t.howard wrote:
> > 
> > > # 2
> 
> Aloha!
> 
> Mike McKinney  
> removed\_email\_address@domain.invalid  
> ([http://blog.huikau.com](http://blog.huikau.com))

And here’s an “object-oriented” way:

class Counter  
def count  
@count ||= 1  
puts @count  
@count += 1  
@count \> 100  
end  
end

counter = Counter.new  
until counter.count; end

---

<div class="post-metadata">

**Author:** ![Wyatt\_G](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/53a042/32.png) [@Wyatt\_G](https://www.ruby-forum.com/u/Wyatt_G)\
**Post date:** [May 4, 2008, 3:35pm UTC](https://www.ruby-forum.com/t/different-ways-to-loop/136592/12 "2008-05-04T15:35:08Z")

</div>

Hi –

On Sun, 4 May 2008, Ashley W. wrote:

> > > > puts x+1
> > > > 
> > > > > # 1
> > > > > 
> > > > > better. simply reflect on that.
> > 
> > until counter.count; end  
> > loop do  
> > number = 1  
> > print\_from\_to(number, MAX)  
> > break  
> > end

I can think of lots of ways:

puts \*1…100  
puts \*1…101-1  
puts \*1…102-2 …

or

“This evaluates to true” and loop do …

“So does this” and loop do …

🙂

I don’t mean to scoff at the “more than one way” thing, but it does  
in a sense contain the seeds of its own destruction 🙂

David

---

<div class="post-metadata">

**Author:** ![Wyatt\_G](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/53a042/32.png) [@Wyatt\_G](https://www.ruby-forum.com/u/Wyatt_G)\
**Post date:** [May 4, 2008, 10:31pm UTC](https://www.ruby-forum.com/t/different-ways-to-loop/136592/13 "2008-05-04T22:31:28Z")

</div>

On May 4, 3:22 pm, Ken B. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> ([nil]\*100).each\_with\_index{|_,i| puts i+1}  
> Array.new(100).each\_with\_index{|_,i| puts i+1}
> 
> –  
> Ken (Chanoch) Bloom. PhD candidate. Linguistic Cognition Laboratory.  
> Department of Computer Science. Illinois Institute of Technology.[http://www.iit.edu/~kbloom1/](http://www.iit.edu/~kbloom1/)

Nice ones, Ken! 🙂

Here’s another one, lifted from page 128 of “The Ruby P.ming  
Language”:

x = 10  
puts x = x + 1 while x \< 100

---

<div class="post-metadata">

**Author:** ![Wyatt\_G](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/53a042/32.png) [@Wyatt\_G](https://www.ruby-forum.com/u/Wyatt_G)\
**Post date:** [May 5, 2008, 10:49am UTC](https://www.ruby-forum.com/t/different-ways-to-loop/136592/14 "2008-05-05T10:49:42Z")

</div>

2008/5/4 Wyatt G. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid):

> I love the flexibility of Ruby. It gives you several ways to do  
> something, leaving you to pick the most appropriate one. In the  
> spirit of showing off the flexibility of Ruby, I’d like to see how  
> many different ways there are to write a loop that prints the numbers  
> 1 to 100, one on each line. I’ll start off:
> 
> 1.upto(100) { |x| puts x }
> 
> I know there’s at least a dozen more ways to do this…

I haven’t seen ‘retry’ so far:

10:48:13 RTEConnector$ ruby -e ‘i=0;begin;puts i;raise  
“X”;rescue;i+=1;retry if i\<=10;end’  
0  
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
10:48:25 RTEConnector$

Cheers

robert

---

<div class="post-metadata">

**Author:** ![Wyatt\_G](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/53a042/32.png) [@Wyatt\_G](https://www.ruby-forum.com/u/Wyatt_G)\
**Post date:** [May 4, 2008, 9:40pm UTC](https://www.ruby-forum.com/t/different-ways-to-loop/136592/15 "2008-05-04T21:40:58Z")

</div>

On Sat, 03 May 2008 19:07:12 -0700, Wyatt G. wrote:

> I love the flexibility of Ruby. It gives you several ways to do  
> something, leaving you to pick the most appropriate one. In the spirit  
> of showing off the flexibility of Ruby, I’d like to see how many  
> different ways there are to write a loop that prints the numbers 1 to  
> 100, one on each line. I’ll start off:
> 
> 1.upto(100) { |x| puts x }
> 
> I know there’s at least a dozen more ways to do this…

([nil]\*100).each\_with\_index{|_,i| puts i+1}  
Array.new(100).each\_with\_index{|_,i| puts i+1}

---

<div class="post-metadata">

**Author:** ![Wyatt\_G](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/53a042/32.png) [@Wyatt\_G](https://www.ruby-forum.com/u/Wyatt_G)\
**Post date:** [May 5, 2008, 11:30am UTC](https://www.ruby-forum.com/t/different-ways-to-loop/136592/16 "2008-05-05T11:30:41Z")

</div>

Hmm, the example with p \*1…100 surprised me, I knew the \* but I somehow  
havent seen this used in such a short way 🙂

I guess fun examples would be that noone notices that a loop is a  
work… isn’t there an obfuscated way with Array(pack/unpack)?

---

<div class="post-metadata">

**Author:** ![Wyatt\_G](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/53a042/32.png) [@Wyatt\_G](https://www.ruby-forum.com/u/Wyatt_G)\
**Post date:** [May 5, 2008, 2:39pm UTC](https://www.ruby-forum.com/t/different-ways-to-loop/136592/17 "2008-05-05T14:39:54Z")

</div>

Hi –

On Mon, 5 May 2008, Marc H. wrote:

> Hmm, the example with p \*1…100 surprised me, I knew the \* but I somehow  
> havent seen this used in such a short way 🙂
> 
> I guess fun examples would be that noone notices that a loop is a  
> work… isn’t there an obfuscated way with Array(pack/unpack)?

I think there are infinite obfuscated ways. It depends what you  
consider a “way” to print the integers 1 to 100. You can surround it  
with unintelligible garbage, encrypt it and then unencrypt and eval  
it, and so forth.

It’s an interesting question: what’s the horizon of a “way” to do  
something, using “way” as in “Ruby gives you different ways to do  
xyz”? I don’t believe that the relation between, say, p \*1…100 and  
puts [1,2,3,…,100] is the same as the relation between either of  
those ways of printing integers and

puts [_eval(“1” + (("$%#$&_."[-1,1]) \* 2) +  
((212-32)_5/9).to\_s)].pack(%{#{"".class.class.name[0].chr}_}).unpack("#{‘B’.succ}\*")

or whatever. That prints the numbers but I don’t think it can usefully  
be described as a “way” to print an array of integers.

David

---

<div class="post-metadata">

**Author:** ![Wyatt\_G](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/w/53a042/32.png) [@Wyatt\_G](https://www.ruby-forum.com/u/Wyatt_G)\
**Post date:** [May 6, 2008, 3:01pm UTC](https://www.ruby-forum.com/t/different-ways-to-loop/136592/18 "2008-05-06T15:01:36Z")

</div>

> Different Ways To Loop
> 
> Posted by Wyatt G. (Guest) on 04.05.2008 04:10
> 
> I love the flexibility of Ruby. It gives you several ways to do  
> something, leaving you to pick the most appropriate one. In the  
> spirit of showing off the flexibility of Ruby, I’d like to see how  
> many different ways there are to write a loop that prints the numbers  
> 1 to 100, one on each line. …

Just for the sake of completeness!

puts Array(1…100)

Cheers,

j.k.
