# Elementary Array Question

**URL:** <https://www.ruby-forum.com/t/elementary-array-question/158491>\
**Category:** Rails\
**Created:** [January 23, 2009, 9:35pm UTC](https://www.ruby-forum.com/t/elementary-array-question/158491 "2009-01-23T21:35:24Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![jordantheous](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/a88e57/32.png) [@jordantheous](https://www.ruby-forum.com/u/jordantheous)\
**Post date:** [January 23, 2009, 9:35pm UTC](https://www.ruby-forum.com/t/elementary-array-question/158491/1 "2009-01-23T21:35:24Z")

</div>

\*From Chris P., Learn to Program

Hey All –  
In the below source code they array is called in the method as x, y,  
but the “if” statements are looking to [y][x]. Can anyone explain to  
me why they are switched? If you make them [x][y] it still outputs  
the correct number (23).  
Thanks in advance,  
Jordan

## Start of Example

# These are just to make the map

# easier for me to read. “M” is

# visually more dense than “o”.

M = ’ land ’  
o = ’ water ’  
world = [[o,o,o,o,o,o,o,o,o,o,o],  
[o,o,o,o,M,M,o,o,o,o,o],  
[o,o,o,o,o,o,o,o,M,M,M],  
[o,o,o,M,o,o,o,o,o,M,o],  
[o,o,o,M,o,M,M,o,o,o,o],  
[o,o,o,o,M,M,M,M,o,o,o],  
[o,o,o,M,M,M,M,M,M,M,o],  
[o,o,o,M,M,o,M,M,M,o,o],  
[o,o,o,o,o,o,M,M,o,o,o],  
[M,M,o,o,o,M,o,o,o,o,o],  
[o,o,o,o,o,o,o,o,o,o,o]]

def continent\_size world, x, y  
if x \> 10 && y \> 10  
size = 0  
else  
if world[x][y] != ’ land ’  
return 0  
end  
end

# Either it ’ s water or we already

# counted it, but either way, we don ’ t

# want to count it now.

# So first we count this tile…

size = 1  
world[x][y] = ’ counted land ’

# …then we count all of the

# neighboring eight tiles (and,

# of course, their neighbors by

# way of the recursion).

size = size + continent\_size(world, x-1, y-1)  
size = size + continent\_size(world, x , y-1)  
size = size + continent\_size(world, x+1, y-1)  
size = size + continent\_size(world, x-1, y )  
size = size + continent\_size(world, x+1, y )  
size = size + continent\_size(world, x-1, y+1)  
size = size + continent\_size(world, x , y+1)  
size = size + continent\_size(world, x+1, y+1)  
size  
end

puts continent\_size(world, 5, 5)

---

<div class="post-metadata">

**Author:** ![jordantheous](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/a88e57/32.png) [@jordantheous](https://www.ruby-forum.com/u/jordantheous)\
**Post date:** [January 23, 2009, 10:37pm UTC](https://www.ruby-forum.com/t/elementary-array-question/158491/2 "2009-01-23T22:37:46Z")

</div>

WORLD\_VALUES = {:o =\> :water, :X =\> :land}

WORLD = [[:o,:o,:o,:o,:o,:o,:o,:o,:o,:o],  
[:o,:o,:o,:o,:X,:X,:o,:o,:o,:o],  
[:o,:o,:o,:o,:o,:o,:o,:o,:X,:X],  
[:o,:o,:o,:X,:o,:o,:o,:o,:o,:X],  
[:o,:o,:o,:X,:o,:X,:X,:o,:o,:o],  
[:o,:o,:o,:o,:X,:X,:X,:X,:o,:o],  
[:o,:o,:o,:X,:X,:X,:X,:X,:X,:X],  
[:o,:o,:o,:X,:X,:o,:X,:X,:X,:o],  
[:o,:o,:o,:o,:o,:o,:X,:X,:o,:o],  
[:X,:X,:o,:o,:o,:X,:o,:o,:o,:o],  
[:o,:o,:o,:o,:o,:o,:o,:o,:o,:o]]

def continent\_size(x, y)  
size = 0

```
begin
    WORLD.first(x).each do |row|
        row.first(y).each do |col|
            size += 1 if WORLD_VALUES[col] == :land
        end
    end
rescue
    return "invalid continent size"
end

return size

```

end

continent\_size 10, 10 #should be 30

HTH,  
Aldo S.

jordantheous wrote:

> \*From Chris P., Learn to Program
> 
> Hey All –  
> In the below source code they array is called in the method as x, y,  
> but the “if” statements are looking to [y][x]. Can anyone explain to  
> me why they are switched? If you make them [x][y] it still outputs  
> the correct number (23).  
> Thanks in advance,  
> Jordan
> 
> ## Start of Example
> 
> # These are just to make the map
> 
> # easier for me to read. “M” is
> 
> # visually more dense than “o”.
> 
> M = ’ land ’  
> o = ’ water ’  
> world = [[o,o,o,o,o,o,o,o,o,o,o],  
> [o,o,o,o,M,M,o,o,o,o,o],  
> [o,o,o,o,o,o,o,o,M,M,M],  
> [o,o,o,M,o,o,o,o,o,M,o],  
> [o,o,o,M,o,M,M,o,o,o,o],  
> [o,o,o,o,M,M,M,M,o,o,o],  
> [o,o,o,M,M,M,M,M,M,M,o],  
> [o,o,o,M,M,o,M,M,M,o,o],  
> [o,o,o,o,o,o,M,M,o,o,o],  
> [M,M,o,o,o,M,o,o,o,o,o],  
> [o,o,o,o,o,o,o,o,o,o,o]]
> 
> def continent\_size world, x, y  
> if x \> 10 && y \> 10  
> size = 0  
> else  
> if world[x][y] != ’ land ’  
> return 0  
> end  
> end
> 
> # Either it ’ s water or we already
> 
> # counted it, but either way, we don ’ t
> 
> # want to count it now.
> 
> # So first we count this tile…
> 
> size = 1  
> world[x][y] = ’ counted land ’
> 
> # …then we count all of the
> 
> # neighboring eight tiles (and,
> 
> # of course, their neighbors by
> 
> # way of the recursion).
> 
> size = size + continent\_size(world, x-1, y-1)  
> size = size + continent\_size(world, x , y-1)  
> size = size + continent\_size(world, x+1, y-1)  
> size = size + continent\_size(world, x-1, y )  
> size = size + continent\_size(world, x+1, y )  
> size = size + continent\_size(world, x-1, y+1)  
> size = size + continent\_size(world, x , y+1)  
> size = size + continent\_size(world, x+1, y+1)  
> size  
> end
> 
> puts continent\_size(world, 5, 5)

---

<div class="post-metadata">

**Author:** ![jordantheous](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/a88e57/32.png) [@jordantheous](https://www.ruby-forum.com/u/jordantheous)\
**Post date:** [January 23, 2009, 10:39pm UTC](https://www.ruby-forum.com/t/elementary-array-question/158491/3 "2009-01-23T22:39:32Z")

</div>

On Jan 23, 8:34 pm, jordantheous [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> \*From Chris P., Learn to Program
> 
> Hey All –  
> In the below source code they array is called in the method as x, y,  
> but the “if” statements are looking to [y][x]. Can anyone explain to  
> me why they are switched? If you make them [x][y] it still outputs  
> the correct number (23).  
> Thanks in advance,  
> Jordan

What you’ve got there is an array of rows (rather than an actual 2D  
construct), so it’s normal that [y][x] first selects a row, then an  
element in that row.

Fred

---

<div class="post-metadata">

**Author:** ![jordantheous](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/a88e57/32.png) [@jordantheous](https://www.ruby-forum.com/u/jordantheous)\
**Post date:** [January 24, 2009, 6:46pm UTC](https://www.ruby-forum.com/t/elementary-array-question/158491/4 "2009-01-24T18:46:07Z")

</div>

Hey Fred,

Thanks for responding.

I was assuming that because of the line:

continent\_size world, x, y

x defined the row and y defined the array value within that row. Is  
that not true?

world[x][y] and world[y][x] only outputs the right value because 5, 5  
is right smack in the middle of the array of arrays. If you change it  
to 4, 3 and run it with world[x][y] and then try it with world[y][x]  
you get two different values. I’m still not sure why the code starts  
with x, y and then get’s switched to [y][x] (I’ve pasted the original  
below showing the [y][x] values. Am I just being dense?:

# These are just to make the map

# easier for me to read. “M” is

# visually more dense than “o”.

M = ’ land ’  
o = ’ water ’  
world = [[o,o,o,o,o,o,o,o,o,o,o],  
[o,o,o,o,M,M,o,o,o,o,o],  
[o,o,o,o,o,o,o,o,M,M,M],  
[o,o,o,M,o,o,o,o,o,M,o],  
[o,o,o,M,o,M,M,o,o,o,o],  
[o,o,o,o,M,M,M,M,o,o,o],  
[o,o,o,M,M,M,M,M,M,M,o],  
[o,o,o,M,M,o,M,M,M,o,o],  
[o,o,o,o,o,o,M,M,o,o,o],  
[M,M,o,o,o,M,o,o,o,o,o],  
[o,o,o,o,o,o,o,o,o,o,o]]

def continent\_size world, x, y  
if x \> 10 && y \> 10  
size = 0  
else  
if world[y][x] != ’ land ’  
return 0  
end  
end

# Either it ’ s water or we already

# counted it, but either way, we don ’ t

# want to count it now.

# So first we count this tile…

size = 1  
world[y][x] = ’ counted land ’

# …then we count all of the

# neighboring eight tiles (and,

# of course, their neighbors by

# way of the recursion).

size = size + continent\_size(world, x-1, y-1)  
size = size + continent\_size(world, x , y-1)  
size = size + continent\_size(world, x+1, y-1)  
size = size + continent\_size(world, x-1, y )  
size = size + continent\_size(world, x+1, y )  
size = size + continent\_size(world, x-1, y+1)  
size = size + continent\_size(world, x , y+1)  
size = size + continent\_size(world, x+1, y+1)  
size  
end

puts continent\_size(world, 5, 5)

On Jan 23, 1:38 pm, Frederick C. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)

---

<div class="post-metadata">

**Author:** ![jordantheous](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/a88e57/32.png) [@jordantheous](https://www.ruby-forum.com/u/jordantheous)\
**Post date:** [January 24, 2009, 7:10pm UTC](https://www.ruby-forum.com/t/elementary-array-question/158491/5 "2009-01-24T19:10:19Z")

</div>

On 24 Jan 2009, at 17:45, jordantheous wrote:

> that not true?
> 
> world[x][y] and world[y][x] only outputs the right value because 5, 5  
> is right smack in the middle of the array of arrays. If you change it  
> to 4, 3 and run it with world[x][y] and then try it with world[y][x]  
> you get two different values. I’m still not sure why the code starts  
> with x, y and then get’s switched to [y][x] (I’ve pasted the original  
> below showing the [y][x] values. Am I just being dense?:

The code is written so that 9,0 calculates the value for the point at  
the far right of the top row.  
You need to permute the values, since the first row is given by  
world[0], and the far right element is world[0][9]  
You could just not permute the x&y and say that the world must be  
specified as an array of columns rather than an array of rows but that  
would result in the map being less human readable.

Fred
