Help with array

Discussion in 'Ruby' started by Victor Reyes, May 5, 2008.

  1. Victor Reyes

    Victor Reyes Guest

    [Note: parts of this message were removed to make it a legal post.]

    Team,

    On my never ending saga to learn Ruby, I am trying to write a program to
    solve Sudoku puzzles.
    Given a multidimensional array (9x9) I am trying to inspect each row and
    each column as follows:

    Assume the following represents a typical row in my 9x9 array:

    *Row***

    23

    689

    7

    12345689

    1359

    9

    2468

    359

    235
    Row
    23
    689
    7
    12345689
    1359
    9
    2468
    359
    235
    Row

    23

    689

    7

    12345689

    1359

    9

    2468

    359

    235

    Row
    23
    689
    7
    12345689
    1359
    9
    2468
    359
    235
    Furthermore, assume the following is a typical column:

    *Column***

    23

    689

    7

    12345689

    1359

    9

    2468

    359

    235
    I would like to be able to count the frequency of each digit on either row
    or column, separate of course!

    *Number***

    1

    2

    3

    4

    5

    6

    7

    8

    9

    *Frequency***

    2

    4

    5

    2

    4

    3

    1

    3

    5

    I can do this with some ugly looking and probably inefficient loop. However,
    Ruby has so many tools and "tricks" that perhaps there might be some way of
    doing this quicker and easy to understand.

    Any help will be greatly appreciated!

    Thank you

    Victor
     
    Victor Reyes, May 5, 2008
    #1
    1. Advertising

  2. Victor Reyes

    Axel Etzold Guest

    -------- Original-Nachricht --------
    > Datum: Tue, 6 May 2008 04:06:01 +0900
    > Von: "Victor Reyes" <>
    > An:
    > Betreff: Help with array


    > Team,
    >
    > On my never ending saga to learn Ruby, I am trying to write a program to
    > solve Sudoku puzzles.
    > Given a multidimensional array (9x9) I am trying to inspect each row and
    > each column as follows:
    >
    > Assume the following represents a typical row in my 9x9 array:
    >
    > *Row***
    >
    > 23
    >
    > 689
    >
    > 7
    >
    > 12345689
    >
    > 1359
    >
    > 9
    >
    > 2468
    >
    > 359
    >
    > 235
    > Row
    > 23
    > 689
    > 7
    > 12345689
    > 1359
    > 9
    > 2468
    > 359
    > 235
    > Row
    >
    > 23
    >
    > 689
    >
    > 7
    >
    > 12345689
    >
    > 1359
    >
    > 9
    >
    > 2468
    >
    > 359
    >
    > 235
    >
    > Row
    > 23
    > 689
    > 7
    > 12345689
    > 1359
    > 9
    > 2468
    > 359
    > 235
    > Furthermore, assume the following is a typical column:
    >
    > *Column***
    >
    > 23
    >
    > 689
    >
    > 7
    >
    > 12345689
    >
    > 1359
    >
    > 9
    >
    > 2468
    >
    > 359
    >
    > 235
    > I would like to be able to count the frequency of each digit on either
    > row
    > or column, separate of course!
    >
    > *Number***
    >
    > 1
    >
    > 2
    >
    > 3
    >
    > 4
    >
    > 5
    >
    > 6
    >
    > 7
    >
    > 8
    >
    > 9
    >
    > *Frequency***
    >
    > 2
    >
    > 4
    >
    > 5
    >
    > 2
    >
    > 4
    >
    > 3
    >
    > 1
    >
    > 3
    >
    > 5
    >
    > I can do this with some ugly looking and probably inefficient loop.
    > However,
    > Ruby has so many tools and "tricks" that perhaps there might be some way
    > of
    > doing this quicker and easy to understand.
    >
    > Any help will be greatly appreciated!
    >
    > Thank you
    >
    > Victor


    Dear Victor,

    one nice feature of the Ruby list is its quiz contest.
    You can have a look at different solution proposals for solving
    Sudokus here:


    http://www.rubyquiz.com/quiz43.html

    Best regards,

    Axel
    --
    Der GMX SmartSurfer hilft bis zu 70% Ihrer Onlinekosten zu sparen!
    Ideal für Modem und ISDN: http://www.gmx.net/de/go/smartsurfer
     
    Axel Etzold, May 5, 2008
    #2
    1. Advertising

  3. Victor Reyes

    Victor Reyes Guest

    Axel,

    I will do so.

    Thank you

    Victor


    On 5/5/08, Axel Etzold <> wrote:
    >
    >
    > -------- Original-Nachricht --------
    > > Datum: Tue, 6 May 2008 04:06:01 +0900
    > > Von: "Victor Reyes" <>
    > > An:
    > > Betreff: Help with array

    >
    > > Team,
    > >
    > > On my never ending saga to learn Ruby, I am trying to write a program t=

    o
    > > solve Sudoku puzzles.
    > > Given a multidimensional array (9x9) I am trying to inspect each row an=

    d
    > > each column as follows:
    > >
    > > Assume the following represents a typical row in my 9x9 array:
    > >
    > > *Row***
    > >
    > > 23
    > >
    > > 689
    > >
    > > 7
    > >
    > > 12345689
    > >
    > > 1359
    > >
    > > 9
    > >
    > > 2468
    > >
    > > 359
    > >
    > > 235
    > > Row
    > > 23
    > > 689
    > > 7
    > > 12345689
    > > 1359
    > > 9
    > > 2468
    > > 359
    > > 235
    > > Row
    > >
    > > 23
    > >
    > > 689
    > >
    > > 7
    > >
    > > 12345689
    > >
    > > 1359
    > >
    > > 9
    > >
    > > 2468
    > >
    > > 359
    > >
    > > 235
    > >
    > > Row
    > > 23
    > > 689
    > > 7
    > > 12345689
    > > 1359
    > > 9
    > > 2468
    > > 359
    > > 235
    > > Furthermore, assume the following is a typical column:
    > >
    > > *Column***
    > >
    > > 23
    > >
    > > 689
    > >
    > > 7
    > >
    > > 12345689
    > >
    > > 1359
    > >
    > > 9
    > >
    > > 2468
    > >
    > > 359
    > >
    > > 235
    > > I would like to be able to count the frequency of each digit on eithe=

    r
    > > row
    > > or column, separate of course!
    > >
    > > *Number***
    > >
    > > 1
    > >
    > > 2
    > >
    > > 3
    > >
    > > 4
    > >
    > > 5
    > >
    > > 6
    > >
    > > 7
    > >
    > > 8
    > >
    > > 9
    > >
    > > *Frequency***
    > >
    > > 2
    > >
    > > 4
    > >
    > > 5
    > >
    > > 2
    > >
    > > 4
    > >
    > > 3
    > >
    > > 1
    > >
    > > 3
    > >
    > > 5
    > >
    > > I can do this with some ugly looking and probably inefficient loop.
    > > However,
    > > Ruby has so many tools and "tricks" that perhaps there might be some wa=

    y
    > > of
    > > doing this quicker and easy to understand.
    > >
    > > Any help will be greatly appreciated!
    > >
    > > Thank you
    > >
    > > Victor

    >
    > Dear Victor,
    >
    > one nice feature of the Ruby list is its quiz contest.
    > You can have a look at different solution proposals for solving
    > Sudokus here:
    >
    >
    > http://www.rubyquiz.com/quiz43.html
    >
    > Best regards,
    >
    > Axel
    > --
    > Der GMX SmartSurfer hilft bis zu 70% Ihrer Onlinekosten zu sparen!
    > Ideal f=FCr Modem und ISDN: http://www.gmx.net/de/go/smartsurfer
    >
    >
     
    Victor Reyes, May 6, 2008
    #3
  4. Victor Reyes

    Phrogz Guest

    On May 5, 1:06 pm, Victor Reyes <> wrote:
    > Given a multidimensional array (9x9) I am trying to inspect each row and
    > each column as follows:
    > I can do this with some ugly looking and probably inefficient loop. However,
    > Ruby has so many tools and "tricks" that perhaps there might be some way of
    > doing this quicker and easy to understand.


    I don't think there's any way to do this without looking at every
    cell. I was a little confused by your massive amount of text, so I
    assume you're saying that each cell has more than one number in it.
    (As occurs when writing down possibilities.)

    Following is a simple iteration that will go through every cell and,
    in a single pass, update the count of instances of a particular digit
    in each row and column. I've implemented the multiple-numbers-per-cell
    as an array per cell. If you have a string...well, don't do that,
    because it'd be silly. :)

    Hope this helps you with some insight into Ruby. As I'm offering this
    code up to a newbie to learn from, others please feel free to post
    followups ripping it apart and suggesting better ways to accomplish
    the same goals.

    # Create a 9x9 array, where each cell is an empty array
    cells = Array.new(9){
    Array.new(9){ [] }
    }

    # Fill each cell with dummy data (not sudoku-ready)
    # of zero or more integers
    cells.each{ |row|
    row.each{ |cell|
    1.upto(9){ |i|
    # 20% chance of each number in some cell leaves
    # us with a 13% chance of no numbers per cell.
    # There's thus a 99.999% chance that at least one
    # cell will be left empty (if my math is correct)
    cell << i if rand < 0.2
    }
    }
    }

    # Now run through all the cells and count numbers
    nums_by_row = Array.new(9){ Hash.new(0) }
    nums_by_col = Array.new(9){ Hash.new(0) }
    cells.each_with_index{ |row, row_num|
    row.each_with_index{ |cell, col_num|
    cell.each{ |num|
    nums_by_row[ row_num ][ num ] += 1
    nums_by_col[ col_num ][ num ] += 1
    }
    }
    }

    # Following output hand-formatted for clarity
    # Beware unfortunate line-wrapping

    p cells
    # [
    # [[1,3,6,7,9], [2,9], [1,8], [1,4], [1,6], [1], [7], [2,3,5,9],
    [8]],
    # [[2,3], [], [6,7], [5], [4,5,6,7,8,9], [2,5], [2,3,4], [7,9], []],
    # [[4], [3,4], [], [], [5,7], [1,2,5,6], [3,4], [2], [2,4,8]],
    # [[2,5], [7], [3,5,6,8,9], [], [3,7], [1,5,8], [1,2,4], [2], [3]],
    # [[4,5], [4,8], [6], [], [4], [], [9], [4,6], [7,8]],
    # [[3,4,6,9], [6], [9], [4,7], [2,9], [2,3,5,9], [4], [2,5,9], [9]],
    # [[8], [5], [2,7], [], [5], [6,7], [3,4,7,9], [4,5], [4,5,6]],
    # [[7,9], [], [], [2], [7,8,9], [3,7,9], [], [], [6,7]],
    # [[3], [5], [4,7], [1,2,5], [2,3,6,7,8], [1,3,5,8,9], [4,6], [],
    [5]]
    # ]

    p nums_by_row
    # [{1=>5, 2=>2, 3=>2, 4=>1, 5=>1, 6=>2, 7=>2, 8=>2, 9=>3},
    # { 2=>3, 3=>2, 4=>2, 5=>3, 6=>2, 7=>3, 8=>1, 9=>2},
    # {1=>1, 2=>3, 3=>2, 4=>4, 5=>2, 6=>1, 7=>1, 8=>1 },
    # {1=>2, 2=>3, 3=>3, 4=>1, 5=>3, 6=>1, 7=>2, 8=>2, 9=>1},
    # { 4=>4, 5=>1, 6=>2, 7=>1, 8=>2, 9=>1},
    # { 2=>3, 3=>2, 4=>3, 5=>2, 6=>2, 7=>1, 9=>6},
    # { 2=>1, 3=>1, 4=>3, 5=>4, 6=>2, 7=>3, 8=>1, 9=>1},
    # { 2=>1, 3=>1, 6=>1, 7=>4, 8=>1, 9=>3},
    # {1=>2, 2=>2, 3=>3, 4=>2, 5=>4, 6=>2, 7=>2, 8=>2, 9=>1}]

    p nums_by_col
    # [{1=>1, 2=>2, 3=>4, 4=>3, 5=>2, 6=>2, 7=>2, 8=>1, 9=>3},
    #  { 2=>1, 3=>1, 4=>2, 5=>2, 6=>1, 7=>1, 8=>1, 9=>1},
    #  {1=>1, 2=>1, 3=>1, 4=>1, 5=>1, 6=>3, 7=>3, 8=>2, 9=>2},
    #  {1=>2, 2=>2, 4=>2, 5=>2, 7=>1 },
    #  {1=>1, 2=>2, 3=>2, 4=>2, 5=>3, 6=>3, 7=>5, 8=>3, 9=>3},
    #  {1=>4, 2=>3, 3=>3, 5=>5, 6=>2, 7=>2, 8=>2, 9=>3},
    #  {1=>1, 2=>2, 3=>3, 4=>6, 6=>1, 7=>2, 9=>2},
    #  {2=>4, 3=>1, 4=>2, 5=>3, 6=>1, 7=>1, 9=>3},
    #  {2=>1, 3=>1, 4=>2, 5=>2, 6=>2, 7=>2, 8=>3, 9=>1}]
     
    Phrogz, May 6, 2008
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    4
    Views:
    13,421
    Old Wolf
    Aug 13, 2004
  2. Eric Boutin
    Replies:
    7
    Views:
    450
  3. Mara Guida

    const and array of array (of array ...)

    Mara Guida, Sep 2, 2009, in forum: C Programming
    Replies:
    3
    Views:
    497
    David RF
    Sep 3, 2009
  4. Tom
    Replies:
    3
    Views:
    215
    salsablr
    Dec 20, 2004
  5. Tuan  Bui
    Replies:
    14
    Views:
    479
    it_says_BALLS_on_your forehead
    Jul 29, 2005
Loading...

Share This Page