From: Victor Reyes Date: 2008-04-30T20:44:51+09:00 Subject: Re: Getting array index for non-zero elements ------=_Part_864_3489554.1209555891013 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Content-Disposition: inline Hi Team, First, thank you for all your replies. I truly appreciate each and everyone of them! Generally speaking I have problems explaining in writing an idea or what I intent to do. But, let me try to explain what I would like to do. I am trying to implement a sudoku algorithm. Given an initial set of values which I represent as the following example: @ga = [ [0,0,0,0,1,9,0,4,0], [0,0,4,8,0,0,6,0,0], [7,5,0,0,0,0,0,0,2], [0,9,0,1,0,2,0,0,4], [0,0,0,0,0,3,0,0,0], [5,0,0,4,0,6,0,3,0], [8,0,0,0,0,0,0,7,3], [0,0,6,0,0,8,4,0,0], [0,1,0,2,9,0,0,0,0] ] I use the above array to propagate the given values to a "master" array which contains ALL the ORIGINAL valid and possible entries for a location. At the start all numbers from 1..9: @aa = [ [123456789,123456789,123456789,123456789,123456789,123456789,123456789,123456789,123456789], [123456789,123456789,123456789,123456789,123456789,123456789,123456789,123456789,123456789], [123456789,123456789,123456789,123456789,123456789,123456789,123456789,123456789,123456789], [123456789,123456789,123456789,123456789,123456789,123456789,123456789,123456789,123456789], [123456789,123456789,123456789,123456789,123456789,123456789,123456789,123456789,123456789], [123456789,123456789,123456789,123456789,123456789,123456789,123456789,123456789,123456789], [123456789,123456789,123456789,123456789,123456789,123456789,123456789,123456789,123456789], [123456789,123456789,123456789,123456789,123456789,123456789,123456789,123456789,123456789], [123456789,123456789,123456789,123456789,123456789,123456789,123456789,123456789,123456789] ] But I don't want to propagate the zeroes (0) from the given array. I use zeroes (0) for convenience only. So, for instance, from the given array please notice that there is a one (1) at location @ga = [0][4]. Knowing the index of that non-zero value (1 in this case) I would then use the same index on the so called master array to place the 1. I will then proceed to eliminate all the ones (1) from the same row and column, since, as I am sure you know, the rule of sudoku only allows a particular number once in a given row and column. Well, that's why I need the index, so I can a bit easier manipulate the arrays and their contents. Again, thank you for all your help. Victor On Tue, Apr 29, 2008 at 4:37 PM, David A. Black wrote: > Hi -- > > > On Wed, 30 Apr 2008, Siep Korteling wrote: > > Rob Biedenharn wrote: > > > > > On Apr 29, 2008, at 3:46 PM, Victor Reyes wrote: > > > > > > [5,0,0,4,0,6,0,3,0], > > > > # Output: 0 0 0 0 1 9 0 4 0 > > > > puts > > > > nonzeroIndex > > > > # > > > > Output: *nil* > > > > > > > > Any help will be greatly appreciated, as usual! > > > > > > > > Thank you > > > > > > > > Victor > > > > > > > > > > > > > > > > irb> require 'code/ruby/ext/enumerable.rb' > > > => true > > > irb> @ga[0] > > > => [0, 0, 0, 0, 1, 9, 0, 4, 0] > > > irb> @ga[0].map_with_index {|e,i| e.zero? ? nil : i} > > > => [nil, nil, nil, nil, 4, 5, nil, 7, nil] > > > irb> @ga[0].map_with_index {|e,i| e.zero? ? nil : i}.compact > > > => [4, 5, 7] > > > > > > Then you just need Enumerable#map_with_index > > > > > > module Enumerable > > > # Like each_with_index, but the value is the array of block results. > > > def map_with_index > > > a = [] > > > each_with_index { |e,i| a << yield(e, i) } > > > a > > > end > > > end > > > > > > -Rob > > > > > > Rob Biedenharn http://agileconsultingllc.com > > > Rob@AgileConsultingLLC.com > > > > > > > It works without the 'require' here.(VERSION=1.8.6). I like the > > map_with_index method (new for me), but isn't it overkill here? > > > > @ga.each do |sub_arr| > > sub_arr.each_with_index do |value,index| > > print index.to_s + " " unless value == 0 > > end > > puts > > end > > > > If all you need is side-effects, like printing, then you can used > #each (with_ or without index). #map_with_index, like #map itself, > returns a second collection. > > > David > > -- > Rails training from David A. Black and Ruby Power and Light: > INTRO TO RAILS June 9-12 Berlin > ADVANCING WITH RAILS June 16-19 Berlin > INTRO TO RAILS June 24-27 London (Skills Matter) > See http://www.rubypal.com for details and updates! > > ------=_Part_864_3489554.1209555891013--