http://www.perlmonks.org?node_id=1050733


in reply to Table shuffling challenge

I would advise to avoid actually removing elements.

Instead have multidimensional hash of column and row.

You can use this multidimensional hash to record

whether a given index has already been supplied before.

Note the use of a closure to make the function stateful.

That is the reason for the reset_hash function.

You must be able to reset the hash for another run.

## just a sketch my %columns; ## to associate columns with ## column numbers # ## $columns{1} should return ## a reference to the ## first column list { ## closure cleanliness my $seen; ## keeps track of what we have seen ## used to reset hash within closure between runs sub reset_hash{ undef $seen } ##function expects column number sub find_and_dont_actually_remove_but_say_we_did{ my $column_number = shift; my $column = $columns{$column_number}; ## keeping as a referen +ce to ## avoid obscene copy-p +asta my $rand; until (not $seen->{$column_number}->{$rand = int(rand(@$column +))}){ ## nothing to see here } $seen->{$column_number}->{$rand} = "looks familiar"; return $column->[$rand] } }

Replies are listed 'Best First'.
Re^2: Table shuffling challenge
by protist (Monk) on Aug 23, 2013 at 21:02 UTC

    Ah just noticed you need to do this UNTIL EMPTY.

    My method could be inefficient then as it may take

    forever to guess the last few indices. There are

    many other approaches, but I am going to lunch soon. :D